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 "BWP-UplinkDedicated.h"
76 #include "PUSCH-ServingCellConfig.h"
77 #include "UplinkConfig.h"
78 #include "PDSCH-ServingCellConfig.h"
79 #include "EUTRANQoS.h"
80 #include "GBR-QosInformation.h"
81 #include "DRBs-ToBeSetupMod-List.h"
82 #include "DRBs-ToBeSetupMod-Item.h"
84 /* MACRO for CUtoDURRCInformation */
86 #define FREQ_DOM_RSRC_SIZE 6
87 #define CORESET0_END_PRB 48
88 #define CORESET1_NUM_PRB 24
89 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
90 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
91 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
92 #define PDCCH_SRCH_SPC_TWO_ID 2
94 #define SCRAMBLING_ID NR_PCI
95 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
96 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
97 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
98 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
99 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
100 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
101 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
102 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
103 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
105 /* MACRO Ddefine for PDSCH Configuration */
107 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
108 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
109 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
110 #define PDSCH_NUM_HARQ_PROC 5
111 #define PDSCH_MAPPING_TYPE_A 0
112 #define PDSCH_MAPPING_TYPE_B 1
114 /* MACRO Define for PUSCH Configuration */
117 #define PUSCH_MSG3_DELTA_PREAMBLE 0
118 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
119 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
120 #define PUSCH_MAX_MIMO_LAYERS 1
121 #define PUSCH_PROCESS_TYPE2_ENABLED false
122 #define PUSCH_MAPPING_TYPE_A 0
123 #define PUSCH_MAPPING_TYPE_B 1
125 /* MACRO defines for SRC config */
126 #define SRS_RSRC_ID 1
127 #define SRS_RSET_ID 1
128 #define SRS_COMB_OFFSET_N2 0
129 #define SRS_CYCLIC_SHIFT_N2 0
130 #define SRS_FREQ_DOM_POS 0
131 #define SRS_FREQ_DOM_SHIFT 0
136 #define APERIODIC_SRS_RESRC_TRIGGER 1
138 /* Macro definitions for DUtoCuRrcContainer */
139 #define CELL_GRP_ID 1
141 #define SR_PROHIBIT_TMR 5
142 #define SR_TRANS_MAX 2
143 #define PERIODIC_BSR_TMR 2
144 #define RETX_BSR_TMR 5
145 #define SR_DELAY_TMR 6
147 #define TIME_ALIGNMENT_TMR 7
148 #define PHR_PERIODIC_TMR 7
149 #define PHR_PROHIBHIT_TMR 0
150 #define PHR_PWR_FACTOR_CHANGE 3
151 #define PHR_MODE_OTHER_CG 0
154 #define SN_FIELD_LEN 0
155 #define T_POLL_RETRANSMIT 8
158 #define MAX_RETX_THRESHOLD 5
159 #define T_REASSEMBLY 8
160 #define T_STATUS_PROHIBHIT 7
161 #define MAC_LC_PRIORITY 1
162 #define PRIORTISIED_BIT_RATE 15
163 #define BUCKET_SIZE_DURATION 5
166 #define PDSCH_HARQ_ACK_CODEBOOK 1
167 #define SERV_CELL_IDX 0
168 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
169 #define ACTIVE_DL_BWP_ID 0
170 #define ACTIVE_UL_BWP_ID 0
171 #define SCRAMBLING_ID NR_PCI
172 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
173 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
174 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
175 /*******************************************************************
177 * @brief Sends F1 msg over SCTP
181 * Function : SendF1APMsg
183 * Functionality: Sends F1 msg over SCTP
185 * @params[in] Region region
187 * @return ROK - success
190 * ****************************************************************/
191 S16 SendF1APMsg(Region region, Pool pool)
193 Buffer *mBuf = NULLP;
195 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
197 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
199 ODU_PRINT_MSG(mBuf, 0,0);
201 if(sctpSend(mBuf) != ROK)
203 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
204 ODU_PUT_MSG_BUF(mBuf);
210 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
211 ODU_PUT_MSG_BUF(mBuf);
214 ODU_PUT_MSG_BUF(mBuf);
218 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
225 /*******************************************************************
227 * @brief Builds NRCell ID
231 * Function : BuildNrCellId
233 * Functionality: Building the NR Cell ID
235 * @params[in] BIT_STRING_t *nrcell
236 * @return ROK - success
239 * ****************************************************************/
241 S16 BuildNrCellId(BIT_STRING_t *nrcell)
243 memset(nrcell->buf, 0, nrcell->size);
245 nrcell->bits_unused = 4;
246 nrcell->size = 5 * sizeof(uint8_t);
250 /********************************************************************
252 * @brief Builds and sends the F1SetupResponse
256 * Function : BuildAndSendF1SetupRsp
258 * Functionality: Constructs the F1SetupResponse message and sends
259 * it back to the DU through SCTP.
261 * @params[in] void **buf,Buffer to which encoded pattern is written into
262 * @params[in] int *size,size of buffer
264 * @return ROK - success
267 * ****************************************************************/
268 S16 BuildAndSendF1SetupRsp()
271 uint8_t elementCnt,cellCnt;
272 F1AP_PDU_t *f1apMsg = NULL;
273 F1SetupResponse_t *f1SetupRsp;
274 GNB_CU_Name_t *cuName;
275 Cells_to_be_Activated_List_t *cellToActivate;
276 RRC_Version_t *rrcVer;
277 asn_enc_rval_t encRetVal;
278 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
280 /* Allocate the memory for F1SetupRequest_t */
281 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
284 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
287 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
289 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
290 if(f1apMsg->choice.successfulOutcome == NULLP)
292 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
293 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
297 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
298 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
299 f1apMsg->choice.successfulOutcome->value.present = \
300 SuccessfulOutcome__value_PR_F1SetupResponse;
301 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
304 f1SetupRsp->protocolIEs.list.count = elementCnt;
305 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
307 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
308 elementCnt * sizeof(F1SetupResponseIEs_t *));
309 if(f1SetupRsp->protocolIEs.list.array == NULLP)
311 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
312 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
313 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
317 for(idx=0; idx<elementCnt; idx++)
319 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
320 sizeof(F1SetupResponseIEs_t));
321 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
323 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
324 elementCnt * sizeof(F1SetupResponseIEs_t *));
325 CU_FREE(f1apMsg->choice.successfulOutcome, \
326 sizeof(SuccessfulOutcome_t));
327 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
334 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
335 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
336 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
337 F1SetupResponseIEs__value_PR_TransactionID;
338 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
343 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
344 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
345 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
346 F1SetupResponseIEs__value_PR_GNB_CU_Name;
347 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
348 cuName->size = sizeof(cuCfgParams.cuName);
350 CU_ALLOC(cuName->buf, sizeof(cuName->size));
351 if(cuName->buf == NULLP)
353 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
355 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
356 sizeof(F1SetupResponseIEs_t));
358 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
359 elementCnt * sizeof(F1SetupResponseIEs_t *));
360 CU_FREE(f1apMsg->choice.successfulOutcome,\
361 sizeof(SuccessfulOutcome_t));
362 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
365 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
367 /*Cells to be activated list*/
369 f1SetupRsp->protocolIEs.list.array[idx]->id = \
370 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
371 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
372 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
373 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
374 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
375 Cells_to_be_Activated_List;
377 cellToActivate->list.count = cellCnt;
378 cellToActivate->list.size = \
379 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
380 CU_ALLOC(cellToActivate->list.array,\
381 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
382 if(cellToActivate->list.array == NULLP)
384 CU_FREE(cuName->buf, sizeof(cuName->size));
385 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
387 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
388 sizeof(F1SetupResponseIEs_t));
390 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
391 elementCnt * sizeof(F1SetupResponseIEs_t *));
392 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
393 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
396 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
398 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
399 if(cellToActivate->list.array[ieIdx] == NULLP)
401 CU_FREE(cellToActivate->list.array,\
402 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
403 CU_FREE(cuName->buf, sizeof(cuName->size));
404 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
406 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
407 sizeof(F1SetupResponseIEs_t));
409 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
410 elementCnt * sizeof(F1SetupResponseIEs_t *));
411 CU_FREE(f1apMsg->choice.successfulOutcome, \
412 sizeof(SuccessfulOutcome_t));
413 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
417 cellToActivate->list.array[0]->id = \
418 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
419 cellToActivate->list.array[0]->criticality = Criticality_ignore;
420 cellToActivate->list.array[0]->value.present = \
421 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
422 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
423 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
424 CU_ALLOC(cellToActivate->list.array[0]->\
425 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
427 if(cellToActivate->list.array[0]->value.choice.\
428 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
431 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
433 CU_FREE(cellToActivate->list.array[ieIdx],\
434 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
437 CU_FREE(cellToActivate->list.array,\
438 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
439 CU_FREE(cuName->buf, sizeof(cuName->size));
440 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
442 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
443 sizeof(F1SetupResponseIEs_t));
445 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
446 elementCnt * sizeof(F1SetupResponseIEs_t *));
447 CU_FREE(f1apMsg->choice.successfulOutcome, \
448 sizeof(SuccessfulOutcome_t));
449 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
452 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
453 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
454 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
455 nRCGI.nRCellIdentity.size = 5;
456 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
457 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
459 if(cellToActivate->list.array[0]->value.choice.\
460 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
462 CU_FREE(cellToActivate->list.array[0]->\
463 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
465 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
467 CU_FREE(cellToActivate->list.array[ieIdx],\
468 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
471 CU_FREE(cellToActivate->list.array,\
472 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
473 CU_FREE(cuName->buf, sizeof(cuName->size));
474 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
476 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
477 sizeof(F1SetupResponseIEs_t));
479 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
480 elementCnt * sizeof(F1SetupResponseIEs_t *));
481 CU_FREE(f1apMsg->choice.successfulOutcome, \
482 sizeof(SuccessfulOutcome_t));
483 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
486 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
489 f1SetupRsp->protocolIEs.list.array[idx]->id = \
490 ProtocolIE_ID_id_GNB_CU_RRC_Version;
491 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
492 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
493 F1SetupResponseIEs__value_PR_RRC_Version;
494 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
495 rrcVer->latest_RRC_Version.size = RRC_SIZE;
497 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
498 if(rrcVer->latest_RRC_Version.buf == NULLP)
500 CU_FREE(cuName->buf, sizeof(cuName->size));
501 for(ieIdx=0; ieIdx<elementCnt; idx++)
503 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
504 sizeof(F1SetupResponseIEs_t));
506 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
507 elementCnt * sizeof(F1SetupResponseIEs_t *));
508 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
509 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
513 /* Need to check RRC Version */
514 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
515 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
516 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
517 if(rrcVer->iE_Extensions == NULLP)
519 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
520 CU_FREE(cuName->buf, sizeof(cuName->size));
521 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
523 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
524 sizeof(F1SetupResponseIEs_t));
526 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
527 elementCnt * sizeof(F1SetupResponseIEs_t *));
528 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
529 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
532 rrcVer->iE_Extensions->list.count = 1;
533 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
534 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
535 sizeof(struct RRC_Version_ExtIEs *));
536 if(rrcVer->iE_Extensions->list.array == NULLP)
538 CU_FREE(rrcVer->iE_Extensions,\
539 sizeof(ProtocolExtensionContainer_4624P81_t));
540 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
541 CU_FREE(cuName->buf, sizeof(cuName->size));
542 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
544 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
545 sizeof(F1SetupResponseIEs_t));
547 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
548 elementCnt * sizeof(F1SetupResponseIEs_t *));
549 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
550 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
553 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
554 sizeof(struct RRC_Version_ExtIEs));
555 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
557 CU_FREE(rrcVer->iE_Extensions->list.array,\
558 sizeof(struct RRC_Version_ExtIEs *));
559 CU_FREE(rrcVer->iE_Extensions,\
560 sizeof(ProtocolExtensionContainer_4624P81_t));
561 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
562 CU_FREE(cuName->buf, sizeof(cuName->size));
563 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
565 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
566 sizeof(F1SetupResponseIEs_t));
568 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
569 elementCnt * sizeof(F1SetupResponseIEs_t *));
570 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
571 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
574 rrcVer->iE_Extensions->list.array[0]->id = \
575 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
576 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
577 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
578 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
579 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
580 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
581 CU_ALLOC(rrcVer->iE_Extensions->list.\
582 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
584 if(rrcVer->iE_Extensions->list.\
585 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
587 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
588 sizeof(struct RRC_Version_ExtIEs));
589 CU_FREE(rrcVer->iE_Extensions->list.array,\
590 sizeof(struct RRC_Version_ExtIEs *));
591 CU_FREE(rrcVer->iE_Extensions,\
592 sizeof(ProtocolExtensionContainer_4624P81_t));
593 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
594 CU_FREE(cuName->buf, sizeof(cuName->size));
595 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
597 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
598 sizeof(F1SetupResponseIEs_t));
600 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
601 elementCnt * sizeof(F1SetupResponseIEs_t *));
602 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
603 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
606 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
607 Latest_RRC_Version_Enhanced.buf[0] = 0;
608 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
609 Latest_RRC_Version_Enhanced.buf[1] = 5;
610 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
611 Latest_RRC_Version_Enhanced.buf[2] = 15;
613 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
615 /* Encode the F1SetupRequest type as UPER */
616 memset(encBuf, 0, ENC_BUF_MAX_LEN);
618 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
621 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
622 CU_FREE(cuName->buf, sizeof(cuName->size));
623 for(idx=0; idx<elementCnt; idx++)
625 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
627 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
628 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
629 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
631 /* Check encode results */
632 if(encRetVal.encoded == ENCODE_FAIL)
634 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
635 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
640 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
641 for(int i=0; i< encBufSize; i++)
643 DU_LOG("%x",encBuf[i]);
648 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
650 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
655 }/* End of BuildAndSendF1SetupRsp */
657 /*******************************************************************
659 * @brief Builds and sends the DUUpdateAcknowledge
663 * Function : BuildAndSendDUUpdateAck
665 * Functionality: Constructs the DU Update Acknowledge message and sends
666 * it to the DU through SCTP.
670 * @return ROK - success
673 * ****************************************************************/
675 S16 BuildAndSendDUUpdateAck()
679 F1AP_PDU_t *f1apMsg = NULL;
680 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
681 asn_enc_rval_t enRetVal; /* Encoder return value */
683 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
685 /* Allocate the memory for F1SetupRequest_t */
686 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
689 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
693 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
695 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
696 if(f1apMsg->choice.successfulOutcome == NULLP)
698 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
699 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
703 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
704 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
705 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
706 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
709 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
710 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
712 /* Initialize the F1Setup members */
713 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
714 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
716 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
717 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
718 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
722 for(idx=0; idx<elementCnt; idx++)
724 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
725 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
727 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
728 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
729 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
736 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
737 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
738 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
739 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
740 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
742 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
744 /* Encode the F1SetupRequest type as UPER */
745 memset(encBuf, 0, ENC_BUF_MAX_LEN);
747 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
750 for(idx=0; idx<elementCnt; idx++)
752 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
754 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
755 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
756 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
758 /* Checking encode results */
759 if(enRetVal.encoded == ENCODE_FAIL)
761 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
762 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
767 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
768 for(int i=0; i< encBufSize; i++)
770 DU_LOG("%x",encBuf[i]);
775 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
777 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
783 }/* End of BuildAndSendDUUpdateAck*/
784 /*******************************************************************
786 * @brief deallocating the memory of F1reset msg
790 * Function : FreeF1ResetReq
793 * - freeing memory of F1reset request msg
799 * ****************************************************************/
800 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
803 Reset_t *f1ResetMsg = NULLP;
807 if(f1apMsg->choice.initiatingMessage)
809 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
810 if(f1ResetMsg->protocolIEs.list.array)
812 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
814 if(f1ResetMsg->protocolIEs.list.array[idx])
816 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
819 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
821 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
823 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
826 /*******************************************************************
828 * @brief build ansld ans send f1reset msg
832 * Function : BuildAndSendF1ResetReq
834 * Functionality: build and send f1reset msg
836 * @return ROK - success
839 * ****************************************************************/
840 uint8_t BuildAndSendF1ResetReq()
842 uint8_t elementCnt=0;
844 uint8_t ret= RFAILED;
845 Reset_t *f1ResetMsg = NULLP;
846 F1AP_PDU_t *f1apMsg = NULLP;
847 asn_enc_rval_t encRetVal;
848 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
851 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
854 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
857 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
858 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
859 if(f1apMsg->choice.initiatingMessage == NULLP)
861 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
864 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
865 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
866 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
868 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
871 f1ResetMsg->protocolIEs.list.count = elementCnt;
872 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
874 /* Initialize the F1Reset members */
875 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
876 if(f1ResetMsg->protocolIEs.list.array == NULLP)
878 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
881 for(idx=0; idx<elementCnt; idx++)
883 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
884 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
886 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
893 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
894 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
895 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
896 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
900 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
901 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
902 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
903 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
908 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
909 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
910 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
911 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
912 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
914 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
916 /* Encode the F1SetupRequest type as APER */
917 memset(encBuf, 0, ENC_BUF_MAX_LEN);
919 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
923 if(encRetVal.encoded == ENCODE_FAIL)
925 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
926 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
931 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
932 for(idx=0; idx< encBufSize; idx++)
934 DU_LOG("%x",encBuf[idx]);
938 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
940 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
948 FreeF1ResetReq(f1apMsg);
952 /*******************************************************************
954 * @brief Fills Radio Bearer Config
958 * Function : fillSrbCfg
960 * Functionality: Fills Radio Bearer Config
962 * @params[in] SRB_ToAddModList *
964 * @return ROK - success
967 * ****************************************************************/
968 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
972 if(bearerCfg != NULLP)
975 bearerCfg->list.count = elementCnt;
976 bearerCfg->list.size =\
977 elementCnt * sizeof(SRB_ToAddMod_t *);
978 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
979 if(bearerCfg->list.array != NULLP)
981 for(idx = 0; idx < elementCnt; idx++)
983 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
984 if(bearerCfg->list.array[idx] == NULLP)
986 for(ieId = 0; ieId < idx; ieId++)
988 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
990 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1000 bearerCfg->list.array[idx]->srb_Identity = srbId;
1005 /*******************************************************************
1007 * @brief Fills Master CellGroup Info
1011 * Function : fillMasterCellGroup
1013 * Functionality: Fills Master Cell Group IE
1015 * @params[in] RRCSetup_IEs_t *
1017 * @return ROK - success
1020 * ****************************************************************/
1022 uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
1025 masterCellGroup->buf = NULLP;
1026 if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
1028 masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
1029 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1030 if(masterCellGroup->buf != NULLP)
1032 memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
1033 masterCellGroup->size);
1047 /*******************************************************************
1049 * @brief Fills RRC setup IE
1053 * Function : fillRRCSetupIE
1055 * Functionality: Fills RRC Setup IE
1057 * @params[in] RRCSetup_IEs_t *
1059 * @return ROK - success
1062 * ****************************************************************/
1064 uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
1069 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1070 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1072 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1076 ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
1080 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1086 /*******************************************************************
1088 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1092 * Function : fillDlCcchRrcMsg
1094 * Functionality: Fills DL DCCCH Message required for
1095 * DLRRCMessageTransfer
1097 * @params[in] RRCContainer_t *rrcContainer
1099 * @return ROK - success
1102 * ****************************************************************/
1104 uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
1108 DL_CCCH_Message_t dl_CCCH_Msg;
1109 asn_enc_rval_t encRetVal;
1111 if(rrcContainer != NULLP)
1113 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1115 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1116 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1118 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1119 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1120 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1122 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1123 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1124 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1125 /* Fill RRC Setup IE */
1126 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1127 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1128 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1129 criticalExtensions.choice.rrcSetup != NULLP)
1131 ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1132 criticalExtensions.choice.rrcSetup);
1136 /* encode DL-CCCH message into RRC Container */
1137 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1138 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1140 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1141 /* Encode results */
1142 if(encRetVal.encoded == ENCODE_FAIL)
1144 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1145 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1150 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1151 for(int i = 0; i< encBufSize; i++)
1153 DU_LOG("%x",encBuf[i]);
1155 rrcContainer->size = encBufSize;
1156 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1157 if(rrcContainer->buf != NULLP)
1159 memset(rrcContainer->buf, 0, encBufSize);
1160 for(idx2 = 0; idx2 < encBufSize; idx2++)
1162 rrcContainer->buf[idx2] = encBuf[idx2];
1174 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1180 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1186 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1192 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1197 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1199 uint8_t idx, ied, elementCnt;
1202 qosFlow->list.count = elementCnt;
1203 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1204 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1205 if(qosFlow->list.array != NULLP)
1207 for(idx = 0; idx < elementCnt; idx++)
1209 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1210 if(qosFlow->list.array[idx] == NULLP)
1212 for(ied = 0; ied < idx; ied++)
1214 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1216 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1222 *qosFlow->list.array[idx] = 9;
1226 /*******************************************************************
1228 * @brief Fills CN Assoc for Drb to Add/Mod List
1232 * Function : fillCnAssoc
1234 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1236 * @params[in] struct DRB_ToAddMod__cnAssociation *
1238 * @return ROK - success
1241 * ****************************************************************/
1243 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1247 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1248 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1250 cnAssoc->choice.eps_BearerIdentity = 5;
1252 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1254 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1255 if(cnAssoc->choice.sdap_Config)
1257 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1258 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1259 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1260 cnAssoc->choice.sdap_Config->defaultDRB = true;
1261 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1262 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1263 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1264 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1265 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1267 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1271 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1272 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1278 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1285 /*******************************************************************
1287 * @brief Fills Radio Bearer Config for Drb
1291 * Function : fillDrbCfg
1293 * Functionality: Fills Radio Bearer Config for Drb
1295 * @params[in] drbId, DRB_ToAddModList *
1297 * @return ROK - success
1300 * ****************************************************************/
1301 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1303 uint8_t idx, ied, ret, elementCnt;
1309 drbCfg->list.count = elementCnt;
1310 drbCfg->list.size =\
1311 elementCnt * sizeof(DRB_ToAddMod_t *);
1312 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1313 if(drbCfg->list.array != NULLP)
1315 for(idx = 0; idx < elementCnt; idx++)
1317 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1318 if(drbCfg->list.array[idx] == NULLP)
1320 for(ied = 0; ied < idx; ied++)
1322 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1324 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1334 /* CN ASSOCIATION */
1335 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1336 if(drbCfg->list.array[idx]->cnAssociation)
1338 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1341 drbCfg->list.array[idx]->drb_Identity = drbId;
1346 /*******************************************************************
1348 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1352 * Function : fillRrcReconfigIE
1354 * Functionality: Fills RRC Reconfig Message required for
1355 * DLRRCMessageTransfer
1357 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1359 * @return ROK - success
1362 * ****************************************************************/
1364 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1367 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1368 if(rrcReconfigMsg->radioBearerConfig)
1370 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1371 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1373 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1378 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1379 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1381 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1384 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1385 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1386 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1392 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1393 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1399 /*******************************************************************
1401 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1405 * Function : fillDlDcchRrcMsg
1407 * Functionality: Fills DL DCCH Message required for
1408 * DLRRCMessageTransfer
1410 * @params[in] RRCContainer_t *rrcContainer
1412 * @return ROK - success
1415 * ****************************************************************/
1417 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1421 DL_DCCH_Message_t dl_DCCH_Msg;
1422 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1423 asn_enc_rval_t encRetVal;
1425 if(rrcContainer != NULLP)
1427 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1429 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1430 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1432 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1433 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1434 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1436 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1437 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1438 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1439 /* Fill RRC Reconfig IE */
1440 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1441 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1442 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1443 criticalExtensions.choice.rrcReconfiguration != NULLP)
1445 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1446 criticalExtensions.choice.rrcReconfiguration);
1450 /* encode DL-DCCH message into RRC Container */
1451 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1452 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1454 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1455 /* Encode results */
1456 if(encRetVal.encoded == ENCODE_FAIL)
1458 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1459 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1464 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1465 for(int i = 0; i< encBufSize; i++)
1467 DU_LOG("%x",encBuf[i]);
1469 rrcContainer->size = encBufSize;
1470 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1471 if(rrcContainer->buf != NULLP)
1473 memset(rrcContainer->buf, 0, encBufSize);
1474 for(idx2 = 0; idx2 < encBufSize; idx2++)
1476 rrcContainer->buf[idx2] = encBuf[idx2];
1483 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1488 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1494 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1500 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1506 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1512 /*******************************************************************
1514 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1518 * Function : BuildDLRRCContainer
1520 * Functionality: Builds RRC Container IE required for
1521 * DLRRCMessageTransfer
1525 * @return ROK - success
1528 * ****************************************************************/
1530 uint8_t BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1532 uint8_t ret, bufLen;
1535 if(rrcMsgType == RRC_SETUP)
1537 ret = fillDlCcchRrcMsg(ueId, rrcContainer);
1539 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1541 else if(rrcMsgType == REGISTRATION_ACCEPT)
1543 /*Hardcoded RRC Container from reference logs*/
1544 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1546 rrcContainer->size = bufLen;
1547 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1548 if(rrcContainer->buf != NULLP)
1550 memset(rrcContainer->buf, 0, bufLen);
1551 memcpy(rrcContainer->buf, buf, bufLen);
1554 else if(rrcMsgType == RRC_RECONFIG)
1556 /*Hardcoded RRC Container from reference logs*/
1558 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1559 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1560 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1561 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1562 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1563 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1564 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1565 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1566 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1567 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1568 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1569 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1570 0x00, 0x00, 0x00, 0x00};
1572 rrcContainer->size = bufLen;
1573 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1574 if(rrcContainer->buf != NULLP)
1576 memset(rrcContainer->buf, 0, bufLen);
1577 memcpy(rrcContainer->buf, buf, bufLen);
1584 /*******************************************************************
1586 * @brief Builds and sends the DLRRCMessageTransfer
1590 * Function : BuildAndSendDLRRCMessageTransfer
1592 * Functionality: Constructs the DL RRC Message Transfer and sends
1593 * it to the CU through SCTP.
1597 * @return ROK - success
1600 * ****************************************************************/
1601 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
1603 uint8_t elementCnt = 0;
1606 F1AP_PDU_t *f1apMsg = NULLP;
1607 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1608 asn_enc_rval_t encRetVal; /* Encoder return value */
1610 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1612 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1613 if(f1apMsg == NULLP)
1615 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1619 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1620 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1621 sizeof(InitiatingMessage_t));
1622 if(f1apMsg->choice.initiatingMessage == NULLP)
1624 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1625 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1629 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1630 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1631 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1632 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1635 dlRRCMsg->protocolIEs.list.count = elementCnt;
1636 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1638 /* Initialize the F1Setup members */
1639 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1640 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1642 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1643 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1644 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1648 for(idx=0; idx<elementCnt; idx++)
1650 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1651 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1653 for(ieId=0; ieId<idx; ieId++)
1655 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1656 sizeof(DLRRCMessageTransferIEs_t));
1658 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1659 dlRRCMsg->protocolIEs.list.size);
1660 CU_FREE(f1apMsg->choice.initiatingMessage,\
1661 sizeof(InitiatingMessage_t));
1662 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1667 /* GNB CU UE F1AP ID */
1669 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1670 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1671 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1672 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1673 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
1675 /* GNB DU UE F1AP ID */
1677 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1678 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1679 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1680 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1681 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
1686 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1687 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1688 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1689 DLRRCMessageTransferIEs__value_PR_SRBID;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1694 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1695 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1696 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1697 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1698 BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1700 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1702 /* Encode the F1SetupRequest type as APER */
1703 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1705 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1707 /* Encode results */
1708 if(encRetVal.encoded == ENCODE_FAIL)
1710 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1711 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1716 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1717 for(int i=0; i< encBufSize; i++)
1719 DU_LOG("%x",encBuf[i]);
1724 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1726 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1731 }/* End of BuildAndSendDLRRCMessageTransfer */
1733 /*******************************************************************
1735 * @brief Function to set the Dl RRC Msg Type
1739 * Function : setDlRRCMsgType
1741 * Functionality: Constructs the UE Setup Response and sends
1742 * it to the DU through SCTP.
1746 * @return ROK - success
1749 * ****************************************************************/
1751 uint8_t setDlRRCMsgType(uint8_t ueId)
1753 uint8_t rrcMsgType = 0;
1754 switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
1757 rrcMsgType = RRC_SETUP;
1759 case REGISTRATION_ACCEPT:
1760 rrcMsgType = REGISTRATION_ACCEPT;
1762 case UE_CONTEXT_SETUP_REQ:
1763 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1765 case SECURITY_MODE_COMPLETE:
1766 rrcMsgType = SECURITY_MODE_COMPLETE;
1769 rrcMsgType = RRC_RECONFIG;
1771 case UE_CONTEXT_MOD_REQ:
1772 rrcMsgType = UE_CONTEXT_MOD_REQ;
1780 /*******************************************************************
1782 * @brief Function to build Initial UL RRC Message
1786 * Function : procInitULRRCMsg
1788 * Functionality: Function to build Initial UL RRC Message
1792 * @return ROK - success
1795 * ****************************************************************/
1797 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1799 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1801 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1802 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1804 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1806 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1808 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1810 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1811 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.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 ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
1827 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1828 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1829 CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
1830 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
1831 if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
1833 memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1834 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
1835 .duToCuContainer.size);
1840 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1846 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1852 ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
1853 rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
1854 ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
1859 /*******************************************************************
1861 * @brief Builds Nrcgi
1865 * Function : BuildNrcgi
1867 * Functionality: Building the PLMN ID and NR Cell id
1869 * @params[in] NRCGI_t *nrcgi
1870 * @return ROK - success
1873 * ****************************************************************/
1874 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1877 uint8_t unused_bits = 4;
1878 uint8_t byteSize = 5;
1880 /* Allocate Buffer Memory */
1881 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1882 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1883 if(nrcgi->pLMN_Identity.buf == NULLP)
1887 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1893 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1894 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1895 if(nrcgi->nRCellIdentity.buf == NULLP)
1900 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1906 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1907 nrcgi->nRCellIdentity.buf[0] |= val;
1908 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1912 /*******************************************************************
1914 * @brief Builds Special cell list for UE Setup Request
1918 * Function : BuildSplCellList
1920 * Functionality: Constructs the Special Cell list for UESetReq
1922 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1924 * @return ROK - success
1927 * ****************************************************************/
1928 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1934 spCellLst->list.count = cellCnt;
1935 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1936 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1937 if(spCellLst->list.array == NULLP)
1941 for(idx=0; idx<cellCnt; idx++)
1943 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1944 if(spCellLst->list.array[idx] == NULLP)
1950 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1951 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1952 spCellLst->list.array[idx]->value.present =\
1953 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1954 /* Special Cell ID -NRCGI */
1955 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1960 /*Special Cell Index*/
1961 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1963 }/* End of BuildSplCellList*/
1965 /*******************************************************************
1967 * @brief Builds SRBS to be setup
1971 * Function : BuildSRBSetup
1973 * Functionality: Constructs the SRB's for UESetReq
1975 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1977 * @return ROK - success
1980 * ****************************************************************/
1981 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1986 srbSet->list.count = srbCnt;
1987 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1988 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1989 if(srbSet->list.array == NULLP)
1993 for(idx=0; idx<srbCnt; idx++)
1995 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1996 if(srbSet->list.array[idx] == NULLP)
2002 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2003 srbSet->list.array[idx]->criticality = Criticality_ignore;
2004 srbSet->list.array[idx]->value.present = \
2005 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2006 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2008 }/* End of BuildSRBSetup*/
2010 /*******************************************************************
2012 * @brief Builds QOS Info for DRB Setum Item
2016 * Function : BuildQOSInfo
2018 * Functionality: Constructs the QOS Info for DRB Setup Item
2020 * @params[in] QoSInformation_t *qosinfo
2022 * @return ROK - success
2025 * ****************************************************************/
2026 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2028 /* NonDynamic5QIDescriptor */
2029 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2030 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2031 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2036 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
2038 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2039 sizeof(AveragingWindow_t));
2040 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2045 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2046 /*MaxDataBurstVolume*/
2047 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2048 sizeof(MaxDataBurstVolume_t));
2049 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2054 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2056 /*nRGRAN Allocation Retention Priority*/
2057 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2058 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2059 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2062 }/*End of BuildQOSInfo*/
2064 /*******************************************************************
2066 * @brief Builds SNSSAI
2070 * Function : BuildSNSSAI
2072 * Functionality: Constructs the SNSSAI For DRB list
2074 * @params[in] SNSSAI_t *snssai
2076 * @return ROK - success
2079 * ****************************************************************/
2080 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2084 snssai->sST.size = sizeof(uint8_t);
2085 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2086 if(snssai->sST.buf == NULLP)
2090 snssai->sST.buf[0] = 3;
2092 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2093 if(snssai->sD == NULLP)
2097 snssai->sD->size = 3*sizeof(uint8_t);
2098 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2099 if(snssai->sD->buf == NULLP)
2103 snssai->sD->buf[0] = 3;
2104 snssai->sD->buf[1] = 6;
2105 snssai->sD->buf[2] = 9;
2107 }/*End of BuildSNSSAI*/
2109 /*******************************************************************
2111 * @brief Builds the flow map.
2115 * Function : BuildFlowsMap
2117 * Functionality: Constructs the flowmap For DRB list
2119 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2121 * @return ROK - success
2124 * ****************************************************************/
2125 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2131 flowMap->list.count = flowCnt;
2132 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2133 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2134 if(flowMap->list.array == NULLP)
2138 for(idx=0; idx<flowCnt; idx++)
2140 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2141 if(flowMap->list.array[idx] == NULLP)
2147 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2148 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2154 }/*End of BuildFlowsMap*/
2156 /*******************************************************************
2158 * @brief Builds the Uplink Tunnel Info
2162 * Function : BuildULTnlInfo
2164 * Functionality: Constructs the UL TnlInfo For DRB list
2166 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2168 * @return ROK - success
2171 * ****************************************************************/
2172 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2177 ulInfo->list.count = ulCnt;
2178 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2179 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2180 if(ulInfo->list.array == NULLP)
2184 for(idx=0; idx<ulCnt; idx++)
2186 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2187 if(ulInfo->list.array[idx] == NULLP)
2193 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2194 UPTransportLayerInformation_PR_gTPTunnel;
2196 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2197 sizeof(GTPTunnel_t));
2198 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2202 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2203 transportLayerAddress.size = 4*sizeof(uint8_t);
2204 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2205 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2206 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2207 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2208 transportLayerAddress.buf == NULLP)
2212 /* NOTE: Below IP address must be changed if running on different IP configuration */
2213 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2214 transportLayerAddress.buf[0] = 192;
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 transportLayerAddress.buf[1] = 168;
2217 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2218 transportLayerAddress.buf[2] = 130;
2219 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2220 transportLayerAddress.buf[3] = 82;
2221 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2222 transportLayerAddress.bits_unused = 0;
2224 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2225 = 4 * sizeof(uint8_t);
2226 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2227 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2228 gTPTunnel->gTP_TEID.size);
2229 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2234 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2235 gTP_TEID.buf[0] = 0;
2236 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2237 gTP_TEID.buf[1] = 0;
2238 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2239 gTP_TEID.buf[2] = 0;
2240 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2241 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2244 }/*End of BuildULTnlInfo*/
2246 /*******************************************************************
2248 * @brief Builds DRBS to be setup
2252 * Function : BuildDRBSetup
2254 * Functionality: Constructs the DRB's for UESetReq
2256 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2258 * @return ROK - success
2261 * ****************************************************************/
2262 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2264 uint8_t BuildQOSInforet;
2265 uint8_t BuildSNSSAIret;
2266 uint8_t BuildFlowsMapret;
2267 uint8_t BuildULTnlInforet;
2270 DRBs_ToBeSetup_Item_t *drbSetItem;
2272 drbSet->list.count = drbCnt;
2273 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2274 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2275 if(drbSet->list.array == NULLP)
2279 for(idx=0; idx<drbCnt; idx++)
2281 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2282 if(drbSet->list.array[idx] == NULLP)
2288 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2289 drbSet->list.array[idx]->criticality = Criticality_ignore;
2290 drbSet->list.array[idx]->value.present = \
2291 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2292 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2294 drbSetItem->dRBID = 1;
2296 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2297 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2298 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2302 drbSetItem->qoSInformation.choice.choice_extension->id = \
2303 ProtocolIE_ID_id_DRB_Information;
2304 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2306 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2307 QoSInformation_ExtIEs__value_PR_DRB_Information;
2308 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2309 choice_extension->value.choice.DRB_Information.dRB_QoS);
2310 if(BuildQOSInforet != ROK)
2315 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2316 choice_extension->value.choice.DRB_Information.sNSSAI);
2317 if(BuildSNSSAIret != ROK)
2321 /*Flows mapped to DRB List*/
2322 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2323 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2324 if(BuildFlowsMapret != ROK)
2328 /*ULUPTNLInformation To Be Setup List*/
2329 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2330 if(BuildULTnlInforet != ROK)
2335 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2337 /*UL Configuration*/
2338 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2339 if(drbSetItem->uLConfiguration == NULLP)
2343 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2345 }/* End of BuildDRBSetup*/
2347 /*******************************************************************
2349 * @brief Deallocating memory of function BuildAndSendUESetReq
2353 * Function : FreeNrcgi
2355 * Functionality: Deallocating memory for function BuildNrcgi
2357 * @params[in] NRCGI_t *nrcgi
2361 *******************************************************************/
2362 void FreeNrcgi(NRCGI_t *nrcgi)
2364 if(nrcgi->pLMN_Identity.buf != NULLP)
2366 if(nrcgi->nRCellIdentity.buf != NULLP)
2368 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2370 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2373 /*******************************************************************
2375 * @brief Deallocating memory of function BuildAndSendUESetReq
2379 * Function : FreeSplCellList
2381 * Functionality: Deallocating memory for function BuildSplCellList
2383 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2388 * *****************************************************************/
2389 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2392 if(spCellLst->list.array != NULLP)
2394 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2396 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2398 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2400 if(spCellLst->list.array[cellidx]!=NULLP)
2402 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2405 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2408 /*******************************************************************
2410 * @brief Deallocating memory of function BuildAndSendUESetReq
2414 * Function : FreeSRBSetup
2416 * Functionality: Deallocating memory for function BuildSRBSetup
2418 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2423 * ******************************************************************/
2424 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2427 if(srbSet->list.array != NULLP)
2429 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2431 if(srbSet->list.array[srbidx]!=NULLP)
2433 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2436 CU_FREE(srbSet->list.array,srbSet->list.size);
2439 /*******************************************************************
2441 * @brief Deallocating memory of function BuildAndSendUESetReq
2445 * Function : FreeQOSInfo
2447 * Functionality: Deallocating memory for function BuildQOSInfo
2449 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2453 * ****************************************************************/
2454 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2456 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2458 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2460 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2462 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2463 sizeof(MaxDataBurstVolume_t));
2465 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2466 sizeof(AveragingWindow_t));
2468 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2469 sizeof(NonDynamic5QIDescriptor_t));
2472 /*******************************************************************
2474 * @brief Deallocating memory of function BuildAndSendUESetReq
2478 * Function : FreeULTnlInfo
2480 * Functionality: Deallocating memory for function BuildULTnlInfo
2482 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2487 * ****************************************************************/
2488 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2491 if(ulInfo->list.array != NULLP)
2493 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2495 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2497 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2499 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2500 transportLayerAddress.buf != NULLP)
2502 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2505 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2506 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2507 gTPTunnel->gTP_TEID.size);
2509 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2510 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2511 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2513 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2514 sizeof(GTPTunnel_t));
2517 if(ulInfo->list.array[ulidx]!=NULLP)
2519 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2522 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2525 /*******************************************************************
2527 * @brief Deallocating memory for BuildAndSendUESetReq
2531 * Function : FreeDRBSetup
2533 * Functionality: Deallocating memory for BuildDRBSetup
2535 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2539 * ****************************************************************/
2540 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2542 DRBs_ToBeSetup_Item_t *drbSetItem;
2545 if(drbSet->list.array == NULLP)
2547 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2549 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2551 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2552 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2554 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2555 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2557 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2558 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2560 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2561 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2563 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2565 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2567 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2569 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2570 flows_Mapped_To_DRB_List.list.array != NULLP)
2572 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2573 flows_Mapped_To_DRB_List.list.count; flowidx++)
2575 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2576 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2578 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2579 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2580 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2582 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2583 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2584 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2586 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2587 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2588 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2590 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2591 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2593 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2594 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2595 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2596 sizeof(MaxDataBurstVolume_t));
2598 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2599 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2600 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2602 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2603 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2604 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2607 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2608 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2610 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2611 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2614 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2615 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2616 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2618 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2619 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2621 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2622 sizeof(OCTET_STRING_t));
2624 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2625 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2627 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2628 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2630 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2631 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2633 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2634 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2636 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2639 if(drbSet->list.array[drbidx]!=NULLP)
2641 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2644 CU_FREE(drbSet->list.array,drbSet->list.size);
2649 /*******************************************************************
2651 * @brief Free the UE Setup Request
2655 * Function : FreeUeContextSetupReq
2657 * Functionality: Deallocate the memory of BuildUESetReq
2659 * @params[in] F1AP_PDU_t *f1apMsg
2664 * ****************************************************************/
2665 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2668 UEContextSetupRequest_t *ueSetReq = NULLP;
2670 if(f1apMsg != NULLP)
2672 if(f1apMsg->choice.initiatingMessage != NULLP)
2674 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2675 if(ueSetReq->protocolIEs.list.array != NULLP)
2677 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2679 if(ueSetReq->protocolIEs.list.array[idx])
2681 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2683 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2685 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2687 case ProtocolIE_ID_id_SpCell_ID:
2688 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2690 case ProtocolIE_ID_id_ServCellIndex:
2692 case ProtocolIE_ID_id_SpCellULConfigured:
2694 case ProtocolIE_ID_id_CUtoDURRCInformation:
2695 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2697 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2698 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2700 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2701 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2703 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2704 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2706 case ProtocolIE_ID_id_RRCContainer:
2707 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2709 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2710 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2714 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2719 for(ieId=0; ieId<idx; ieId++)
2721 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2723 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2726 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2728 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2730 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2734 /**Filling cell group info **/
2735 /*******************************************************************
2737 * @brief Build Control resource set to add/modify list
2741 * Function : BuildControlRSetToAddModList
2743 * Functionality: Build Control resource set to add/modify list
2746 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2748 * @return ROK - success
2751 * ****************************************************************/
2752 uint8_t BuildControlRSetToAddModList
2754 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2759 uint8_t numBytes, bitsUnused;
2760 struct ControlResourceSet *controlRSet;
2761 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2762 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2765 controlRSetList->list.count = elementCnt;
2766 controlRSetList->list.size = \
2767 elementCnt * sizeof(struct ControlResourceSet *);
2769 controlRSetList->list.array = NULLP;
2770 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2771 if(!controlRSetList->list.array)
2773 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2777 for(idx = 0; idx < elementCnt; idx++)
2779 controlRSetList->list.array[idx] = NULLP;
2780 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2781 if(!controlRSetList->list.array[idx])
2783 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2789 controlRSet = controlRSetList->list.array[idx];
2790 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2792 /* Values harcoded according to our design:
2795 * Bit string stored ff0000000000
2799 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2800 controlRSet->frequencyDomainResources.buf = NULLP;
2801 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2802 controlRSet->frequencyDomainResources.size);
2803 if(!controlRSet->frequencyDomainResources.buf)
2805 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2809 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2810 coreset0EndPrb = CORESET0_END_PRB;
2811 coreset1StartPrb = coreset0EndPrb + 6;
2812 coreset1NumPrb = CORESET1_NUM_PRB;
2813 /* calculate the PRBs */
2814 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2815 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2816 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2818 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2819 controlRSet->cce_REG_MappingType.present = \
2820 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2822 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2823 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2824 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2825 controlRSet->tci_PresentInDCI = NULLP;
2827 uint8_t tciStateIdx;
2829 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2830 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2831 if(!controlRset->tci_StatesPDCCH_ToAddList)
2833 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2838 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2839 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2840 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2841 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2842 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2844 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2848 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2850 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2851 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2853 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2860 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2862 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2863 if(!controlRset->tci_PresentInDCI)
2865 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2869 *(controlRset->tci_PresentInDCI);
2872 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2873 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2874 if(!controlRSet->pdcch_DMRS_ScramblingID)
2876 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2879 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2882 } /* End BuildControlRSetToAddModList */
2884 /*******************************************************************
2886 * @brief Build search space to add/modify list
2890 * Function : BuildSearchSpcToAddModList
2892 * Functionality: Build search space to add/modify list
2895 * @return ROK - success
2898 * ****************************************************************/
2899 uint8_t BuildSearchSpcToAddModList
2901 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2909 struct SearchSpace *searchSpc;
2912 searchSpcList->list.count = elementCnt;
2913 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2915 searchSpcList->list.array = NULLP;
2916 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2917 if(!searchSpcList->list.array)
2919 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2923 for(idx = 0; idx < elementCnt; idx++)
2925 searchSpcList->list.array[idx] = NULLP;
2926 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2927 if(!searchSpcList->list.array[idx])
2929 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2935 searchSpc = searchSpcList->list.array[idx];
2937 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2939 searchSpc->controlResourceSetId = NULLP;
2940 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2941 if(!searchSpc->controlResourceSetId)
2943 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2946 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2948 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2949 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2950 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2951 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2953 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2956 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2957 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2959 searchSpc->duration = NULLP;
2960 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2961 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2962 if(!searchSpc->monitoringSymbolsWithinSlot)
2964 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2968 /* Values taken from reference logs :
2971 * Bit string stores 8000
2976 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2977 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2978 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2979 searchSpc->monitoringSymbolsWithinSlot->size);
2980 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2982 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2987 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2988 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2989 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2990 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2992 searchSpc->nrofCandidates = NULLP;
2993 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2994 if(!searchSpc->nrofCandidates)
2996 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3000 searchSpc->nrofCandidates->aggregationLevel1 = \
3001 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3002 searchSpc->nrofCandidates->aggregationLevel2 = \
3003 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3004 searchSpc->nrofCandidates->aggregationLevel4 = \
3005 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3006 searchSpc->nrofCandidates->aggregationLevel8 = \
3007 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3008 searchSpc->nrofCandidates->aggregationLevel16 = \
3009 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3011 searchSpc->searchSpaceType = NULLP;
3012 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3013 if(!searchSpc->searchSpaceType)
3015 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3019 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3021 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3022 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3023 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3024 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3026 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3029 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3030 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3033 }/* End BuildSearchSpcToAddModList */
3035 /*******************************************************************
3037 * @brief Builds BWP DL dedicated PDCCH config
3041 * Function : BuildBWPDlDedPdcchCfg
3043 * Functionality: Builds BWP DL dedicated PDCCH config
3045 * @params[in] struct PDCCH_Config *pdcchCfg
3047 * @return ROK - success
3050 * ****************************************************************/
3051 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3053 pdcchCfg->controlResourceSetToAddModList = NULLP;
3054 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3055 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3056 if(!pdcchCfg->controlResourceSetToAddModList)
3058 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3062 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3067 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3069 pdcchCfg->searchSpacesToAddModList = NULLP;
3070 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3071 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3072 if(!pdcchCfg->searchSpacesToAddModList)
3074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3078 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3083 pdcchCfg->searchSpacesToReleaseList = NULLP;
3084 pdcchCfg->downlinkPreemption = NULLP;
3085 pdcchCfg->tpc_PUSCH = NULLP;
3086 pdcchCfg->tpc_PUCCH = NULLP;
3087 pdcchCfg->tpc_SRS = NULLP;
3092 /*******************************************************************
3094 * @brief Builds DMRS DL PDSCH Mapping type A
3098 * Function : BuildDMRSDLPdschMapTypeA
3100 * Functionality: Builds DMRS DL PDSCH Mapping type A
3103 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3104 * @return ROK - success
3107 * ****************************************************************/
3108 uint8_t BuildDMRSDLPdschMapTypeA
3110 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3113 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3114 dmrsDlCfg->choice.setup = NULLP;
3115 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3116 if(!dmrsDlCfg->choice.setup)
3118 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3122 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3123 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3124 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3125 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3127 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3130 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3132 dmrsDlCfg->choice.setup->maxLength = NULLP;
3133 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3134 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3135 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3140 /*******************************************************************
3142 * @brief Builds TCI states to add/modify list
3146 * Function : BuildTCIStatesToAddModList
3148 * Functionality:Builds TCI states to add/modify list
3151 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3153 * @return ROK - success
3156 * ****************************************************************/
3157 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3162 /*******************************************************************
3164 * @brief Builds PDSCH time domain allocation list
3168 * Function : BuildPdschTimeDomAllocList
3170 * Functionality: Builds PDSCH time domain allocation list
3173 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3175 * @return ROK - success
3178 * ****************************************************************/
3179 uint8_t BuildPdschTimeDomAllocList
3181 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3186 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3188 timeDomAllocList->present = \
3189 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3191 timeDomAllocList->choice.setup = NULLP;
3192 CU_ALLOC(timeDomAllocList->choice.setup, \
3193 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3194 if(!timeDomAllocList->choice.setup)
3196 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3201 timeDomAllocList->choice.setup->list.count = elementCnt;
3202 timeDomAllocList->choice.setup->list.size = \
3203 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3205 timeDomAllocList->choice.setup->list.array = NULLP;
3206 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3207 timeDomAllocList->choice.setup->list.size);
3208 if(!timeDomAllocList->choice.setup->list.array)
3210 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3214 for(idx = 0; idx < elementCnt; idx++)
3216 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3217 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3218 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3219 if(!timeDomAllocList->choice.setup->list.array[idx])
3221 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3227 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3229 timeDomAlloc->k0 = NULLP;
3230 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3231 timeDomAlloc->startSymbolAndLength = 66;
3236 /*******************************************************************
3238 * @brief Builds PDSCH PRB Bundling type
3242 * Function : BuildPdschPrbBundlingType
3244 * Functionality: Builds PDSCH PRB Bundling type
3247 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3249 * @return ROK - success
3252 * ****************************************************************/
3253 uint8_t BuildPdschPrbBundlingType
3255 struct PDSCH_Config__prb_BundlingType *prbBndlType
3258 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3260 prbBndlType->choice.staticBundling = NULLP;
3261 CU_ALLOC(prbBndlType->choice.staticBundling, \
3262 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3263 if(!prbBndlType->choice.staticBundling)
3265 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3268 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3273 /*******************************************************************
3275 * @brief Builds BWP DL dedicated PDSCH config
3279 * Function : BuildBWPDlDedPdschCfg
3281 * Functionality: Builds BWP DL dedicated PDSCH config
3283 * @params[in] struct PDSCH_Config *pdschCfg
3285 * @return ROK - success
3288 * ****************************************************************/
3289 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3291 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3293 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3294 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3295 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3296 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3298 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3302 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3307 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3308 pdschCfg->tci_StatesToAddModList = NULLP;
3309 pdschCfg->tci_StatesToReleaseList = NULLP;
3310 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3312 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3313 if(!pdschCfg->tci_StatesToAddModList)
3315 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3318 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3324 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3326 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3327 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3328 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3329 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3331 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3334 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3338 pdschCfg->pdsch_AggregationFactor = NULLP;
3339 pdschCfg->rateMatchPatternToAddModList = NULLP;
3340 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3341 pdschCfg->rateMatchPatternGroup1 = NULLP;
3342 pdschCfg->rateMatchPatternGroup2 = NULLP;
3343 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3344 pdschCfg->mcs_Table = NULLP;
3346 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3347 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3348 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3350 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3353 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3355 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3360 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3361 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3362 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3363 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3364 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3365 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3366 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3371 /*******************************************************************
3373 * @brief Builds intitial DL BWP
3376 * Function : BuildInitialDlBWP
3378 * Functionality: Builds intitial DL BWP in spCellCfgDed
3380 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3382 * @return ROK - success
3385 * ****************************************************************/
3386 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3388 dlBwp->pdcch_Config = NULLP;
3389 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3390 if(!dlBwp->pdcch_Config)
3392 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3395 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3397 dlBwp->pdcch_Config->choice.setup = NULLP;
3398 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3399 if(!dlBwp->pdcch_Config->choice.setup)
3401 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3404 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3409 dlBwp->pdsch_Config = NULLP;
3410 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3411 if(!dlBwp->pdsch_Config)
3413 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3416 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3418 dlBwp->pdsch_Config->choice.setup = NULLP;
3419 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3420 if(!dlBwp->pdsch_Config->choice.setup)
3422 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3426 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3431 dlBwp->sps_Config = NULLP;
3432 dlBwp->radioLinkMonitoringConfig = NULLP;
3436 /*******************************************************************
3438 * @brief Builds DMRS UL Pusch Mapping type A
3442 * Function : BuildDMRSULPuschMapTypeA
3444 * Functionality: Builds DMRS UL Pusch Mapping type A
3447 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3448 * @return ROK - success
3451 * ****************************************************************/
3452 uint8_t BuildDMRSULPuschMapTypeA
3454 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3457 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3458 dmrsUlCfg->choice.setup= NULLP;
3459 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3460 if(!dmrsUlCfg->choice.setup)
3462 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3466 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3467 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3468 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3469 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3471 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3474 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3476 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3477 dmrsUlCfg->choice.setup->maxLength = NULLP;
3478 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3479 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3480 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3481 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3483 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3487 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3488 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3490 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3492 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3495 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3497 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3498 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3502 /*******************************************************************
3504 * @brief Build PUSCH time domain allocation list
3508 * Function : BuildPuschTimeDomAllocList
3510 * Functionality: Build PUSCH time domain allocation list
3513 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3515 * @return ROK - success
3518 * ****************************************************************/
3519 uint8_t BuildPuschTimeDomAllocList
3521 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3526 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3528 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3529 timeDomAllocList->choice.setup = NULLP;
3530 CU_ALLOC(timeDomAllocList->choice.setup, \
3531 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3532 if(!timeDomAllocList->choice.setup)
3534 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3539 timeDomAllocList->choice.setup->list.count = elementCnt;
3540 timeDomAllocList->choice.setup->list.size = \
3541 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3542 timeDomAllocList->choice.setup->list.array = NULLP;
3543 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3544 timeDomAllocList->choice.setup->list.size);
3545 if(!timeDomAllocList->choice.setup->list.array)
3547 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3551 for(idx = 0; idx < elementCnt; idx++)
3553 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3554 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3555 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3556 if(!timeDomAllocList->choice.setup->list.array[idx])
3558 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3564 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3565 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3566 if(!timeDomAlloc->k2)
3568 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3571 *(timeDomAlloc->k2) = PUSCH_K2;
3572 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3573 timeDomAlloc->startSymbolAndLength = 66;
3577 /*******************************************************************
3579 * @brief Builds BWP UL dedicated PUSCH Config
3583 * Function : BuildBWPUlDedPuschCfg
3586 * Builds BWP UL dedicated PUSCH Config
3588 * @params[in] : PUSCH_Config_t *puschCfg
3590 * @return ROK - success
3593 * ****************************************************************/
3594 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3596 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3597 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3598 if(!puschCfg->dataScramblingIdentityPUSCH)
3600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3603 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3605 puschCfg->txConfig = NULLP;
3606 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3607 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3608 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3609 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3611 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3615 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3620 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3621 puschCfg->pusch_PowerControl = NULLP;
3622 puschCfg->frequencyHopping = NULLP;
3623 puschCfg->frequencyHoppingOffsetLists = NULLP;
3624 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3626 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3627 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3628 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3629 if(!puschCfg->pusch_TimeDomainAllocationList)
3631 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3635 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3640 puschCfg->pusch_AggregationFactor = NULLP;
3641 puschCfg->mcs_Table = NULLP;
3642 puschCfg->mcs_TableTransformPrecoder = NULLP;
3643 puschCfg->transformPrecoder = NULLP;
3644 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3645 if(!puschCfg->transformPrecoder)
3647 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3650 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3652 puschCfg->codebookSubset = NULLP;
3653 puschCfg->maxRank = NULLP;
3654 puschCfg->rbg_Size = NULLP;
3655 puschCfg->uci_OnPUSCH = NULLP;
3656 puschCfg->tp_pi2BPSK = NULLP;
3661 /*******************************************************************
3663 * @brief Fills SRS resource to add/modify list
3667 * Function : BuildSrsRsrcAddModList
3669 * Functionality: Fills SRS resource to add/modify list
3672 * @return ROK - success
3675 * ****************************************************************/
3676 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3682 resourceList->list.count = elementCnt;
3683 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3684 resourceList->list.array = NULLP;
3685 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3686 if(!resourceList->list.array)
3688 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3692 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3694 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3695 if(!resourceList->list.array[rsrcIdx])
3697 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3703 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3704 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3705 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3707 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3708 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3709 sizeof(struct SRS_Resource__transmissionComb__n2));
3710 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3712 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3715 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3716 = SRS_COMB_OFFSET_N2;
3717 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3718 = SRS_CYCLIC_SHIFT_N2;
3720 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3722 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3723 SRS_Resource__resourceMapping__nrofSymbols_n1;
3724 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3725 SRS_Resource__resourceMapping__repetitionFactor_n1;
3727 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3728 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3729 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3730 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3731 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3732 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3733 SRS_Resource__groupOrSequenceHopping_neither;
3735 /* Setting resource type to aperiodic for intergration purposes */
3736 resourceList->list.array[rsrcIdx]->resourceType.present = \
3737 SRS_Resource__resourceType_PR_aperiodic;
3738 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3739 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3740 sizeof(struct SRS_Resource__resourceType__aperiodic));
3741 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3743 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3746 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3751 /*******************************************************************
3753 * @brief Build SRS resource set Add/mod list
3757 * Function : BuildSrsRsrcSetAddModList
3759 * Functionality: Build SRS resource set Add/mod list
3762 * @return ROK - success
3765 * ****************************************************************/
3766 uint8_t BuildSrsRsrcSetAddModList
3768 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3774 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3777 rsrcSetList->list.count = elementCnt;
3778 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3779 rsrcSetList->list.array = NULLP;
3780 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3781 if(!rsrcSetList->list.array)
3783 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3787 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3789 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3790 if(!rsrcSetList->list.array[rSetIdx])
3792 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3798 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3800 /* Fill Resource Id list in resource set */
3801 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3802 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3803 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3804 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3806 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3811 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3812 rsrcIdList->list.count = elementCnt;
3813 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3814 rsrcIdList->list.array = NULLP;
3815 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3816 if(!rsrcIdList->list.array)
3818 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3822 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3824 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3825 if(!rsrcIdList->list.array[rsrcIdx])
3827 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3833 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3835 /* Fill resource type */
3836 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3837 SRS_ResourceSet__resourceType_PR_aperiodic;
3839 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3840 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3841 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3842 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3844 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3847 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3848 = APERIODIC_SRS_RESRC_TRIGGER;
3850 /* TODO : Fill values for below IEs as expected by Viavi */
3851 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3852 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3855 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3856 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3857 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3858 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3859 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3864 /*******************************************************************
3866 * @brief Builds BWP UL dedicated SRS Config
3870 * Function : BuildBWPUlDedSrsCfg
3872 * Functionality: Builds BWP UL dedicated SRS Config
3874 * @params[in] SRS Config
3875 * @return ROK - success
3878 * ****************************************************************/
3879 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3881 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3882 srsCfg->srs_ResourceSetToAddModList = NULLP;
3883 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3884 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3885 if(!srsCfg->srs_ResourceSetToAddModList)
3887 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3890 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3895 srsCfg->srs_ResourceToReleaseList = NULLP;
3897 /* Resource to Add/Modify list */
3898 srsCfg->srs_ResourceToAddModList = NULLP;
3899 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3900 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3901 if(!srsCfg->srs_ResourceToAddModList)
3903 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3907 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3912 srsCfg->tpc_Accumulation = NULLP;
3917 /*******************************************************************
3919 * @brief Builds inital UL BWP
3923 * Function : BuildInitialUlBWP
3925 * Functionality: Builds initial UL BWP
3927 * @params[in] BWP_UplinkDedicated_t *ulBwp
3928 * @return ROK - success
3931 * ****************************************************************/
3932 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3934 ulBwp->pucch_Config = NULLP;
3936 /* Fill BWP UL dedicated PUSCH config */
3937 ulBwp->pusch_Config = NULLP;
3938 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3939 if(!ulBwp->pusch_Config)
3941 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3945 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3946 ulBwp->pusch_Config->choice.setup = NULLP;
3947 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3948 if(!ulBwp->pusch_Config->choice.setup)
3950 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3954 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3959 ulBwp->configuredGrantConfig = NULLP;
3961 /* Fill BPW UL dedicated SRS config */
3962 ulBwp->srs_Config = NULLP;
3963 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3964 if(!ulBwp->srs_Config)
3966 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3970 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3971 ulBwp->srs_Config->choice.setup = NULLP;
3972 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3973 if(!ulBwp->srs_Config->choice.setup)
3975 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3979 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3984 ulBwp->beamFailureRecoveryConfig = NULLP;
3989 /*******************************************************************
3991 * @brief Builds Pusch Serving cell Config
3995 * Function : BuildPuschSrvCellCfg
3997 * Functionality: Builds Pusch Serving cell Config
3999 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4001 * @return ROK - success
4004 * ****************************************************************/
4005 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4007 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4008 puschCfg->choice.setup = NULLP;
4009 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4010 if(!puschCfg->choice.setup)
4012 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4016 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4017 puschCfg->choice.setup->rateMatching = NULLP;
4018 puschCfg->choice.setup->xOverhead = NULLP;
4019 puschCfg->choice.setup->ext1 = NULLP;
4020 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4021 if(!puschCfg->choice.setup->ext1)
4023 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4027 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4028 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4029 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4031 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4034 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4036 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4037 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4038 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4040 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4043 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4047 /*******************************************************************
4049 * @brief Builds UL config
4052 * Function : BuildUlCfg
4054 * Functionality: Builds UL config in spCellCfgDed
4056 * @params[in] UplinkConfig_t *ulCfg
4058 * @return ROK - success
4061 * ****************************************************************/
4062 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4064 ulCfg->initialUplinkBWP = NULLP;
4065 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4066 if(!ulCfg->initialUplinkBWP)
4068 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4072 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4077 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4078 ulCfg->uplinkBWP_ToAddModList = NULLP;
4079 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4080 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4081 if(!ulCfg->firstActiveUplinkBWP_Id)
4083 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4086 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4088 ulCfg->pusch_ServingCellConfig = NULLP;
4089 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4090 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4091 if(!ulCfg->pusch_ServingCellConfig)
4093 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4097 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4102 ulCfg->carrierSwitching = NULLP;
4103 ulCfg->ext1 = NULLP;
4107 /*******************************************************************
4109 * @brief Builds PDSCH serving cell config
4112 * Function : BuildPdschSrvCellCfg
4114 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4116 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4118 * @return ROK - success
4121 * ****************************************************************/
4122 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4124 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4125 pdschCfg->choice.setup = NULLP;
4126 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4127 if(!pdschCfg->choice.setup)
4129 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4133 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4134 pdschCfg->choice.setup->xOverhead = NULLP;
4135 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4136 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4137 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4139 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4142 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4143 pdschCfg->choice.setup->pucch_Cell = NULLP;
4144 pdschCfg->choice.setup->ext1 = NULLP;
4149 /*******************************************************************
4151 * @brief Builds CSI Meas config
4154 * Function : BuildCsiMeasCfg
4156 * Functionality: Builds CSI Meas config in spCellCfgDed
4158 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4160 * @return ROK - success
4163 * ****************************************************************/
4164 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4170 /*******************************************************************
4172 * @brief Builds Spcell config dedicated
4175 * Function : BuildSpCellCfgDed
4177 * Functionality: Builds sp cell config dedicated in spCellCfg
4179 * @params[in] ServingCellConfig_t srvCellCfg
4181 * @return ROK - success
4184 * ****************************************************************/
4185 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4187 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4189 srvCellCfg->initialDownlinkBWP = NULLP;
4190 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4191 if(!srvCellCfg->initialDownlinkBWP)
4193 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4197 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4199 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4202 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4203 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4205 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4206 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4207 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4209 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4212 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4214 srvCellCfg->bwp_InactivityTimer = NULLP;
4216 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4217 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4218 if(!srvCellCfg->defaultDownlinkBWP_Id)
4220 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4223 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4225 srvCellCfg->uplinkConfig = NULLP;
4226 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4227 if(!srvCellCfg->uplinkConfig)
4229 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4233 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4235 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4238 srvCellCfg->supplementaryUplink = NULLP;
4239 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4241 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4242 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4243 if(!srvCellCfg->pdsch_ServingCellConfig)
4245 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4249 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4251 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4255 srvCellCfg->csi_MeasConfig = NULLP;
4257 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4258 if(!srvCellCfg->csi_MeasConfig)
4260 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4264 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4266 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4270 srvCellCfg->sCellDeactivationTimer = NULLP;
4271 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4272 srvCellCfg->tag_Id = TAG_ID;
4273 srvCellCfg->dummy = NULLP;
4274 srvCellCfg->pathlossReferenceLinking = NULLP;
4275 srvCellCfg->servingCellMO = NULLP;
4276 srvCellCfg->ext1 = NULLP;
4280 /*******************************************************************
4282 * @brief Builds Spcell config
4286 * Function : BuildSpCellCfg
4288 * Functionality: Builds sp cell config in DuToCuRrcContainer
4290 * @params[in] SpCellConfig_t spCellCfg
4292 * @return ROK - success
4295 * ****************************************************************/
4296 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4299 spCellCfg->servCellIndex = NULLP;
4300 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4301 if(!spCellCfg->servCellIndex)
4303 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4306 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4308 spCellCfg->reconfigurationWithSync = NULLP;
4309 spCellCfg->rlf_TimersAndConstants = NULLP;
4310 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4311 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4312 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4314 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4317 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4319 spCellCfg->spCellConfigDedicated = NULLP;
4320 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4321 if(!spCellCfg->spCellConfigDedicated)
4323 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4326 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4328 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4333 /*******************************************************************
4335 * @brief Builds Phy cell group config
4339 * Function : BuildPhyCellGrpCfg
4341 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4343 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4345 * @return ROK - success
4348 * ****************************************************************/
4349 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4351 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4352 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4354 phyCellGrpCfg->p_NR_FR1 = NULLP;
4355 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4356 if(!phyCellGrpCfg->p_NR_FR1)
4358 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4361 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4362 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4363 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4364 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4365 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4366 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4367 phyCellGrpCfg->cs_RNTI = NULLP;
4368 phyCellGrpCfg->ext1 = NULLP;
4369 phyCellGrpCfg->ext2 = NULLP;
4374 /*******************************************************************
4376 * @brief Builds tag config
4380 * Function : BuildTagConfig
4382 * Functionality: Builds tag config in MacCellGroupConfig
4384 * @params[in] TAG_Config *tag_Config
4386 * @return ROK - success
4389 * ****************************************************************/
4390 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4392 struct TAG_Config__tag_ToAddModList *tagList;
4393 uint8_t idx, elementCnt;
4395 tagConfig->tag_ToReleaseList = NULLP;
4396 tagConfig->tag_ToAddModList = NULLP;
4397 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4398 if(!tagConfig->tag_ToAddModList)
4400 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4404 elementCnt = 1; //ODU_VALUE_ONE;
4405 tagList = tagConfig->tag_ToAddModList;
4406 tagList->list.count = elementCnt;
4407 tagList->list.size = elementCnt * sizeof(struct TAG *);
4409 tagList->list.array = NULLP;
4410 CU_ALLOC(tagList->list.array, tagList->list.size);
4411 if(!tagList->list.array)
4413 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4417 for(idx=0; idx<tagList->list.count; idx++)
4419 tagList->list.array[idx] = NULLP;
4420 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4421 if(!tagList->list.array[idx])
4423 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4429 tagList->list.array[idx]->tag_Id = TAG_ID;
4430 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4435 /*******************************************************************
4437 * @brief Builds PHR Config
4441 * Function : BuildPhrConfig
4443 * Functionality: Builds phrConfig in MacCellGroupConfig
4445 * @params[in] PHR Config *
4447 * @return ROK - success
4450 * ****************************************************************/
4451 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4454 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4455 phrConfig->choice.setup = NULLP;
4456 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4457 if(!phrConfig->choice.setup)
4459 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4463 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4464 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4465 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4466 phrConfig->choice.setup->multiplePHR = false;
4467 phrConfig->choice.setup->dummy = false;
4468 phrConfig->choice.setup->phr_Type2OtherCell = false;
4469 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4474 /*******************************************************************
4476 * @brief Builds BSR Config
4480 * Function : BuildBsrConfig
4482 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4484 * @params[in] BSR_Config *bsrConfig
4486 * @return ROK - success
4489 * ****************************************************************/
4490 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4492 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4493 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4494 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4499 /*******************************************************************
4501 * @brief Builds scheduling request config
4505 * Function : BuildSchedulingReqConfig
4507 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4509 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4511 * @return ROK - success
4514 * ****************************************************************/
4515 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4517 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4518 uint8_t idx, elementCnt;
4520 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4521 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4522 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4523 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4525 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4529 elementCnt = 1; //ODU_VALUE_ONE;
4530 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4531 schReqList->list.count = elementCnt;
4532 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4534 schReqList->list.array = NULLP;
4535 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4536 if(!schReqList->list.array)
4538 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4542 for(idx=0;idx<schReqList->list.count; idx++)
4544 schReqList->list.array[idx] = NULLP;
4545 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4546 if(!schReqList->list.array[idx])
4548 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4554 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4556 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4557 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4558 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4560 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4563 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4564 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4565 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4569 /*******************************************************************
4571 * @brief Builds Mac cell group config
4575 * Function : BuildMacCellGrpCfg
4577 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4579 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4581 * @return ROK - success
4584 * ****************************************************************/
4585 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4587 macCellGrpCfg->drx_Config = NULLP;
4588 macCellGrpCfg->schedulingRequestConfig = NULLP;
4589 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4590 if(!macCellGrpCfg->schedulingRequestConfig)
4592 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4596 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4598 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4602 macCellGrpCfg->bsr_Config = NULLP;
4603 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4604 if(!macCellGrpCfg->bsr_Config)
4606 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4610 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4612 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4616 macCellGrpCfg->tag_Config = NULLP;
4617 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4618 if(!macCellGrpCfg->tag_Config)
4620 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4624 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4626 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4630 macCellGrpCfg->phr_Config = NULLP;
4631 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4632 if(!macCellGrpCfg->phr_Config)
4634 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4638 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4640 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4644 macCellGrpCfg->skipUplinkTxDynamic = false;
4645 macCellGrpCfg->ext1 = NULLP;
4649 /*******************************************************************
4651 * @brief Frees memeory allocated for SearchSpcToAddModList
4655 * Function : FreeSearchSpcToAddModList
4657 * Functionality: Deallocating memory of SearchSpcToAddModList
4659 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4663 4221 * ****************************************************************/
4664 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4668 struct SearchSpace *searchSpc=NULLP;
4670 if(searchSpcList->list.array)
4672 if(searchSpcList->list.array[idx2])
4674 searchSpc = searchSpcList->list.array[idx2];
4675 if(searchSpc->controlResourceSetId)
4677 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4679 if(searchSpc->monitoringSymbolsWithinSlot)
4681 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4683 if(searchSpc->nrofCandidates)
4685 if(searchSpc->searchSpaceType)
4687 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4688 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4689 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4690 SearchSpace__searchSpaceType));
4692 CU_FREE(searchSpc->nrofCandidates,
4693 sizeof(struct SearchSpace__nrofCandidates));
4695 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4696 searchSpc->monitoringSymbolsWithinSlot->size);
4698 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4699 sizeof(BIT_STRING_t));
4701 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4702 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4704 CU_FREE(searchSpc->controlResourceSetId,
4705 sizeof(ControlResourceSetId_t));
4708 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4710 CU_FREE(searchSpcList->list.array[idx1],
4711 sizeof(struct SearchSpace));
4713 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4716 /*******************************************************************
4718 * @brief Frees memory allocated for PdschTimeDomAllocList
4722 * Function : FreePdschTimeDomAllocList
4724 * Functionality: Deallocating memory of PdschTimeDomAllocList
4726 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4730 4221 * ****************************************************************/
4731 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4735 if(timeDomAllocList->choice.setup)
4737 if(timeDomAllocList->choice.setup->list.array)
4739 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4741 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4742 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4744 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4745 timeDomAllocList->choice.setup->list.size);
4747 CU_FREE(timeDomAllocList->choice.setup,\
4748 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4751 /*******************************************************************
4753 * @brief Frees memory allocated for PuschTimeDomAllocList
4757 * Function : FreePuschTimeDomAllocList
4759 * Functionality: Deallocating memory of PuschTimeDomAllocList
4761 * @params[in] PUSCH_Config_t *puschCfg
4765 ***********************************************************************/
4766 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4770 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4772 if(puschCfg->pusch_TimeDomainAllocationList)
4774 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4775 if(timeDomAllocList_t->choice.setup)
4777 if(timeDomAllocList_t->choice.setup->list.array)
4779 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4780 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4782 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4783 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4785 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4786 timeDomAllocList_t->choice.setup->list.size);
4788 CU_FREE(timeDomAllocList_t->choice.setup, \
4789 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4791 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4792 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4793 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4797 /*******************************************************************
4799 * @brief Frees memory allocated for InitialUlBWP
4803 * Function : FreeInitialUlBWP
4805 * Functionality: Deallocating memory of InitialUlBWP
4807 * @params[in] BWP_UplinkDedicated_t *ulBwp
4811 * ****************************************************************/
4812 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4814 uint8_t rSetIdx, rsrcIdx;
4815 SRS_Config_t *srsCfg = NULLP;
4816 PUSCH_Config_t *puschCfg = NULLP;
4817 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4818 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4819 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4820 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4822 if(ulBwp->pusch_Config)
4824 if(ulBwp->pusch_Config->choice.setup)
4826 puschCfg=ulBwp->pusch_Config->choice.setup;
4827 if(puschCfg->dataScramblingIdentityPUSCH)
4829 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4831 FreePuschTimeDomAllocList(puschCfg);
4832 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4833 if(dmrsUlCfg->choice.setup)
4835 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4837 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4839 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4841 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4842 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4844 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4847 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4849 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4850 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4852 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4854 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4856 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4858 /* Free SRS-Config */
4859 if(ulBwp->srs_Config)
4861 if(ulBwp->srs_Config->choice.setup)
4863 srsCfg = ulBwp->srs_Config->choice.setup;
4865 /* Free Resource Set to add/mod list */
4866 if(srsCfg->srs_ResourceSetToAddModList)
4868 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4869 if(rsrcSetList->list.array)
4873 /* Free SRS resource Id list in this SRS resource set */
4874 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4876 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4878 if(rsrcIdList->list.array)
4880 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4882 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4884 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4886 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4887 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4890 /* Free resource type info for this SRS resource set */
4891 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4892 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4894 /* Free memory for each resource set */
4895 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4897 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4899 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4901 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4902 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4905 /* Free resource to add/modd list */
4906 if(srsCfg->srs_ResourceToAddModList)
4908 resourceList = srsCfg->srs_ResourceToAddModList;
4909 if(resourceList->list.array)
4912 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4913 sizeof(struct SRS_Resource__transmissionComb__n2));
4914 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4915 sizeof(struct SRS_Resource__resourceType__aperiodic));
4917 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4919 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4921 CU_FREE(resourceList->list.array, resourceList->list.size);
4923 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4924 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4927 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4929 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4933 /*******************************************************************
4935 * @brief Frees memory allocated for initialUplinkBWP
4939 * Function : FreeinitialUplinkBWP
4941 * Functionality: Deallocating memory of initialUplinkBWP
4943 * @params[in] UplinkConfig_t *ulCfg
4948 * ****************************************************************/
4949 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4951 BWP_UplinkDedicated_t *ulBwp=NULLP;
4952 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4954 if(ulCfg->initialUplinkBWP)
4956 ulBwp=ulCfg->initialUplinkBWP;
4957 if(ulCfg->firstActiveUplinkBWP_Id)
4959 if(ulCfg->pusch_ServingCellConfig)
4961 puschCfg=ulCfg->pusch_ServingCellConfig;
4962 if(puschCfg->choice.setup)
4964 if(puschCfg->choice.setup->ext1)
4966 CU_FREE(puschCfg->choice.setup->ext1->\
4967 processingType2Enabled,sizeof(BOOLEAN_t));
4968 CU_FREE(puschCfg->choice.setup->ext1->\
4969 maxMIMO_Layers,sizeof(long));
4970 CU_FREE(puschCfg->choice.setup->ext1, \
4971 sizeof(struct PUSCH_ServingCellConfig__ext1));
4973 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4975 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4977 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4979 FreeInitialUlBWP(ulBwp);
4980 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4983 /*******************************************************************
4985 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4989 * Function : FreeBWPDlDedPdschCfg
4991 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4993 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4998 * ****************************************************************/
4999 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5001 struct PDSCH_Config *pdschCfg=NULLP;
5002 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5003 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5004 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5006 if(dlBwp->pdsch_Config->choice.setup)
5008 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5009 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5011 if(pdschCfg->pdsch_TimeDomainAllocationList)
5013 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5014 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5016 prbBndlType=&pdschCfg->prb_BundlingType;
5017 CU_FREE(prbBndlType->choice.staticBundling,\
5018 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5019 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5021 FreePdschTimeDomAllocList(timeDomAllocList);
5022 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5023 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5025 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5026 if(dmrsDlCfg->choice.setup)
5028 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5030 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5032 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5033 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5035 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5038 /*******************************************************************
5040 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5044 * Function : FreeBWPDlDedPdcchCfg
5046 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5048 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5053 * ****************************************************************/
5054 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5058 struct PDCCH_Config *pdcchCfg=NULLP;
5059 struct ControlResourceSet *controlRSet=NULLP;
5060 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5062 if(dlBwp->pdcch_Config->choice.setup)
5064 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5065 if(pdcchCfg->controlResourceSetToAddModList)
5067 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5068 if(controlRSetList->list.array)
5070 controlRSet = controlRSetList->list.array[idx2];
5073 if(controlRSet->frequencyDomainResources.buf)
5075 if(controlRSet->pdcch_DMRS_ScramblingID)
5077 if(pdcchCfg->searchSpacesToAddModList)
5079 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5080 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5081 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5083 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5085 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5086 controlRSet->frequencyDomainResources.size);
5089 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5091 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5093 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5095 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5096 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5098 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5101 /*******************************************************************
5103 * @brief Builds RLC Config
5107 * Function : BuildRlcConfig
5109 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5111 * @params[in] RLC_Config *rlcConfig
5113 * @return ROK - success
5116 * ****************************************************************/
5117 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5120 rlcConfig->present = RLC_Config_PR_am;
5122 rlcConfig->choice.am = NULLP;
5123 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5124 if(!rlcConfig->choice.am)
5126 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5131 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5132 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5133 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5135 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5138 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5139 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5140 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5141 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5142 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5145 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5146 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5147 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5149 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5152 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5153 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5154 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5159 /*******************************************************************
5161 * @brief Builds MAC LC Config
5165 * Function : BuildMacLCConfig
5167 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5169 * @params[in] struct LogicalChannelConfig macLcConfig
5171 * @return ROK - success
5174 * ****************************************************************/
5175 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5178 macLcConfig->ul_SpecificParameters = NULLP;
5179 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5180 if(!macLcConfig->ul_SpecificParameters)
5182 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5186 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5187 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5188 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5189 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5190 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5191 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5192 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5194 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5195 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5196 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5198 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5201 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5203 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5204 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5205 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5207 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5210 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5212 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5213 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5214 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5218 /*******************************************************************
5220 * @brief Builds RLC Bearer to Add/Mod list
5224 * Function :BuildRlcBearerToAddModList
5226 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5228 * @params[in] rlc_BearerToAddModList
5230 * @return ROK - success
5233 * ****************************************************************/
5234 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5236 uint8_t idx, elementCnt;
5239 rlcBearerList->list.count = elementCnt;
5240 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5242 rlcBearerList->list.array = NULLP;
5243 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5244 if(!rlcBearerList->list.array)
5246 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5250 for(idx=0; idx<rlcBearerList->list.count; idx++)
5252 rlcBearerList->list.array[idx] = NULLP;
5253 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5254 if(!rlcBearerList->list.array[idx])
5256 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5262 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5264 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5265 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5267 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5271 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5272 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5274 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5275 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5276 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5277 if(!rlcBearerList->list.array[idx]->rlc_Config)
5279 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5283 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5285 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5289 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5290 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5291 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5293 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5297 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5299 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5306 /*******************************************************************
5308 * @brief Free memory allocated for CellGroupConfig
5312 * Function : FreeMemCellGrpCfg
5314 * Functionality: Deallocating memory of CellGroupConfig
5316 * @params[in] pointer to CellGroupConfigRrc_t
5318 * @return ROK - success
5321 ******************************************************************/
5322 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5325 SpCellConfig_t *spCellCfg=NULLP;
5326 ServingCellConfig_t *srvCellCfg=NULLP;
5327 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5328 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5329 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5330 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5331 struct RLC_Config *rlcConfig=NULLP;
5332 struct LogicalChannelConfig *macLcConfig=NULLP;
5333 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5334 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5335 struct TAG_Config *tagConfig=NULLP;
5336 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5337 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5338 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5340 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5343 if(rlcBearerList->list.array)
5345 for(idx=0; idx<rlcBearerList->list.count; idx++)
5347 if(rlcBearerList->list.array[idx])
5349 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5350 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5353 if(rlcConfig->choice.am)
5355 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5356 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5357 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5359 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5361 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5364 if(macLcConfig->ul_SpecificParameters)
5366 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5367 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5368 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5370 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5372 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5375 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5377 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5380 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5383 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5384 if(schedulingRequestConfig)
5386 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5389 if(schReqList->list.array)
5391 for(idx=0;idx<schReqList->list.count; idx++)
5393 if(schReqList->list.array[idx])
5395 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5396 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5399 CU_FREE(schReqList->list.array, schReqList->list.size);
5401 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5402 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5403 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5405 if(macCellGrpCfg->bsr_Config)
5407 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5409 tagConfig = macCellGrpCfg->tag_Config;
5412 tagList = tagConfig->tag_ToAddModList;
5415 if(tagList->list.array)
5417 for(idx=0; idx<tagList->list.count; idx++)
5419 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5421 CU_FREE(tagList->list.array, tagList->list.size);
5423 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5425 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5428 phrConfig = macCellGrpCfg->phr_Config;
5431 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5432 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5435 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5438 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5441 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5442 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5445 spCellCfg = cellGrpCfg->spCellConfig;
5448 if(spCellCfg->servCellIndex)
5450 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5452 if(spCellCfg->spCellConfigDedicated)
5454 srvCellCfg = spCellCfg->spCellConfigDedicated;
5455 if(srvCellCfg->initialDownlinkBWP)
5457 dlBwp = srvCellCfg->initialDownlinkBWP;
5458 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5460 if(srvCellCfg->defaultDownlinkBWP_Id)
5462 if(srvCellCfg->uplinkConfig)
5464 if(srvCellCfg->pdsch_ServingCellConfig)
5466 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5467 if(pdschCfg->choice.setup)
5469 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5470 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5472 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5473 ServingCellConfig__pdsch_ServingCellConfig));
5475 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5476 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5478 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5480 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5482 if(dlBwp->pdcch_Config)
5484 if(dlBwp->pdsch_Config)
5486 FreeBWPDlDedPdschCfg(dlBwp);
5487 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5489 FreeBWPDlDedPdcchCfg(dlBwp);
5490 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5492 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5494 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5496 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5498 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5500 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5505 /*******************************************************************
5507 * @brief Fills CellGroupConfig
5511 * Function : fillCellGrpCfg
5513 * Functionality: Fills CellGroupConfig
5515 * @params[in] pointer to CellGroupConfigRrc_t
5517 * @return ROK - success
5520 ******************************************************************/
5522 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5524 uint8_t ret = RFAILED;
5525 CellGroupConfigRrc_t cellGrpCfg;
5526 asn_enc_rval_t encRetVal;
5530 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5532 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5533 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5534 if(!cellGrpCfg.rlc_BearerToAddModList)
5536 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5539 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5541 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5545 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5546 cellGrpCfg.mac_CellGroupConfig = NULLP;
5547 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5548 if(!cellGrpCfg.mac_CellGroupConfig)
5550 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5553 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5555 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5560 cellGrpCfg.physicalCellGroupConfig = NULLP;
5561 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5562 if(!cellGrpCfg.physicalCellGroupConfig)
5564 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5567 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5569 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5573 cellGrpCfg.spCellConfig = NULLP;
5574 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5575 if(!cellGrpCfg.spCellConfig)
5577 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5580 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5582 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5586 cellGrpCfg.sCellToAddModList = NULLP;
5587 cellGrpCfg.sCellToReleaseList = NULLP;
5588 cellGrpCfg.ext1 = NULLP;
5590 /* encode cellGrpCfg into duToCuRrcContainer */
5591 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5592 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5594 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5595 /* Encode results */
5596 if(encRetVal.encoded == ENCODE_FAIL)
5598 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5599 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5604 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5605 for(int i=0; i< encBufSize; i++)
5607 DU_LOG("%x",encBuf[i]);
5611 cellGrp->size = encBufSize;
5612 CU_ALLOC(cellGrp->buf, cellGrp->size);
5615 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5618 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5622 FreeMemCellGrpCfg(&cellGrpCfg);
5626 /*******************************************************************
5628 * @brief Free UE Capability RAT container
5632 * Function : freeUeCapRatCont
5635 * Free UE Capability RAT conatiner
5638 * @return ROK - success
5641 * ****************************************************************/
5642 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5645 FeatureSets_t *featureSets;
5647 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5649 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5651 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5652 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5654 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5657 if(ueNrCap->featureSets)
5659 featureSets = ueNrCap->featureSets;
5660 if(featureSets->featureSetsDownlinkPerCC)
5662 if(featureSets->featureSetsDownlinkPerCC->list.array)
5664 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5666 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5667 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5668 sizeof(ModulationOrder_t));
5669 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5671 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5673 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5676 if(featureSets->featureSetsUplinkPerCC)
5678 if(featureSets->featureSetsUplinkPerCC->list.array)
5680 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5682 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5684 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5685 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5686 sizeof(ModulationOrder_t));
5687 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5690 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5692 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5694 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5698 /*******************************************************************
5700 * @brief Free UE capability RAT container list
5704 * Function : freeUeCapRatContList
5706 * Functionality: Free UE capability RAT container list
5709 * @return ROK - success
5712 * ****************************************************************/
5713 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5716 if(ueCapablityList->list.array)
5718 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5720 if(ueCapablityList->list.array[idx])
5721 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5723 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5727 /*******************************************************************
5729 * @brief Fill feature sets
5733 * Function : fillFeatureSets
5735 * Functionality: Fill feature sets
5738 * @return ROK - success
5741 * ****************************************************************/
5742 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5744 uint8_t idx, elementCnt;
5746 featureSets->featureSetsDownlink = NULLP;
5747 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5748 if(!featureSets->featureSetsDownlinkPerCC)
5750 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5755 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5756 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5757 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5758 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5760 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5764 for(idx = 0; idx < elementCnt; idx++)
5766 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5767 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5769 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5775 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5776 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5777 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5778 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5779 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5781 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5782 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5784 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5787 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5789 featureSets->featureSetsUplink = NULLP;
5790 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5791 if(!featureSets->featureSetsUplinkPerCC)
5793 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5798 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5799 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5800 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5801 if(!featureSets->featureSetsUplinkPerCC->list.array)
5803 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5807 for(idx = 0; idx < elementCnt; idx++)
5809 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5810 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5812 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5818 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5819 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5820 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5821 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5822 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5823 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5825 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5826 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5828 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5831 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5836 /*******************************************************************
5838 * @brief Fill UE capability RAT container
5842 * Function : fillUeCapRatCont
5844 * Functionality: Fill UE capability RAT container
5846 * @params[in] UE Capability RAT container buffer
5847 * @return ROK - success
5850 * ****************************************************************/
5851 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5854 uint8_t idx, elementCnt;
5855 asn_enc_rval_t encRetVal;
5856 UE_NR_Capability_t ueNrCap;
5860 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5862 /* Filling PDCP parameters */
5863 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5864 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5865 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5866 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5867 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5868 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5869 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5870 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5871 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5872 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5873 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5874 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5875 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5876 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5877 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5878 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5879 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5881 ueNrCap.rlc_Parameters = NULLP;
5882 ueNrCap.mac_Parameters = NULLP;
5884 /* Filling PHY parameters */
5885 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5886 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5887 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5888 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5889 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5891 /* Filling RF parameters */
5893 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5894 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5895 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5896 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5898 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5903 for(idx = 0; idx < elementCnt; idx++)
5905 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5906 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
5916 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
5917 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
5918 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
5920 ueNrCap.measAndMobParameters = NULLP;
5921 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
5922 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
5923 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
5924 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
5925 ueNrCap.featureSets = NULLP;
5927 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
5928 if(!ueNrCap.featureSets)
5930 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5935 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
5937 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
5942 ueNrCap.featureSetCombinations = NULLP;
5943 ueNrCap.lateNonCriticalExtension = NULLP;
5944 ueNrCap.nonCriticalExtension = NULLP;
5946 /* encode UE Capability RAT Container List into duToCuRrcContainer */
5947 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
5948 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5950 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
5952 /* Encode results */
5953 if(encRetVal.encoded == ENCODE_FAIL)
5955 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
5956 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5961 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
5962 for(int i=0; i< encBufSize; i++)
5964 DU_LOG("%x",encBuf[i]);
5968 ueCapRatContBuf->size = encBufSize;
5969 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
5970 if(!ueCapRatContBuf->buf)
5972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
5975 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
5979 freeUeCapRatCont(&ueNrCap);
5983 /*******************************************************************
5985 * @brief Fill UE Capability RAT container list
5989 * Function : fillUeCapRatContList
5991 * Functionality: Fill UE Capability RAT container list
5994 * @params[in] UE capability RAT container list buffer
5995 * @return ROK - success
5998 * ****************************************************************/
5999 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6001 uint8_t ret = RFAILED;
6002 uint8_t idx, elementCnt;
6003 asn_enc_rval_t encRetVal;
6004 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6009 ueCapablityList.list.count = elementCnt;
6010 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6012 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6013 if(!ueCapablityList.list.array)
6015 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6020 for(idx=0; idx<elementCnt; idx++)
6022 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6023 if(ueCapablityList.list.array[idx] == NULLP)
6025 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6031 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6032 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6034 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6035 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6036 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6038 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6039 &ueCapablityList, PrepFinalEncBuf, encBuf);
6041 /* Encode results */
6042 if(encRetVal.encoded == ENCODE_FAIL)
6044 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6045 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6050 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6051 for(int i=0; i< encBufSize; i++)
6053 DU_LOG("%x",encBuf[i]);
6057 ueCapablityListBuf->size = encBufSize;
6058 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6059 if(!ueCapablityListBuf->buf)
6061 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6064 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6068 freeUeCapRatContList(&ueCapablityList);
6072 /*******************************************************************
6074 * @brief Fills CuToDuContainer
6078 * Function : fillCuToDuContainer
6080 * Functionality: Fills CuToDuContainer
6082 * @params[in] pointer to CUtoDURRCInformation_t
6084 * @return ROK - success
6087 ******************************************************************/
6089 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6091 uint8_t elementCnt = 0;
6093 uint8_t idx, idx2, rrcBufLen;
6095 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6096 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6098 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6101 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6103 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6104 if(rrcMsg->iE_Extensions)
6107 rrcMsg->iE_Extensions->list.count = elementCnt;
6108 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6110 /* Initialize the CUtoDURRCInformation_ExtIEs */
6111 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6113 if(rrcMsg->iE_Extensions->list.array == NULLP)
6115 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6119 for(idx=0; idx<elementCnt; idx++)
6121 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6122 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6128 /* Filling CellGroupConfig_t IE */
6129 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6130 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6131 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6132 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6133 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6138 /*******************************************************************
6140 * @brief Free CuToDuContainer
6144 * Function : FreeCuToDuInfo
6146 * Functionality: Free CuToDuContainer
6148 * @params[in] pointer to CUtoDURRCInformation_t
6150 * @return ROK - success
6153 ******************************************************************/
6155 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6159 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6161 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6162 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6163 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6165 if(rrcMsg->iE_Extensions)
6167 if(rrcMsg->iE_Extensions->list.array)
6169 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6171 if(rrcMsg->iE_Extensions->list.array[idx])
6173 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6175 case ProtocolIE_ID_id_CellGroupConfig:
6176 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6178 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6179 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6184 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6185 rrcMsg->iE_Extensions->list.array[idx]->id);
6191 for(idx2 = 0; idx2 < idx; idx2++)
6193 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6195 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6199 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6202 /*******************************************************************
6204 * @brief Builds and sends the UE Setup Request
6208 * Function : BuildAndSendUeContextSetupReq
6210 * Functionality: Constructs the UE Setup Request and sends
6211 * it to the CU through SCTP.
6215 * @return ROK - success
6218 * ****************************************************************/
6219 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6220 uint16_t rrcContLen, uint8_t *rrcContainer)
6223 uint8_t SplCellListret;
6224 uint8_t SrbSetupret;
6226 uint8_t idx, bufLen;
6228 F1AP_PDU_t *f1apMsg = NULLP;
6229 UEContextSetupRequest_t *ueSetReq = NULLP;
6230 asn_enc_rval_t encRetVal; /* Encoder return value */
6231 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6232 uint8_t ret= RFAILED;
6236 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6238 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6239 if(f1apMsg == NULLP)
6241 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6245 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6246 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6247 if(f1apMsg->choice.initiatingMessage == NULLP)
6249 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6253 f1apMsg->choice.initiatingMessage->procedureCode = \
6254 ProcedureCode_id_UEContextSetup;
6255 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6256 f1apMsg->choice.initiatingMessage->value.present = \
6257 InitiatingMessage__value_PR_UEContextSetupRequest;
6259 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6262 ueSetReq->protocolIEs.list.count = elementCnt;
6263 ueSetReq->protocolIEs.list.size = \
6264 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6266 /* Initialize the UESetup members */
6267 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6269 if(ueSetReq->protocolIEs.list.array == NULLP)
6271 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6275 for(idx1=0; idx1<elementCnt; idx1++)
6277 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6278 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6286 /*GNB CU UE F1AP ID*/
6287 ueSetReq->protocolIEs.list.array[idx]->id = \
6288 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6289 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6290 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6291 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6292 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6294 /*GNB DU UE F1AP ID*/
6296 ueSetReq->protocolIEs.list.array[idx]->id = \
6297 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6298 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6299 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6300 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6301 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6305 ueSetReq->protocolIEs.list.array[idx]->id = \
6306 ProtocolIE_ID_id_SpCell_ID;
6307 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6308 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6309 UEContextSetupRequestIEs__value_PR_NRCGI;
6310 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6316 /*Served Cell Index*/
6318 ueSetReq->protocolIEs.list.array[idx]->id = \
6319 ProtocolIE_ID_id_ServCellIndex;
6320 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6321 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6322 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6323 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6326 /*CellULConfigured*/
6328 ueSetReq->protocolIEs.list.array[idx]->id = \
6329 ProtocolIE_ID_id_SpCellULConfigured;
6330 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6331 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6332 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6333 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6334 CellULConfigured_none;
6336 /*CUtoDURRCContainer*/
6338 ueSetReq->protocolIEs.list.array[idx]->id = \
6339 ProtocolIE_ID_id_CUtoDURRCInformation;
6340 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6341 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6342 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6343 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6348 /*Special Cells to be SetupList*/
6350 ueSetReq->protocolIEs.list.array[idx]->id = \
6351 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6352 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6353 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6354 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6355 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6356 if(SplCellListret != ROK)
6360 /*SRBs To Be Setup List*/
6362 ueSetReq->protocolIEs.list.array[idx]->id = \
6363 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6364 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6365 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6366 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6367 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6368 if(SrbSetupret != ROK)
6372 /*DRBs to Be Setup List*/
6374 ueSetReq->protocolIEs.list.array[idx]->id = \
6375 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6376 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6377 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6378 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6379 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6384 /* RRC Container for security mode */
6386 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6387 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6388 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6389 UEContextSetupRequestIEs__value_PR_RRCContainer;
6390 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6392 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6393 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6394 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6395 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6397 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6400 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6401 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6403 /* RRC delivery status request */
6405 ueSetReq->protocolIEs.list.array[idx]->id = \
6406 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6407 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6408 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6409 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6410 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6411 RRCDeliveryStatusRequest_true;
6413 /* Bit Rate hardcoded as in reference logs */
6415 ueSetReq->protocolIEs.list.array[idx]->id = \
6416 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6417 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6418 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6419 UEContextSetupRequestIEs__value_PR_BitRate;
6420 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6422 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6423 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6424 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6425 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6427 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6430 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6431 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6433 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6435 /* Encode the F1SetupRequest type as APER */
6436 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6438 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6440 /* Encode results */
6441 if(encRetVal.encoded == ENCODE_FAIL)
6443 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6444 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6449 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6450 for(int i=0; i< encBufSize; i++)
6452 DU_LOG("%x",encBuf[i]);
6457 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6459 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6465 FreeUeContextSetupReq(f1apMsg);
6468 }/* End of BuildAndSendUeContextSetupReq*/
6471 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6473 uint8_t idx, duUeF1apId;
6474 UEContextSetupResponse_t *ueCtxtSetupRsp;
6475 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
6477 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
6479 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
6481 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6483 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6488 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
6491 /****************************************************************
6492 * @brief Function to process Ul Rrc Msg received from DU
6496 * Function : procUlRrcMsg
6499 * - Function to process Ul Rrc Msg received from DU
6502 * @return ROK - success
6505 * ****************************************************************/
6507 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6509 uint8_t idx, ret, srbId, rrcMsgType;
6510 uint8_t cuUeF1apId, duUeF1apId;
6511 uint8_t *rrcContainer = NULLP;
6512 uint16_t rrcContLen;
6513 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6516 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6518 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6520 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6522 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6524 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6527 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6529 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6532 case ProtocolIE_ID_id_SRBID:
6533 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6535 case ProtocolIE_ID_id_RRCContainer:
6537 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6538 CU_ALLOC(rrcContainer, rrcContLen)
6541 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6544 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6550 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6556 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6557 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6558 if(rrcMsgType == REGISTRATION_ACCEPT)
6560 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6561 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6563 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6565 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6566 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6567 rrcContLen, rrcContainer);
6569 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6571 /* To trigger the DL RRC Msg for RRC Reconfig */
6572 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6573 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6574 if(rrcMsgType == RRC_RECONFIG)
6576 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6577 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6580 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6582 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6583 BuildAndSendUeContextModificationReq(duUeF1apId);
6589 /****************************************************************
6590 * @brief Build And Send F1ResetAck
6594 * Function : FreeF1ResetAck
6597 * - Build And Send F1ResetRSP
6600 * @return ROK - success
6603 * ****************************************************************/
6604 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6607 ResetAcknowledge_t *f1ResetAck;
6611 if(f1apMsg->choice.successfulOutcome)
6613 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6615 if(f1ResetAck->protocolIEs.list.array)
6617 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6619 if(f1ResetAck->protocolIEs.list.array[idx])
6621 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6624 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6626 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6628 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6632 /****************************************************************
6633 * @brief Build And Send F1ResetAck
6637 * Function : BuildAndSendF1ResetAck
6640 * - Build And Send F1ResetRSP
6643 * @return ROK - success
6646 * ****************************************************************/
6648 uint8_t BuildAndSendF1ResetAck()
6651 uint8_t elementCnt = 0;
6652 uint8_t ret = RFAILED;
6653 F1AP_PDU_t *f1apMsg = NULL;
6654 ResetAcknowledge_t *f1ResetAck = NULLP;
6655 asn_enc_rval_t encRetVal;
6656 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6659 /* Allocate the memory for F1ResetRequest_t */
6660 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6661 if(f1apMsg == NULLP)
6663 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6667 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6669 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6670 if(f1apMsg->choice.successfulOutcome == NULLP)
6672 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6676 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6677 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6678 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6679 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6683 f1ResetAck->protocolIEs.list.count = elementCnt;
6684 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6686 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6687 if(f1ResetAck->protocolIEs.list.array == NULLP)
6689 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6693 for(idx=0; idx<elementCnt; idx++)
6695 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6696 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6703 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6704 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6705 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6706 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6708 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6710 /* Encode the F1SetupRequest type as UPER */
6711 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6713 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6715 /* Check encode results */
6716 if(encRetVal.encoded == ENCODE_FAIL)
6718 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6719 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6724 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6725 for(int i=0; i< encBufSize; i++)
6727 DU_LOG("%x",encBuf[i]);
6731 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6733 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6741 FreeF1ResetAck(f1apMsg);
6744 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6748 if(ulInfo->list.array)
6750 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6752 if(ulInfo->list.array[arrIdx])
6754 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6756 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6758 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6760 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6761 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6762 gTPTunnel->gTP_TEID.size);
6764 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6765 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6766 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6768 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6769 sizeof(GTPTunnel_t));
6771 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6774 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6777 /*******************************************************************
6779 * @brief Builds the Uplink Tunnel Info
6783 * Function : BuildUlTnlInfoforDrb2
6785 * Functionality: Constructs the UL TnlInfo For DRB list
6787 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6789 * @return ROK - success
6792 * ****************************************************************/
6793 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6799 ulInfo->list.count = ulCnt;
6800 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6801 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6802 if(ulInfo->list.array == NULLP)
6804 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6807 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6809 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6810 if(ulInfo->list.array[arrIdx] == NULLP)
6812 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6818 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6819 UPTransportLayerInformation_PR_gTPTunnel;
6822 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6823 sizeof(GTPTunnel_t));
6824 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6826 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6829 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6830 transportLayerAddress.size = 4*sizeof(uint8_t);
6831 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6832 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6833 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6834 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6835 transportLayerAddress.buf == NULLP)
6837 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6841 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6842 transportLayerAddress.buf[0] = 192;
6843 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6844 transportLayerAddress.buf[1] = 168;
6845 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6846 transportLayerAddress.buf[2] = 130;
6847 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6848 transportLayerAddress.buf[3] = 82;
6849 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6850 transportLayerAddress.bits_unused = 0;
6853 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6854 = 4 * sizeof(uint8_t);
6855 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6856 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6857 gTPTunnel->gTP_TEID.size);
6858 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6861 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6864 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6865 gTP_TEID.buf[0] = 0;
6866 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6867 gTP_TEID.buf[1] = 0;
6868 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6869 gTP_TEID.buf[2] = 0;
6870 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6871 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
6874 }/*End of BuildULTnlInfo*/
6875 /*******************************************************************
6877 * @brief freeing the DRB 2 item
6881 * Function : FreeDrb2Item
6883 * Functionality: freeing the DRB 2 item
6885 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6887 * @return ROK - success
6890 * ****************************************************************/
6892 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6895 SNSSAI_t *snssai =NULLP;
6896 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6898 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6899 switch(drbItem->qoSInformation.present)
6901 case QoSInformation_PR_NOTHING:
6903 case QoSInformation_PR_eUTRANQoS:
6905 if(drbItem->qoSInformation.choice.eUTRANQoS)
6907 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6911 case QoSInformation_PR_choice_extension:
6913 if(drbItem->qoSInformation.choice.choice_extension)
6915 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6917 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
6920 CU_FREE(snssai->sST.buf,snssai->sST.size);
6926 CU_FREE(snssai->sD->buf,snssai->sD->size);
6928 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
6931 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
6932 if(flowMap->list.array)
6934 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
6936 if(flowMap->list.array[arrIdx] )
6938 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
6939 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
6942 CU_FREE(flowMap->list.array,flowMap->list.size);
6945 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6951 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
6952 if(drbItem->uLConfiguration)
6954 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
6957 /*******************************************************************
6959 * @brief filling the DRB 2 item
6963 * Function : FillDrb2Item
6965 * Functionality: filling the DRB 2 item
6967 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6969 * @return ROK - success
6972 * ****************************************************************/
6974 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6979 drbItem->dRBID = DRB2;
6982 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6984 switch(drbItem->qoSInformation.present)
6986 case QoSInformation_PR_NOTHING:
6990 case QoSInformation_PR_eUTRANQoS:
6993 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6994 if(drbItem->qoSInformation.choice.eUTRANQoS)
6996 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
6999 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7000 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7001 PriorityLevel_no_priority;
7003 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7004 Pre_emptionCapability_may_trigger_pre_emption;
7006 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7007 Pre_emptionVulnerability_pre_emptable;
7011 case QoSInformation_PR_choice_extension:
7013 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7014 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7016 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7020 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7021 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7022 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7023 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7026 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7031 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7032 choice_extension->value.choice.DRB_Information.sNSSAI);
7035 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7039 /*Flows mapped to DRB List*/
7040 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7041 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7044 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7050 /*ULUPTNLInformation To Be Setup List*/
7051 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7054 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7059 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7061 /*UL Configuration*/
7062 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7063 if(drbItem->uLConfiguration == NULLP)
7065 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7068 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7071 /*******************************************************************
7073 * @brief Builds the DRB to be Setup Mod ItemIes
7077 * Function : FillDrbItemList
7079 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7081 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7083 * @return ROK - success
7086 * ****************************************************************/
7088 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7090 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7091 drbItemIe->criticality = Criticality_reject;
7092 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7094 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7096 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7101 /*******************************************************************
7103 * @brief free the DRB to be Setup Mod list
7107 * Function : FreeDrbToBeSetupModList
7109 * Functionality: free the DRB to be Setup Mod list
7111 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7113 * @return ROK - success
7116 * ****************************************************************/
7117 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7120 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7122 if(drbSet->list.array)
7124 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7126 if(drbSet->list.array[arrIdx] != NULLP)
7130 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7131 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7133 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7136 CU_FREE(drbSet->list.array, drbSet->list.size);
7142 /*******************************************************************
7144 * @brief Builds the DRB to be Setup Mod list
7148 * Function : BuildDrbToBeSetupModList
7150 * Functionality: Constructs the DRB to be Setup Mod list
7152 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7154 * @return ROK - success
7157 * ****************************************************************/
7159 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7166 drbSet->list.count = drbCnt;
7167 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7168 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7169 if(drbSet->list.array == NULLP)
7171 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7174 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7176 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7177 if(drbSet->list.array[arrIdx] == NULLP)
7179 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7185 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7188 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7193 /*******************************************************************
7195 * @brief free the UeContextModification Request
7199 * Function : FreeUeContextModicationRequest
7201 * Functionality : deallocation of memory allocated in UeContextModiification
7204 * @params[in] F1AP_PDU_t *f1apMsg
7208 * ****************************************************************/
7209 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7211 uint8_t arrIdx =0 , ieId=0;
7212 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7216 if(f1apMsg->choice.initiatingMessage)
7218 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7219 if(UeContextModifyReq->protocolIEs.list.array)
7221 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7223 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7225 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7228 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7230 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7232 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7234 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7235 choice.DRBs_ToBeSetupMod_List);
7239 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7242 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7244 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7246 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7249 /*******************************************************************
7251 * @brief Builds the Ue Context Modification Req
7255 * Function : BuildAndSendUeContextModificationReq
7257 * Functionality: Constructs the Ue Context Modification Req
7261 * @return ROK - success
7264 * ****************************************************************/
7265 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
7268 uint8_t elementCnt = 0;
7269 uint8_t ret = RFAILED;
7270 F1AP_PDU_t *f1apMsg = NULLP;
7271 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7273 asn_enc_rval_t encRetVal;
7274 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7278 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7279 if(f1apMsg == NULLP)
7281 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7285 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7287 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7288 if(f1apMsg->choice.initiatingMessage == NULLP)
7290 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7293 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7294 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7295 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7297 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7300 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7301 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7303 /* Initialize the UE context modification members */
7304 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7305 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7307 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7311 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7313 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7314 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7316 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7323 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7324 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7325 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7326 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7327 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
7330 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7331 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7332 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7333 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7334 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
7337 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7338 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7339 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7340 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7341 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7342 value.choice.DRBs_ToBeSetupMod_List));
7347 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7349 /* Encode the F1SetupRequest type as APER */
7350 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7352 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7355 /* Encode results */
7356 if(encRetVal.encoded == ENCODE_FAIL)
7358 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7359 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7364 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7365 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7367 DU_LOG("%x",encBuf[ieIdx]);
7371 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7373 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7381 FreeUeContextModicationRequest(f1apMsg);
7384 /*****************************************************************i
7386 * @brief Free memory allocated for UE Context Release Command
7390 * Function : FreeUeContextReleaseCommand
7393 * - Free memory allocated for UE Context Release Command
7395 * @params[in] F1AP_PDU_t *f1apMsg
7398 * *************************************************************/
7399 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
7402 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
7406 if(f1apMsg->choice.initiatingMessage)
7408 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7409 if(ueReleaseCommand->protocolIEs.list.array)
7411 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
7413 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7415 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
7417 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7419 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7422 /*******************************************************************
7424 * @brief Builds the Ue Context Release Command
7428 * Function : BuildAndSendUeContextReleaseCommand
7430 * Functionality: Constructs the Ue Context Release Command
7434 * @return ROK - success
7437 * ****************************************************************/
7438 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
7440 bool memAllocFailed = false;
7441 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
7442 F1AP_PDU_t *f1apMsg = NULLP;
7443 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
7445 asn_enc_rval_t encRetVal;
7446 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
7450 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7451 if(f1apMsg == NULLP)
7453 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
7457 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7459 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7460 if(f1apMsg->choice.initiatingMessage == NULLP)
7462 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
7465 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
7466 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7467 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
7469 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7472 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
7473 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
7475 /* Initialize the UE context modification members */
7476 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
7477 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
7479 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
7483 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7485 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7486 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
7488 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
7489 memAllocFailed = true;
7494 if(memAllocFailed == true)
7499 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7500 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7501 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7502 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
7503 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
7506 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7507 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7508 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7509 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
7510 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
7513 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
7514 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7515 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7516 UEContextReleaseCommandIEs__value_PR_Cause;
7517 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7518 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
7519 CauseRadioNetwork_normal_release;
7521 /* RRC Container for RRC release */
7523 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
7524 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7525 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7526 UEContextReleaseCommandIEs__value_PR_RRCContainer;
7527 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
7529 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
7530 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7531 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7532 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7534 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
7537 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
7538 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
7540 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7542 /* Encode the UE Context Release Command type as APER */
7543 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7545 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7548 /* Encode results */
7549 if(encRetVal.encoded == ENCODE_FAIL)
7551 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
7552 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7557 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
7558 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7560 DU_LOG("%x",encBuf[ieIdx]);
7564 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7566 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
7574 FreeUeContextReleaseCommand(f1apMsg);
7577 /*******************************************************************
7579 * @brief process Ue context release request
7583 * Function : procUeContextReleaseReq
7586 * - process Ue context release request
7588 * @params[in] F1AP_PDU_t *f1apMsg
7589 * @return ROK - success
7592 * ****************************************************************/
7593 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
7595 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
7597 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
7598 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
7600 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
7602 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
7604 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7606 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7609 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7611 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7618 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
7620 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
7625 /*******************************************************************
7627 * @brief processing of Gnb-DU config update
7631 * Function : procGnbDuUpdate
7634 * - processing of Gnb-DU config update
7636 * @params[in] F1AP_PDU_t *f1apMsg
7637 * @return ROK - success
7640 * ****************************************************************/
7641 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
7643 bool cellToBeDelete = false;
7644 uint8_t ieIdx = 0, ueIdx = 0;
7645 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
7647 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
7649 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
7651 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
7653 case ProtocolIE_ID_id_TransactionID:
7655 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
7657 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
7659 cellToBeDelete = true;
7662 case ProtocolIE_ID_id_gNB_DU_ID:
7666 if(BuildAndSendDUUpdateAck() != ROK)
7668 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
7672 if(cellToBeDelete == false)
7674 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7675 if(BuildAndSendF1ResetReq() != ROK)
7677 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
7683 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
7685 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
7686 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
7692 /*******************************************************************
7694 * @brief Handles received F1AP message and sends back response
7698 * Function : F1APMsgHdlr
7701 * - Decodes received F1AP control message
7702 * - Prepares response message, encodes and sends to SCTP
7705 * @return ROK - success
7708 * ****************************************************************/
7709 void F1APMsgHdlr(Buffer *mBuf)
7715 F1AP_PDU_t *f1apMsg = NULLP;
7716 asn_dec_rval_t rval; /* Decoder return value */
7717 F1AP_PDU_t f1apasnmsg ;
7719 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7720 ODU_PRINT_MSG(mBuf, 0,0);
7722 /* Copy mBuf into char array to decode it */
7723 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7724 CU_ALLOC(recvBuf, (Size)recvBufLen);
7726 if(recvBuf == NULLP)
7728 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
7731 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7733 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
7737 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
7738 for(i=0; i< recvBufLen; i++)
7740 DU_LOG("%x",recvBuf[i]);
7743 /* Decoding flat buffer into F1AP messsage */
7744 f1apMsg = &f1apasnmsg;
7745 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7747 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7748 CU_FREE(recvBuf, (Size)recvBufLen);
7750 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7752 DU_LOG("\nERROR --> F1AP : ASN decode failed");
7756 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7758 switch(f1apMsg->present)
7760 case F1AP_PDU_PR_initiatingMessage:
7762 switch(f1apMsg->choice.initiatingMessage->value.present)
7764 case InitiatingMessage__value_PR_Reset:
7766 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
7767 BuildAndSendF1ResetAck();
7771 case InitiatingMessage__value_PR_F1SetupRequest:
7773 DU_LOG("\nINFO --> F1AP : F1 setup request received");
7774 BuildAndSendF1SetupRsp();
7778 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7780 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
7781 procGnbDuUpdate(f1apMsg);
7784 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7786 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
7787 procInitULRRCMsg(f1apMsg);
7790 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7792 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
7793 procUlRrcMsg(f1apMsg);
7797 case InitiatingMessage__value_PR_RRCDeliveryReport:
7799 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
7802 case InitiatingMessage__value_PR_UEContextReleaseRequest:
7804 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
7805 procUeContextReleaseReq(f1apMsg);
7810 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
7811 f1apMsg->choice.initiatingMessage->value.present);
7814 }/* End of switch(initiatingMessage) */
7818 case F1AP_PDU_PR_successfulOutcome:
7820 switch(f1apMsg->choice.successfulOutcome->value.present)
7822 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7824 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
7827 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7829 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
7830 procUeContextSetupResponse(f1apMsg);
7833 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
7835 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
7838 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
7840 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
7845 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
7846 f1apMsg->choice.successfulOutcome->value.present);
7849 }/* End of switch(successfulOutcome) */
7854 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7857 }/* End of switch(f1apMsg->present) */
7859 } /* End of F1APMsgHdlr */
7861 /**********************************************************************
7863 **********************************************************************/