1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
29 #include "ProtocolIE-SingleContainer.h"
31 #include "ModulationOrder.h"
33 #include "UE-CapabilityRAT-Container.h"
34 #include "UE-CapabilityRAT-ContainerList.h"
35 #include "UE-CapabilityRAT-ContainerListRRC.h"
36 #include "SupportedBandwidth.h"
37 #include "FeatureSetUplinkPerCC.h"
38 #include "FeatureSetDownlinkPerCC.h"
39 #include "FeatureSets.h"
40 #include "RF-Parameters.h"
41 #include "UE-NR-Capability.h"
42 #include "ProtocolExtensionContainer.h"
43 #include "CellGroupConfigRrc.h"
44 #include "MAC-CellGroupConfig.h"
45 #include "SchedulingRequestConfig.h"
46 #include "SchedulingRequestToAddMod.h"
47 #include "BSR-Config.h"
48 #include "TAG-Config.h"
50 #include "PHR-Config.h"
51 #include "RLC-Config.h"
52 #include "UL-AM-RLC.h"
53 #include "DL-AM-RLC.h"
54 #include "LogicalChannelConfig.h"
55 #include "RLC-BearerConfig.h"
56 #include "PhysicalCellGroupConfig.h"
57 #include "SpCellConfig.h"
58 #include "ServingCellConfig.h"
59 #include "ControlResourceSet.h"
60 #include "SearchSpace.h"
61 #include "PDCCH-Config.h"
62 #include "PDSCH-TimeDomainResourceAllocation.h"
63 #include "PDSCH-TimeDomainResourceAllocationList.h"
64 #include "DMRS-DownlinkConfig.h"
65 #include "PDSCH-Config.h"
66 #include "BWP-DownlinkDedicated.h"
67 #include "PUSCH-TimeDomainResourceAllocation.h"
68 #include "PUSCH-TimeDomainResourceAllocationList.h"
69 #include "DMRS-UplinkConfig.h"
70 #include "PUSCH-Config.h"
71 #include "SRS-ResourceId.h"
72 #include "SRS-Resource.h"
73 #include "SRS-ResourceSet.h"
74 #include "SRS-Config.h"
75 #include "PUCCH-Config.h"
76 #include "BWP-UplinkDedicated.h"
77 #include "PUSCH-ServingCellConfig.h"
78 #include "UplinkConfig.h"
79 #include "PDSCH-ServingCellConfig.h"
80 #include "EUTRANQoS.h"
81 #include "GBR-QosInformation.h"
82 #include "DRBs-ToBeSetupMod-List.h"
83 #include "DRBs-ToBeSetupMod-Item.h"
85 /* MACRO for CUtoDURRCInformation */
87 #define FREQ_DOM_RSRC_SIZE 6
88 #define CORESET0_END_PRB 48
89 #define CORESET1_NUM_PRB 24
90 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
91 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
92 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
93 #define PDCCH_SRCH_SPC_TWO_ID 2
95 #define SCRAMBLING_ID NR_PCI
96 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
97 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
98 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
99 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
100 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
101 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
102 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
103 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
104 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
106 /* MACRO Ddefine for PDSCH Configuration */
108 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
109 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
110 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
111 #define PDSCH_NUM_HARQ_PROC 5
112 #define PDSCH_MAPPING_TYPE_A 0
113 #define PDSCH_MAPPING_TYPE_B 1
115 /* MACRO Define for PUSCH Configuration */
116 #define PUSCH_K2_CFG1 3
117 #define PUSCH_K2_CFG2 4
119 #define PUSCH_MSG3_DELTA_PREAMBLE 0
120 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
121 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
122 #define PUSCH_MAX_MIMO_LAYERS 1
123 #define PUSCH_PROCESS_TYPE2_ENABLED false
124 #define PUSCH_MAPPING_TYPE_A 0
125 #define PUSCH_MAPPING_TYPE_B 1
127 /* MACRO defines for SRC config */
128 #define SRS_RSRC_ID 1
129 #define SRS_RSET_ID 1
130 #define SRS_COMB_OFFSET_N2 0
131 #define SRS_CYCLIC_SHIFT_N2 0
132 #define SRS_FREQ_DOM_POS 0
133 #define SRS_FREQ_DOM_SHIFT 0
138 #define APERIODIC_SRS_RESRC_TRIGGER 1
140 /* Macro definitions for DUtoCuRrcContainer */
141 #define CELL_GRP_ID 1
143 #define SR_PROHIBIT_TMR 5
144 #define SR_TRANS_MAX 2
145 #define PERIODIC_BSR_TMR 2
146 #define RETX_BSR_TMR 5
147 #define SR_DELAY_TMR 6
149 #define TIME_ALIGNMENT_TMR 7
150 #define PHR_PERIODIC_TMR 7
151 #define PHR_PROHIBHIT_TMR 0
152 #define PHR_PWR_FACTOR_CHANGE 3
153 #define PHR_MODE_OTHER_CG 0
156 #define SN_FIELD_LEN 0
157 #define T_POLL_RETRANSMIT 8
160 #define MAX_RETX_THRESHOLD 5
161 #define T_REASSEMBLY 8
162 #define T_STATUS_PROHIBHIT 7
163 #define MAC_LC_PRIORITY 1
164 #define PRIORTISIED_BIT_RATE 15
165 #define BUCKET_SIZE_DURATION 5
168 #define PDSCH_HARQ_ACK_CODEBOOK 1
169 #define SERV_CELL_IDX 0
170 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
171 #define ACTIVE_DL_BWP_ID 0
172 #define ACTIVE_UL_BWP_ID 0
173 #define SCRAMBLING_ID NR_PCI
174 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
175 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
176 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
177 /*******************************************************************
179 * @brief Sends F1 msg over SCTP
183 * Function : SendF1APMsg
185 * Functionality: Sends F1 msg over SCTP
187 * @params[in] Region region
189 * @return ROK - success
192 * ****************************************************************/
193 S16 SendF1APMsg(Region region, Pool pool)
195 Buffer *mBuf = NULLP;
197 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
199 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
201 ODU_PRINT_MSG(mBuf, 0,0);
203 if(sctpSend(mBuf) != ROK)
205 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
206 ODU_PUT_MSG_BUF(mBuf);
212 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
213 ODU_PUT_MSG_BUF(mBuf);
216 ODU_PUT_MSG_BUF(mBuf);
220 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
227 /*******************************************************************
229 * @brief Builds NRCell ID
233 * Function : BuildNrCellId
235 * Functionality: Building the NR Cell ID
237 * @params[in] BIT_STRING_t *nrcell
238 * @return ROK - success
241 * ****************************************************************/
243 S16 BuildNrCellId(BIT_STRING_t *nrcell)
245 memset(nrcell->buf, 0, nrcell->size);
247 nrcell->bits_unused = 4;
248 nrcell->size = 5 * sizeof(uint8_t);
252 /********************************************************************
254 * @brief Builds and sends the F1SetupResponse
258 * Function : BuildAndSendF1SetupRsp
260 * Functionality: Constructs the F1SetupResponse message and sends
261 * it back to the DU through SCTP.
263 * @params[in] void **buf,Buffer to which encoded pattern is written into
264 * @params[in] int *size,size of buffer
266 * @return ROK - success
269 * ****************************************************************/
270 S16 BuildAndSendF1SetupRsp()
273 uint8_t elementCnt,cellCnt;
274 F1AP_PDU_t *f1apMsg = NULL;
275 F1SetupResponse_t *f1SetupRsp;
276 GNB_CU_Name_t *cuName;
277 Cells_to_be_Activated_List_t *cellToActivate;
278 RRC_Version_t *rrcVer;
279 asn_enc_rval_t encRetVal;
280 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
282 /* Allocate the memory for F1SetupRequest_t */
283 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
286 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
289 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
291 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
292 if(f1apMsg->choice.successfulOutcome == NULLP)
294 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
295 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
299 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
300 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
301 f1apMsg->choice.successfulOutcome->value.present = \
302 SuccessfulOutcome__value_PR_F1SetupResponse;
303 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
306 f1SetupRsp->protocolIEs.list.count = elementCnt;
307 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
309 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
310 elementCnt * sizeof(F1SetupResponseIEs_t *));
311 if(f1SetupRsp->protocolIEs.list.array == NULLP)
313 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
314 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
315 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
319 for(idx=0; idx<elementCnt; idx++)
321 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
322 sizeof(F1SetupResponseIEs_t));
323 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
325 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
326 elementCnt * sizeof(F1SetupResponseIEs_t *));
327 CU_FREE(f1apMsg->choice.successfulOutcome, \
328 sizeof(SuccessfulOutcome_t));
329 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
336 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
337 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
338 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
339 F1SetupResponseIEs__value_PR_TransactionID;
340 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
345 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
346 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
347 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
348 F1SetupResponseIEs__value_PR_GNB_CU_Name;
349 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
350 cuName->size = sizeof(cuCfgParams.cuName);
352 CU_ALLOC(cuName->buf, sizeof(cuName->size));
353 if(cuName->buf == NULLP)
355 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
357 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
358 sizeof(F1SetupResponseIEs_t));
360 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
361 elementCnt * sizeof(F1SetupResponseIEs_t *));
362 CU_FREE(f1apMsg->choice.successfulOutcome,\
363 sizeof(SuccessfulOutcome_t));
364 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
367 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
369 /*Cells to be activated list*/
371 f1SetupRsp->protocolIEs.list.array[idx]->id = \
372 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
373 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
374 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
375 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
376 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
377 Cells_to_be_Activated_List;
379 cellToActivate->list.count = cellCnt;
380 cellToActivate->list.size = \
381 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
382 CU_ALLOC(cellToActivate->list.array,\
383 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
384 if(cellToActivate->list.array == NULLP)
386 CU_FREE(cuName->buf, sizeof(cuName->size));
387 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
389 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
390 sizeof(F1SetupResponseIEs_t));
392 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
393 elementCnt * sizeof(F1SetupResponseIEs_t *));
394 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
395 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
398 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
400 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
401 if(cellToActivate->list.array[ieIdx] == NULLP)
403 CU_FREE(cellToActivate->list.array,\
404 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
405 CU_FREE(cuName->buf, sizeof(cuName->size));
406 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
408 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
409 sizeof(F1SetupResponseIEs_t));
411 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
412 elementCnt * sizeof(F1SetupResponseIEs_t *));
413 CU_FREE(f1apMsg->choice.successfulOutcome, \
414 sizeof(SuccessfulOutcome_t));
415 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
419 cellToActivate->list.array[0]->id = \
420 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
421 cellToActivate->list.array[0]->criticality = Criticality_ignore;
422 cellToActivate->list.array[0]->value.present = \
423 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
424 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
425 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
426 CU_ALLOC(cellToActivate->list.array[0]->\
427 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
429 if(cellToActivate->list.array[0]->value.choice.\
430 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
433 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
435 CU_FREE(cellToActivate->list.array[ieIdx],\
436 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
439 CU_FREE(cellToActivate->list.array,\
440 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
441 CU_FREE(cuName->buf, sizeof(cuName->size));
442 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
444 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
445 sizeof(F1SetupResponseIEs_t));
447 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
448 elementCnt * sizeof(F1SetupResponseIEs_t *));
449 CU_FREE(f1apMsg->choice.successfulOutcome, \
450 sizeof(SuccessfulOutcome_t));
451 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
454 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
455 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
456 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
457 nRCGI.nRCellIdentity.size = 5;
458 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
459 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
461 if(cellToActivate->list.array[0]->value.choice.\
462 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
464 CU_FREE(cellToActivate->list.array[0]->\
465 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
467 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
469 CU_FREE(cellToActivate->list.array[ieIdx],\
470 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
473 CU_FREE(cellToActivate->list.array,\
474 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
475 CU_FREE(cuName->buf, sizeof(cuName->size));
476 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
478 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
479 sizeof(F1SetupResponseIEs_t));
481 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
482 elementCnt * sizeof(F1SetupResponseIEs_t *));
483 CU_FREE(f1apMsg->choice.successfulOutcome, \
484 sizeof(SuccessfulOutcome_t));
485 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
488 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
491 f1SetupRsp->protocolIEs.list.array[idx]->id = \
492 ProtocolIE_ID_id_GNB_CU_RRC_Version;
493 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
494 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
495 F1SetupResponseIEs__value_PR_RRC_Version;
496 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
497 rrcVer->latest_RRC_Version.size = RRC_SIZE;
499 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
500 if(rrcVer->latest_RRC_Version.buf == NULLP)
502 CU_FREE(cuName->buf, sizeof(cuName->size));
503 for(ieIdx=0; ieIdx<elementCnt; idx++)
505 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
506 sizeof(F1SetupResponseIEs_t));
508 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
509 elementCnt * sizeof(F1SetupResponseIEs_t *));
510 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
511 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
515 /* Need to check RRC Version */
516 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
517 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
518 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
519 if(rrcVer->iE_Extensions == NULLP)
521 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
522 CU_FREE(cuName->buf, sizeof(cuName->size));
523 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
525 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
526 sizeof(F1SetupResponseIEs_t));
528 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
529 elementCnt * sizeof(F1SetupResponseIEs_t *));
530 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
531 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
534 rrcVer->iE_Extensions->list.count = 1;
535 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
536 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
537 sizeof(struct RRC_Version_ExtIEs *));
538 if(rrcVer->iE_Extensions->list.array == NULLP)
540 CU_FREE(rrcVer->iE_Extensions,\
541 sizeof(ProtocolExtensionContainer_4624P81_t));
542 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
543 CU_FREE(cuName->buf, sizeof(cuName->size));
544 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
546 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
547 sizeof(F1SetupResponseIEs_t));
549 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
550 elementCnt * sizeof(F1SetupResponseIEs_t *));
551 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
552 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
555 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
556 sizeof(struct RRC_Version_ExtIEs));
557 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
559 CU_FREE(rrcVer->iE_Extensions->list.array,\
560 sizeof(struct RRC_Version_ExtIEs *));
561 CU_FREE(rrcVer->iE_Extensions,\
562 sizeof(ProtocolExtensionContainer_4624P81_t));
563 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
564 CU_FREE(cuName->buf, sizeof(cuName->size));
565 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
567 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
568 sizeof(F1SetupResponseIEs_t));
570 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
571 elementCnt * sizeof(F1SetupResponseIEs_t *));
572 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
573 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
576 rrcVer->iE_Extensions->list.array[0]->id = \
577 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
578 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
579 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
580 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
581 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
582 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
583 CU_ALLOC(rrcVer->iE_Extensions->list.\
584 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
586 if(rrcVer->iE_Extensions->list.\
587 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
589 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
590 sizeof(struct RRC_Version_ExtIEs));
591 CU_FREE(rrcVer->iE_Extensions->list.array,\
592 sizeof(struct RRC_Version_ExtIEs *));
593 CU_FREE(rrcVer->iE_Extensions,\
594 sizeof(ProtocolExtensionContainer_4624P81_t));
595 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
596 CU_FREE(cuName->buf, sizeof(cuName->size));
597 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
599 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
600 sizeof(F1SetupResponseIEs_t));
602 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
603 elementCnt * sizeof(F1SetupResponseIEs_t *));
604 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
605 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
608 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
609 Latest_RRC_Version_Enhanced.buf[0] = 0;
610 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
611 Latest_RRC_Version_Enhanced.buf[1] = 5;
612 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
613 Latest_RRC_Version_Enhanced.buf[2] = 15;
615 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
617 /* Encode the F1SetupRequest type as UPER */
618 memset(encBuf, 0, ENC_BUF_MAX_LEN);
620 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
623 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
624 CU_FREE(cuName->buf, sizeof(cuName->size));
625 for(idx=0; idx<elementCnt; idx++)
627 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
629 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
630 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
631 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
633 /* Check encode results */
634 if(encRetVal.encoded == ENCODE_FAIL)
636 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
637 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
642 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
643 for(int i=0; i< encBufSize; i++)
645 DU_LOG("%x",encBuf[i]);
650 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
652 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
657 }/* End of BuildAndSendF1SetupRsp */
659 /*******************************************************************
661 * @brief Builds and sends the DUUpdateAcknowledge
665 * Function : BuildAndSendDUUpdateAck
667 * Functionality: Constructs the DU Update Acknowledge message and sends
668 * it to the DU through SCTP.
672 * @return ROK - success
675 * ****************************************************************/
677 S16 BuildAndSendDUUpdateAck()
681 F1AP_PDU_t *f1apMsg = NULL;
682 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
683 asn_enc_rval_t enRetVal; /* Encoder return value */
685 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
687 /* Allocate the memory for F1SetupRequest_t */
688 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
691 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
695 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
697 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
698 if(f1apMsg->choice.successfulOutcome == NULLP)
700 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
701 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
705 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
706 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
707 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
708 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
711 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
712 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
714 /* Initialize the F1Setup members */
715 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
716 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
718 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
719 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
720 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
724 for(idx=0; idx<elementCnt; idx++)
726 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
727 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
729 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
730 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
731 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
738 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
739 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
740 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
741 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
742 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
744 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
746 /* Encode the F1SetupRequest type as UPER */
747 memset(encBuf, 0, ENC_BUF_MAX_LEN);
749 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
752 for(idx=0; idx<elementCnt; idx++)
754 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
756 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
757 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
758 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
760 /* Checking encode results */
761 if(enRetVal.encoded == ENCODE_FAIL)
763 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
764 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
769 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
770 for(int i=0; i< encBufSize; i++)
772 DU_LOG("%x",encBuf[i]);
777 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
779 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
785 }/* End of BuildAndSendDUUpdateAck*/
786 /*******************************************************************
788 * @brief deallocating the memory of F1reset msg
792 * Function : FreeF1ResetReq
795 * - freeing memory of F1reset request msg
801 * ****************************************************************/
802 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
805 Reset_t *f1ResetMsg = NULLP;
809 if(f1apMsg->choice.initiatingMessage)
811 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
812 if(f1ResetMsg->protocolIEs.list.array)
814 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
816 if(f1ResetMsg->protocolIEs.list.array[idx])
818 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
821 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
823 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
825 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
828 /*******************************************************************
830 * @brief build ansld ans send f1reset msg
834 * Function : BuildAndSendF1ResetReq
836 * Functionality: build and send f1reset msg
838 * @return ROK - success
841 * ****************************************************************/
842 uint8_t BuildAndSendF1ResetReq()
844 uint8_t elementCnt=0;
846 uint8_t ret= RFAILED;
847 Reset_t *f1ResetMsg = NULLP;
848 F1AP_PDU_t *f1apMsg = NULLP;
849 asn_enc_rval_t encRetVal;
850 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
853 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
856 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
859 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
860 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
861 if(f1apMsg->choice.initiatingMessage == NULLP)
863 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
866 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
867 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
868 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
870 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
873 f1ResetMsg->protocolIEs.list.count = elementCnt;
874 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
876 /* Initialize the F1Reset members */
877 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
878 if(f1ResetMsg->protocolIEs.list.array == NULLP)
880 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
883 for(idx=0; idx<elementCnt; idx++)
885 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
886 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
888 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
895 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
896 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
897 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
898 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
902 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
903 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
905 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
906 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
910 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
911 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
912 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
913 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
914 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
916 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
918 /* Encode the F1SetupRequest type as APER */
919 memset(encBuf, 0, ENC_BUF_MAX_LEN);
921 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
925 if(encRetVal.encoded == ENCODE_FAIL)
927 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
928 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
933 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
934 for(idx=0; idx< encBufSize; idx++)
936 DU_LOG("%x",encBuf[idx]);
940 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
942 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
950 FreeF1ResetReq(f1apMsg);
954 /*******************************************************************
956 * @brief Fills Radio Bearer Config
960 * Function : fillSrbCfg
962 * Functionality: Fills Radio Bearer Config
964 * @params[in] SRB_ToAddModList *
966 * @return ROK - success
969 * ****************************************************************/
970 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
974 if(bearerCfg != NULLP)
977 bearerCfg->list.count = elementCnt;
978 bearerCfg->list.size =\
979 elementCnt * sizeof(SRB_ToAddMod_t *);
980 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
981 if(bearerCfg->list.array != NULLP)
983 for(idx = 0; idx < elementCnt; idx++)
985 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
986 if(bearerCfg->list.array[idx] == NULLP)
988 for(ieId = 0; ieId < idx; ieId++)
990 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
992 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1002 bearerCfg->list.array[idx]->srb_Identity = srbId;
1007 /*******************************************************************
1009 * @brief Fills Master CellGroup Info
1013 * Function : fillMasterCellGroup
1015 * Functionality: Fills Master Cell Group IE
1017 * @params[in] RRCSetup_IEs_t *
1019 * @return ROK - success
1022 * ****************************************************************/
1024 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1027 masterCellGroup->buf = NULLP;
1028 if(f1apMsgDb.duToCuContainer.buf)
1030 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1031 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1032 if(masterCellGroup->buf != NULLP)
1034 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1035 masterCellGroup->size);
1049 /*******************************************************************
1051 * @brief Fills RRC setup IE
1055 * Function : fillRRCSetupIE
1057 * Functionality: Fills RRC Setup IE
1059 * @params[in] RRCSetup_IEs_t *
1061 * @return ROK - success
1064 * ****************************************************************/
1066 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1071 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1072 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1074 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1078 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1082 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1088 /*******************************************************************
1090 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1094 * Function : fillDlCcchRrcMsg
1096 * Functionality: Fills DL DCCCH Message required for
1097 * DLRRCMessageTransfer
1099 * @params[in] RRCContainer_t *rrcContainer
1101 * @return ROK - success
1104 * ****************************************************************/
1106 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1110 DL_CCCH_Message_t dl_CCCH_Msg;
1111 asn_enc_rval_t encRetVal;
1113 if(rrcContainer != NULLP)
1115 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1117 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1118 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1120 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1121 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1122 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1124 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1125 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1126 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1127 /* Fill RRC Setup IE */
1128 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1129 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1130 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1131 criticalExtensions.choice.rrcSetup != NULLP)
1133 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1134 criticalExtensions.choice.rrcSetup);
1138 /* encode DL-CCCH message into RRC Container */
1139 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1140 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1142 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1143 /* Encode results */
1144 if(encRetVal.encoded == ENCODE_FAIL)
1146 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1147 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1152 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1153 for(int i = 0; i< encBufSize; i++)
1155 DU_LOG("%x",encBuf[i]);
1157 rrcContainer->size = encBufSize;
1158 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1159 if(rrcContainer->buf != NULLP)
1161 memset(rrcContainer->buf, 0, encBufSize);
1162 for(idx2 = 0; idx2 < encBufSize; idx2++)
1164 rrcContainer->buf[idx2] = encBuf[idx2];
1176 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1182 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1188 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1194 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1199 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1201 uint8_t idx, ied, elementCnt;
1204 qosFlow->list.count = elementCnt;
1205 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1206 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1207 if(qosFlow->list.array != NULLP)
1209 for(idx = 0; idx < elementCnt; idx++)
1211 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1212 if(qosFlow->list.array[idx] == NULLP)
1214 for(ied = 0; ied < idx; ied++)
1216 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1218 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1224 *qosFlow->list.array[idx] = 9;
1228 /*******************************************************************
1230 * @brief Fills CN Assoc for Drb to Add/Mod List
1234 * Function : fillCnAssoc
1236 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1238 * @params[in] struct DRB_ToAddMod__cnAssociation *
1240 * @return ROK - success
1243 * ****************************************************************/
1245 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1249 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1250 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1252 cnAssoc->choice.eps_BearerIdentity = 5;
1254 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1256 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1257 if(cnAssoc->choice.sdap_Config)
1259 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1260 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1261 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1262 cnAssoc->choice.sdap_Config->defaultDRB = true;
1263 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1264 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1265 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1266 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1267 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1269 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1273 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1274 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1280 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1287 /*******************************************************************
1289 * @brief Fills Radio Bearer Config for Drb
1293 * Function : fillDrbCfg
1295 * Functionality: Fills Radio Bearer Config for Drb
1297 * @params[in] drbId, DRB_ToAddModList *
1299 * @return ROK - success
1302 * ****************************************************************/
1303 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1305 uint8_t idx, ied, ret, elementCnt;
1311 drbCfg->list.count = elementCnt;
1312 drbCfg->list.size =\
1313 elementCnt * sizeof(DRB_ToAddMod_t *);
1314 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1315 if(drbCfg->list.array != NULLP)
1317 for(idx = 0; idx < elementCnt; idx++)
1319 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1320 if(drbCfg->list.array[idx] == NULLP)
1322 for(ied = 0; ied < idx; ied++)
1324 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1326 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1336 /* CN ASSOCIATION */
1337 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1338 if(drbCfg->list.array[idx]->cnAssociation)
1340 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1343 drbCfg->list.array[idx]->drb_Identity = drbId;
1348 /*******************************************************************
1350 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1354 * Function : fillRrcReconfigIE
1356 * Functionality: Fills RRC Reconfig Message required for
1357 * DLRRCMessageTransfer
1359 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1361 * @return ROK - success
1364 * ****************************************************************/
1366 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1369 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1370 if(rrcReconfigMsg->radioBearerConfig)
1372 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1373 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1375 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1380 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1381 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1383 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1386 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1387 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1388 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1394 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1395 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1401 /*******************************************************************
1403 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1407 * Function : fillDlDcchRrcMsg
1409 * Functionality: Fills DL DCCH Message required for
1410 * DLRRCMessageTransfer
1412 * @params[in] RRCContainer_t *rrcContainer
1414 * @return ROK - success
1417 * ****************************************************************/
1419 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1423 DL_DCCH_Message_t dl_DCCH_Msg;
1424 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1425 asn_enc_rval_t encRetVal;
1427 if(rrcContainer != NULLP)
1429 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1431 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1432 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1434 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1435 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1436 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1438 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1439 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1440 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1441 /* Fill RRC Reconfig IE */
1442 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1443 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1444 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1445 criticalExtensions.choice.rrcReconfiguration != NULLP)
1447 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1448 criticalExtensions.choice.rrcReconfiguration);
1452 /* encode DL-DCCH message into RRC Container */
1453 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1454 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1456 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1457 /* Encode results */
1458 if(encRetVal.encoded == ENCODE_FAIL)
1460 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1461 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1466 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1467 for(int i = 0; i< encBufSize; i++)
1469 DU_LOG("%x",encBuf[i]);
1471 rrcContainer->size = encBufSize;
1472 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1473 if(rrcContainer->buf != NULLP)
1475 memset(rrcContainer->buf, 0, encBufSize);
1476 for(idx2 = 0; idx2 < encBufSize; idx2++)
1478 rrcContainer->buf[idx2] = encBuf[idx2];
1485 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1490 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1496 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1502 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1508 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1514 /*******************************************************************
1516 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1520 * Function : BuildDLRRCContainer
1522 * Functionality: Builds RRC Container IE required for
1523 * DLRRCMessageTransfer
1527 * @return ROK - success
1530 * ****************************************************************/
1532 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1534 uint8_t ret, bufLen;
1537 if(rrcMsgType == RRC_SETUP)
1539 ret = fillDlCcchRrcMsg(rrcContainer);
1541 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1543 else if(rrcMsgType == REGISTRATION_ACCEPT)
1545 /*Hardcoded RRC Container from reference logs*/
1546 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1548 rrcContainer->size = bufLen;
1549 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1550 if(rrcContainer->buf != NULLP)
1552 memset(rrcContainer->buf, 0, bufLen);
1553 memcpy(rrcContainer->buf, buf, bufLen);
1556 else if(rrcMsgType == RRC_RECONFIG)
1558 /*Hardcoded RRC Container from reference logs*/
1560 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1561 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1562 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1563 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1564 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1565 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1566 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1567 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1568 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1569 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1570 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1571 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1572 0x00, 0x00, 0x00, 0x00};
1574 rrcContainer->size = bufLen;
1575 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1576 if(rrcContainer->buf != NULLP)
1578 memset(rrcContainer->buf, 0, bufLen);
1579 memcpy(rrcContainer->buf, buf, bufLen);
1586 /*******************************************************************
1588 * @brief Builds and sends the DLRRCMessageTransfer
1592 * Function : BuildAndSendDLRRCMessageTransfer
1594 * Functionality: Constructs the DL RRC Message Transfer and sends
1595 * it to the CU through SCTP.
1599 * @return ROK - success
1602 * ****************************************************************/
1603 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1605 uint8_t elementCnt = 0;
1608 F1AP_PDU_t *f1apMsg = NULLP;
1609 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1610 asn_enc_rval_t encRetVal; /* Encoder return value */
1612 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1614 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1615 if(f1apMsg == NULLP)
1617 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1621 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1622 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1623 sizeof(InitiatingMessage_t));
1624 if(f1apMsg->choice.initiatingMessage == NULLP)
1626 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1627 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1631 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1632 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1633 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1634 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1637 dlRRCMsg->protocolIEs.list.count = elementCnt;
1638 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1640 /* Initialize the F1Setup members */
1641 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1642 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1644 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1645 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1646 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1650 for(idx=0; idx<elementCnt; idx++)
1652 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1653 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1655 for(ieId=0; ieId<idx; ieId++)
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1658 sizeof(DLRRCMessageTransferIEs_t));
1660 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1661 dlRRCMsg->protocolIEs.list.size);
1662 CU_FREE(f1apMsg->choice.initiatingMessage,\
1663 sizeof(InitiatingMessage_t));
1664 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1669 /* GNB CU UE F1AP ID */
1671 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1672 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1673 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1674 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1675 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1677 /* GNB DU UE F1AP ID */
1679 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1680 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1681 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1683 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1684 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1688 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1689 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1691 DLRRCMessageTransferIEs__value_PR_SRBID;
1692 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1696 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1697 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1698 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1699 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1700 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1702 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1704 /* Encode the F1SetupRequest type as APER */
1705 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1707 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1709 /* Encode results */
1710 if(encRetVal.encoded == ENCODE_FAIL)
1712 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1713 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1718 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1719 for(int i=0; i< encBufSize; i++)
1721 DU_LOG("%x",encBuf[i]);
1726 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1728 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1733 }/* End of BuildAndSendDLRRCMessageTransfer */
1735 /*******************************************************************
1737 * @brief Function to set the Dl RRC Msg Type
1741 * Function : setDlRRCMsgType
1743 * Functionality: Constructs the UE Setup Response and sends
1744 * it to the DU through SCTP.
1748 * @return ROK - success
1751 * ****************************************************************/
1753 uint8_t setDlRRCMsgType()
1755 uint8_t rrcMsgType = 0;
1756 switch(f1apMsgDb.dlRrcMsgCount)
1759 rrcMsgType = RRC_SETUP;
1761 case REGISTRATION_ACCEPT:
1762 rrcMsgType = REGISTRATION_ACCEPT;
1764 case UE_CONTEXT_SETUP_REQ:
1765 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1767 case SECURITY_MODE_COMPLETE:
1768 rrcMsgType = SECURITY_MODE_COMPLETE;
1771 rrcMsgType = RRC_RECONFIG;
1773 case UE_CONTEXT_MOD_REQ:
1774 rrcMsgType = UE_CONTEXT_MOD_REQ;
1782 /*******************************************************************
1784 * @brief Function to build Initial UL RRC Message
1788 * Function : procInitULRRCMsg
1790 * Functionality: Function to build Initial UL RRC Message
1794 * @return ROK - success
1797 * ****************************************************************/
1799 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1801 uint8_t idx, rrcMsgType;
1803 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1804 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1806 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1808 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1810 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1812 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1814 case ProtocolIE_ID_id_NRCGI:
1816 case ProtocolIE_ID_id_C_RNTI:
1818 case ProtocolIE_ID_id_RRCContainer:
1820 case ProtocolIE_ID_id_DUtoCURRCContainer:
1822 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1823 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1824 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1826 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1827 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1828 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1829 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1830 f1apMsgDb.duToCuContainer.size);
1831 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1833 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1834 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, 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 f1apMsgDb.dlRrcMsgCount++;
1853 rrcMsgType = setDlRRCMsgType();
1854 ret = BuildAndSendDLRRCMessageTransfer(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] = 1;
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];
3228 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3229 if(!timeDomAlloc->k0)
3231 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3234 *(timeDomAlloc->k0) = 0;
3235 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3236 timeDomAlloc->startSymbolAndLength = 66;
3239 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3240 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3241 if(!timeDomAlloc->k0)
3243 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3246 *(timeDomAlloc->k0) = 1;
3247 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3248 timeDomAlloc->startSymbolAndLength = 66;
3253 /*******************************************************************
3255 * @brief Builds PDSCH PRB Bundling type
3259 * Function : BuildPdschPrbBundlingType
3261 * Functionality: Builds PDSCH PRB Bundling type
3264 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3266 * @return ROK - success
3269 * ****************************************************************/
3270 uint8_t BuildPdschPrbBundlingType
3272 struct PDSCH_Config__prb_BundlingType *prbBndlType
3275 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3277 prbBndlType->choice.staticBundling = NULLP;
3278 CU_ALLOC(prbBndlType->choice.staticBundling, \
3279 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3280 if(!prbBndlType->choice.staticBundling)
3282 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3285 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3290 /*******************************************************************
3292 * @brief Builds BWP DL dedicated PDSCH config
3296 * Function : BuildBWPDlDedPdschCfg
3298 * Functionality: Builds BWP DL dedicated PDSCH config
3300 * @params[in] struct PDSCH_Config *pdschCfg
3302 * @return ROK - success
3305 * ****************************************************************/
3306 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3308 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3310 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3311 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3312 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3313 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3315 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3319 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3324 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3325 pdschCfg->tci_StatesToAddModList = NULLP;
3326 pdschCfg->tci_StatesToReleaseList = NULLP;
3327 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3329 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3330 if(!pdschCfg->tci_StatesToAddModList)
3332 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3335 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3341 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3343 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3344 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3345 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3346 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3348 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3351 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3355 pdschCfg->pdsch_AggregationFactor = NULLP;
3356 pdschCfg->rateMatchPatternToAddModList = NULLP;
3357 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3358 pdschCfg->rateMatchPatternGroup1 = NULLP;
3359 pdschCfg->rateMatchPatternGroup2 = NULLP;
3360 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3361 pdschCfg->mcs_Table = NULLP;
3363 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3364 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3365 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3367 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3370 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3372 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3377 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3378 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3379 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3380 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3381 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3382 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3383 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3388 /*******************************************************************
3390 * @brief Builds intitial DL BWP
3393 * Function : BuildInitialDlBWP
3395 * Functionality: Builds intitial DL BWP in spCellCfgDed
3397 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3399 * @return ROK - success
3402 * ****************************************************************/
3403 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3405 dlBwp->pdcch_Config = NULLP;
3406 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3407 if(!dlBwp->pdcch_Config)
3409 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3412 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3414 dlBwp->pdcch_Config->choice.setup = NULLP;
3415 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3416 if(!dlBwp->pdcch_Config->choice.setup)
3418 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3421 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3426 dlBwp->pdsch_Config = NULLP;
3427 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3428 if(!dlBwp->pdsch_Config)
3430 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3433 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3435 dlBwp->pdsch_Config->choice.setup = NULLP;
3436 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3437 if(!dlBwp->pdsch_Config->choice.setup)
3439 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3443 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3448 dlBwp->sps_Config = NULLP;
3449 dlBwp->radioLinkMonitoringConfig = NULLP;
3453 /*******************************************************************
3455 * @brief Builds DMRS UL Pusch Mapping type A
3459 * Function : BuildDMRSULPuschMapTypeA
3461 * Functionality: Builds DMRS UL Pusch Mapping type A
3464 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3465 * @return ROK - success
3468 * ****************************************************************/
3469 uint8_t BuildDMRSULPuschMapTypeA
3471 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3474 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3475 dmrsUlCfg->choice.setup= NULLP;
3476 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3477 if(!dmrsUlCfg->choice.setup)
3479 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3483 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3484 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3485 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3486 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3488 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3491 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3493 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3494 dmrsUlCfg->choice.setup->maxLength = NULLP;
3495 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3496 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3497 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3498 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3500 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3504 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3505 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3507 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3509 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3512 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3514 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3515 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3519 /*******************************************************************
3521 * @brief Build PUSCH time domain allocation list
3525 * Function : BuildPuschTimeDomAllocList
3527 * Functionality: Build PUSCH time domain allocation list
3530 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3532 * @return ROK - success
3535 * ****************************************************************/
3536 uint8_t BuildPuschTimeDomAllocList
3538 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3543 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3545 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3546 timeDomAllocList->choice.setup = NULLP;
3547 CU_ALLOC(timeDomAllocList->choice.setup, \
3548 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3549 if(!timeDomAllocList->choice.setup)
3551 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3556 timeDomAllocList->choice.setup->list.count = elementCnt;
3557 timeDomAllocList->choice.setup->list.size = \
3558 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3559 timeDomAllocList->choice.setup->list.array = NULLP;
3560 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3561 timeDomAllocList->choice.setup->list.size);
3562 if(!timeDomAllocList->choice.setup->list.array)
3564 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3568 for(idx = 0; idx < elementCnt; idx++)
3570 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3571 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3572 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3573 if(!timeDomAllocList->choice.setup->list.array[idx])
3575 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3581 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3582 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3583 if(!timeDomAlloc->k2)
3585 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3588 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3589 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3590 timeDomAlloc->startSymbolAndLength = 66;
3593 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3594 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3595 if(!timeDomAlloc->k2)
3597 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3600 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3601 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3602 timeDomAlloc->startSymbolAndLength = 66;
3607 /*******************************************************************
3609 * @brief Builds BWP UL dedicated PUSCH Config
3613 * Function : BuildBWPUlDedPuschCfg
3616 * Builds BWP UL dedicated PUSCH Config
3618 * @params[in] : PUSCH_Config_t *puschCfg
3620 * @return ROK - success
3623 * ****************************************************************/
3624 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3626 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3627 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3628 if(!puschCfg->dataScramblingIdentityPUSCH)
3630 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3633 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3635 puschCfg->txConfig = NULLP;
3636 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3637 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3638 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3639 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3641 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3645 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3650 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3651 puschCfg->pusch_PowerControl = NULLP;
3652 puschCfg->frequencyHopping = NULLP;
3653 puschCfg->frequencyHoppingOffsetLists = NULLP;
3654 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3656 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3657 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3658 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3659 if(!puschCfg->pusch_TimeDomainAllocationList)
3661 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3665 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3670 puschCfg->pusch_AggregationFactor = NULLP;
3671 puschCfg->mcs_Table = NULLP;
3672 puschCfg->mcs_TableTransformPrecoder = NULLP;
3673 puschCfg->transformPrecoder = NULLP;
3674 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3675 if(!puschCfg->transformPrecoder)
3677 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3680 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3682 puschCfg->codebookSubset = NULLP;
3683 puschCfg->maxRank = NULLP;
3684 puschCfg->rbg_Size = NULLP;
3685 puschCfg->uci_OnPUSCH = NULLP;
3686 puschCfg->tp_pi2BPSK = NULLP;
3691 /*******************************************************************
3693 * @brief Builds BWP UL dedicated PUCCH Config
3697 * Function : BuildBWPUlDedPucchCfg
3700 * Builds BWP UL dedicated PUCCH Config
3702 * @params[in] : PUCCH_Config_t *pucchCfg
3704 * @return ROK - success
3707 * ****************************************************************/
3708 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3710 uint8_t arrIdx, elementCnt;
3712 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3713 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3715 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3720 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3721 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3722 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3723 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3725 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3729 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3731 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3732 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3734 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3740 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
3741 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
3746 /*******************************************************************
3748 * @brief Fills SRS resource to add/modify list
3752 * Function : BuildSrsRsrcAddModList
3754 * Functionality: Fills SRS resource to add/modify list
3757 * @return ROK - success
3760 * ****************************************************************/
3761 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3767 resourceList->list.count = elementCnt;
3768 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3769 resourceList->list.array = NULLP;
3770 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3771 if(!resourceList->list.array)
3773 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3777 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3779 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3780 if(!resourceList->list.array[rsrcIdx])
3782 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3788 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3789 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3790 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3792 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3793 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3794 sizeof(struct SRS_Resource__transmissionComb__n2));
3795 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3797 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3800 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3801 = SRS_COMB_OFFSET_N2;
3802 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3803 = SRS_CYCLIC_SHIFT_N2;
3805 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3807 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3808 SRS_Resource__resourceMapping__nrofSymbols_n1;
3809 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3810 SRS_Resource__resourceMapping__repetitionFactor_n1;
3812 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3813 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3814 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3815 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3816 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3817 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3818 SRS_Resource__groupOrSequenceHopping_neither;
3820 /* Setting resource type to aperiodic for intergration purposes */
3821 resourceList->list.array[rsrcIdx]->resourceType.present = \
3822 SRS_Resource__resourceType_PR_aperiodic;
3823 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3824 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3825 sizeof(struct SRS_Resource__resourceType__aperiodic));
3826 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3828 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3831 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3836 /*******************************************************************
3838 * @brief Build SRS resource set Add/mod list
3842 * Function : BuildSrsRsrcSetAddModList
3844 * Functionality: Build SRS resource set Add/mod list
3847 * @return ROK - success
3850 * ****************************************************************/
3851 uint8_t BuildSrsRsrcSetAddModList
3853 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3859 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3862 rsrcSetList->list.count = elementCnt;
3863 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3864 rsrcSetList->list.array = NULLP;
3865 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3866 if(!rsrcSetList->list.array)
3868 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3872 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3874 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3875 if(!rsrcSetList->list.array[rSetIdx])
3877 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3883 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3885 /* Fill Resource Id list in resource set */
3886 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3887 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3888 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3889 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3891 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3896 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3897 rsrcIdList->list.count = elementCnt;
3898 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3899 rsrcIdList->list.array = NULLP;
3900 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3901 if(!rsrcIdList->list.array)
3903 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3907 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3909 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3910 if(!rsrcIdList->list.array[rsrcIdx])
3912 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3918 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3920 /* Fill resource type */
3921 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3922 SRS_ResourceSet__resourceType_PR_aperiodic;
3924 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3925 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3926 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3927 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3929 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3932 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3933 = APERIODIC_SRS_RESRC_TRIGGER;
3935 /* TODO : Fill values for below IEs as expected by Viavi */
3936 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3937 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3940 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3941 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3942 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3943 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3944 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3949 /*******************************************************************
3951 * @brief Builds BWP UL dedicated SRS Config
3955 * Function : BuildBWPUlDedSrsCfg
3957 * Functionality: Builds BWP UL dedicated SRS Config
3959 * @params[in] SRS Config
3960 * @return ROK - success
3963 * ****************************************************************/
3964 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3966 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3967 srsCfg->srs_ResourceSetToAddModList = NULLP;
3968 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3969 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3970 if(!srsCfg->srs_ResourceSetToAddModList)
3972 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3975 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3980 srsCfg->srs_ResourceToReleaseList = NULLP;
3982 /* Resource to Add/Modify list */
3983 srsCfg->srs_ResourceToAddModList = NULLP;
3984 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3985 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3986 if(!srsCfg->srs_ResourceToAddModList)
3988 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3992 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3997 srsCfg->tpc_Accumulation = NULLP;
4002 /*******************************************************************
4004 * @brief Builds inital UL BWP
4008 * Function : BuildInitialUlBWP
4010 * Functionality: Builds initial UL BWP
4012 * @params[in] BWP_UplinkDedicated_t *ulBwp
4013 * @return ROK - success
4016 * ****************************************************************/
4017 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4019 ulBwp->pucch_Config = NULLP;
4020 ulBwp->pucch_Config = NULLP;
4021 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4022 if(!ulBwp->pucch_Config)
4024 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4028 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4029 ulBwp->pucch_Config->choice.setup = NULLP;
4030 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4031 if(!ulBwp->pucch_Config->choice.setup)
4033 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4037 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4042 /* Fill BWP UL dedicated PUSCH config */
4043 ulBwp->pusch_Config = NULLP;
4044 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4045 if(!ulBwp->pusch_Config)
4047 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4051 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4052 ulBwp->pusch_Config->choice.setup = NULLP;
4053 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4054 if(!ulBwp->pusch_Config->choice.setup)
4056 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4060 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4065 ulBwp->configuredGrantConfig = NULLP;
4067 /* Fill BPW UL dedicated SRS config */
4068 ulBwp->srs_Config = NULLP;
4069 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4070 if(!ulBwp->srs_Config)
4072 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4076 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4077 ulBwp->srs_Config->choice.setup = NULLP;
4078 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4079 if(!ulBwp->srs_Config->choice.setup)
4081 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4085 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4090 ulBwp->beamFailureRecoveryConfig = NULLP;
4095 /*******************************************************************
4097 * @brief Builds Pusch Serving cell Config
4101 * Function : BuildPuschSrvCellCfg
4103 * Functionality: Builds Pusch Serving cell Config
4105 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4107 * @return ROK - success
4110 * ****************************************************************/
4111 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4113 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4114 puschCfg->choice.setup = NULLP;
4115 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4116 if(!puschCfg->choice.setup)
4118 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4122 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4123 puschCfg->choice.setup->rateMatching = NULLP;
4124 puschCfg->choice.setup->xOverhead = NULLP;
4125 puschCfg->choice.setup->ext1 = NULLP;
4126 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4127 if(!puschCfg->choice.setup->ext1)
4129 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4133 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4134 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4135 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4137 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4140 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4142 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4143 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4144 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4146 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4149 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4153 /*******************************************************************
4155 * @brief Builds UL config
4158 * Function : BuildUlCfg
4160 * Functionality: Builds UL config in spCellCfgDed
4162 * @params[in] UplinkConfig_t *ulCfg
4164 * @return ROK - success
4167 * ****************************************************************/
4168 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4170 ulCfg->initialUplinkBWP = NULLP;
4171 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4172 if(!ulCfg->initialUplinkBWP)
4174 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4178 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4183 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4184 ulCfg->uplinkBWP_ToAddModList = NULLP;
4185 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4186 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4187 if(!ulCfg->firstActiveUplinkBWP_Id)
4189 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4192 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4194 ulCfg->pusch_ServingCellConfig = NULLP;
4195 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4196 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4197 if(!ulCfg->pusch_ServingCellConfig)
4199 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4203 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4208 ulCfg->carrierSwitching = NULLP;
4209 ulCfg->ext1 = NULLP;
4213 /*******************************************************************
4215 * @brief Builds PDSCH serving cell config
4218 * Function : BuildPdschSrvCellCfg
4220 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4222 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4224 * @return ROK - success
4227 * ****************************************************************/
4228 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4230 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4231 pdschCfg->choice.setup = NULLP;
4232 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4233 if(!pdschCfg->choice.setup)
4235 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4239 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4240 pdschCfg->choice.setup->xOverhead = NULLP;
4241 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4242 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4243 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4245 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4248 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4249 pdschCfg->choice.setup->pucch_Cell = NULLP;
4250 pdschCfg->choice.setup->ext1 = NULLP;
4255 /*******************************************************************
4257 * @brief Builds CSI Meas config
4260 * Function : BuildCsiMeasCfg
4262 * Functionality: Builds CSI Meas config in spCellCfgDed
4264 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4266 * @return ROK - success
4269 * ****************************************************************/
4270 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4276 /*******************************************************************
4278 * @brief Builds Spcell config dedicated
4281 * Function : BuildSpCellCfgDed
4283 * Functionality: Builds sp cell config dedicated in spCellCfg
4285 * @params[in] ServingCellConfig_t srvCellCfg
4287 * @return ROK - success
4290 * ****************************************************************/
4291 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4293 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4295 srvCellCfg->initialDownlinkBWP = NULLP;
4296 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4297 if(!srvCellCfg->initialDownlinkBWP)
4299 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4303 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4305 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4308 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4309 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4311 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4312 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4313 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4315 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4318 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4320 srvCellCfg->bwp_InactivityTimer = NULLP;
4322 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4323 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4324 if(!srvCellCfg->defaultDownlinkBWP_Id)
4326 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4329 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4331 srvCellCfg->uplinkConfig = NULLP;
4332 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4333 if(!srvCellCfg->uplinkConfig)
4335 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4339 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4341 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4344 srvCellCfg->supplementaryUplink = NULLP;
4345 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4347 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4348 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4349 if(!srvCellCfg->pdsch_ServingCellConfig)
4351 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4355 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4357 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4361 srvCellCfg->csi_MeasConfig = NULLP;
4363 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4364 if(!srvCellCfg->csi_MeasConfig)
4366 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4370 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4372 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4376 srvCellCfg->sCellDeactivationTimer = NULLP;
4377 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4378 srvCellCfg->tag_Id = TAG_ID;
4379 srvCellCfg->dummy = NULLP;
4380 srvCellCfg->pathlossReferenceLinking = NULLP;
4381 srvCellCfg->servingCellMO = NULLP;
4382 srvCellCfg->ext1 = NULLP;
4386 /*******************************************************************
4388 * @brief Builds Spcell config
4392 * Function : BuildSpCellCfg
4394 * Functionality: Builds sp cell config in DuToCuRrcContainer
4396 * @params[in] SpCellConfig_t spCellCfg
4398 * @return ROK - success
4401 * ****************************************************************/
4402 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4405 spCellCfg->servCellIndex = NULLP;
4406 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4407 if(!spCellCfg->servCellIndex)
4409 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4412 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4414 spCellCfg->reconfigurationWithSync = NULLP;
4415 spCellCfg->rlf_TimersAndConstants = NULLP;
4416 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4417 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4418 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4420 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4423 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4425 spCellCfg->spCellConfigDedicated = NULLP;
4426 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4427 if(!spCellCfg->spCellConfigDedicated)
4429 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4432 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4434 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4439 /*******************************************************************
4441 * @brief Builds Phy cell group config
4445 * Function : BuildPhyCellGrpCfg
4447 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4449 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4451 * @return ROK - success
4454 * ****************************************************************/
4455 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4457 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4458 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4460 phyCellGrpCfg->p_NR_FR1 = NULLP;
4461 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4462 if(!phyCellGrpCfg->p_NR_FR1)
4464 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4467 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4468 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4469 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4470 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4471 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4472 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4473 phyCellGrpCfg->cs_RNTI = NULLP;
4474 phyCellGrpCfg->ext1 = NULLP;
4475 phyCellGrpCfg->ext2 = NULLP;
4480 /*******************************************************************
4482 * @brief Builds tag config
4486 * Function : BuildTagConfig
4488 * Functionality: Builds tag config in MacCellGroupConfig
4490 * @params[in] TAG_Config *tag_Config
4492 * @return ROK - success
4495 * ****************************************************************/
4496 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4498 struct TAG_Config__tag_ToAddModList *tagList;
4499 uint8_t idx, elementCnt;
4501 tagConfig->tag_ToReleaseList = NULLP;
4502 tagConfig->tag_ToAddModList = NULLP;
4503 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4504 if(!tagConfig->tag_ToAddModList)
4506 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4510 elementCnt = 1; //ODU_VALUE_ONE;
4511 tagList = tagConfig->tag_ToAddModList;
4512 tagList->list.count = elementCnt;
4513 tagList->list.size = elementCnt * sizeof(struct TAG *);
4515 tagList->list.array = NULLP;
4516 CU_ALLOC(tagList->list.array, tagList->list.size);
4517 if(!tagList->list.array)
4519 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4523 for(idx=0; idx<tagList->list.count; idx++)
4525 tagList->list.array[idx] = NULLP;
4526 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4527 if(!tagList->list.array[idx])
4529 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4535 tagList->list.array[idx]->tag_Id = TAG_ID;
4536 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4541 /*******************************************************************
4543 * @brief Builds PHR Config
4547 * Function : BuildPhrConfig
4549 * Functionality: Builds phrConfig in MacCellGroupConfig
4551 * @params[in] PHR Config *
4553 * @return ROK - success
4556 * ****************************************************************/
4557 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4560 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4561 phrConfig->choice.setup = NULLP;
4562 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4563 if(!phrConfig->choice.setup)
4565 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4569 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4570 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4571 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4572 phrConfig->choice.setup->multiplePHR = false;
4573 phrConfig->choice.setup->dummy = false;
4574 phrConfig->choice.setup->phr_Type2OtherCell = false;
4575 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4580 /*******************************************************************
4582 * @brief Builds BSR Config
4586 * Function : BuildBsrConfig
4588 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4590 * @params[in] BSR_Config *bsrConfig
4592 * @return ROK - success
4595 * ****************************************************************/
4596 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4598 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4599 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4600 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4605 /*******************************************************************
4607 * @brief Builds scheduling request config
4611 * Function : BuildSchedulingReqConfig
4613 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4615 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4617 * @return ROK - success
4620 * ****************************************************************/
4621 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4623 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4624 uint8_t idx, elementCnt;
4626 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4627 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4628 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4629 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4631 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4635 elementCnt = 1; //ODU_VALUE_ONE;
4636 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4637 schReqList->list.count = elementCnt;
4638 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4640 schReqList->list.array = NULLP;
4641 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4642 if(!schReqList->list.array)
4644 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4648 for(idx=0;idx<schReqList->list.count; idx++)
4650 schReqList->list.array[idx] = NULLP;
4651 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4652 if(!schReqList->list.array[idx])
4654 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4660 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4662 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4663 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4664 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4666 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4669 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4670 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4671 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4675 /*******************************************************************
4677 * @brief Builds Mac cell group config
4681 * Function : BuildMacCellGrpCfg
4683 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4685 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4687 * @return ROK - success
4690 * ****************************************************************/
4691 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4693 macCellGrpCfg->drx_Config = NULLP;
4694 macCellGrpCfg->schedulingRequestConfig = NULLP;
4695 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4696 if(!macCellGrpCfg->schedulingRequestConfig)
4698 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4702 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4704 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4708 macCellGrpCfg->bsr_Config = NULLP;
4709 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4710 if(!macCellGrpCfg->bsr_Config)
4712 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4716 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4718 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4722 macCellGrpCfg->tag_Config = NULLP;
4723 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4724 if(!macCellGrpCfg->tag_Config)
4726 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4730 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4732 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4736 macCellGrpCfg->phr_Config = NULLP;
4737 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4738 if(!macCellGrpCfg->phr_Config)
4740 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4744 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4746 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4750 macCellGrpCfg->skipUplinkTxDynamic = false;
4751 macCellGrpCfg->ext1 = NULLP;
4755 /*******************************************************************
4757 * @brief Frees memeory allocated for SearchSpcToAddModList
4761 * Function : FreeSearchSpcToAddModList
4763 * Functionality: Deallocating memory of SearchSpcToAddModList
4765 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4769 4221 * ****************************************************************/
4770 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4774 struct SearchSpace *searchSpc=NULLP;
4776 if(searchSpcList->list.array)
4778 if(searchSpcList->list.array[idx2])
4780 searchSpc = searchSpcList->list.array[idx2];
4781 if(searchSpc->controlResourceSetId)
4783 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4785 if(searchSpc->monitoringSymbolsWithinSlot)
4787 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4789 if(searchSpc->nrofCandidates)
4791 if(searchSpc->searchSpaceType)
4793 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4794 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4795 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4796 SearchSpace__searchSpaceType));
4798 CU_FREE(searchSpc->nrofCandidates,
4799 sizeof(struct SearchSpace__nrofCandidates));
4801 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4802 searchSpc->monitoringSymbolsWithinSlot->size);
4804 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4805 sizeof(BIT_STRING_t));
4807 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4808 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4810 CU_FREE(searchSpc->controlResourceSetId,
4811 sizeof(ControlResourceSetId_t));
4814 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4816 CU_FREE(searchSpcList->list.array[idx1],
4817 sizeof(struct SearchSpace));
4819 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4822 /*******************************************************************
4824 * @brief Frees memory allocated for PdschTimeDomAllocList
4828 * Function : FreePdschTimeDomAllocList
4830 * Functionality: Deallocating memory of PdschTimeDomAllocList
4832 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4836 4221 * ****************************************************************/
4837 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4841 if(timeDomAllocList->choice.setup)
4843 if(timeDomAllocList->choice.setup->list.array)
4845 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4847 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4848 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4850 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4851 timeDomAllocList->choice.setup->list.size);
4853 CU_FREE(timeDomAllocList->choice.setup,\
4854 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4857 /*******************************************************************
4859 * @brief Frees memory allocated for PuschTimeDomAllocList
4863 * Function : FreePuschTimeDomAllocList
4865 * Functionality: Deallocating memory of PuschTimeDomAllocList
4867 * @params[in] PUSCH_Config_t *puschCfg
4871 ***********************************************************************/
4872 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4876 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4878 if(puschCfg->pusch_TimeDomainAllocationList)
4880 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4881 if(timeDomAllocList_t->choice.setup)
4883 if(timeDomAllocList_t->choice.setup->list.array)
4885 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4886 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4888 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4889 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4891 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4892 timeDomAllocList_t->choice.setup->list.size);
4894 CU_FREE(timeDomAllocList_t->choice.setup, \
4895 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4897 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4898 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4899 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4903 /*******************************************************************
4905 * @brief Frees memory allocated for InitialUlBWP
4909 * Function : FreeInitialUlBWP
4911 * Functionality: Deallocating memory of InitialUlBWP
4913 * @params[in] BWP_UplinkDedicated_t *ulBwp
4917 * ****************************************************************/
4918 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4920 uint8_t rSetIdx, rsrcIdx;
4921 SRS_Config_t *srsCfg = NULLP;
4922 PUSCH_Config_t *puschCfg = NULLP;
4923 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4924 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4925 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4926 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4928 if(ulBwp->pusch_Config)
4930 if(ulBwp->pusch_Config->choice.setup)
4932 puschCfg=ulBwp->pusch_Config->choice.setup;
4933 if(puschCfg->dataScramblingIdentityPUSCH)
4935 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4937 FreePuschTimeDomAllocList(puschCfg);
4938 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4939 if(dmrsUlCfg->choice.setup)
4941 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4943 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4945 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4947 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4948 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4950 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4953 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4955 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4956 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4958 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4960 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4962 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4964 /* Free SRS-Config */
4965 if(ulBwp->srs_Config)
4967 if(ulBwp->srs_Config->choice.setup)
4969 srsCfg = ulBwp->srs_Config->choice.setup;
4971 /* Free Resource Set to add/mod list */
4972 if(srsCfg->srs_ResourceSetToAddModList)
4974 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4975 if(rsrcSetList->list.array)
4979 /* Free SRS resource Id list in this SRS resource set */
4980 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4982 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4984 if(rsrcIdList->list.array)
4986 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4988 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4990 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4992 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4993 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4996 /* Free resource type info for this SRS resource set */
4997 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4998 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5000 /* Free memory for each resource set */
5001 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5003 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5005 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5007 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5008 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5011 /* Free resource to add/modd list */
5012 if(srsCfg->srs_ResourceToAddModList)
5014 resourceList = srsCfg->srs_ResourceToAddModList;
5015 if(resourceList->list.array)
5018 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5019 sizeof(struct SRS_Resource__transmissionComb__n2));
5020 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5021 sizeof(struct SRS_Resource__resourceType__aperiodic));
5023 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5025 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5027 CU_FREE(resourceList->list.array, resourceList->list.size);
5029 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5030 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5033 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5035 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5039 /*******************************************************************
5041 * @brief Frees memory allocated for initialUplinkBWP
5045 * Function : FreeinitialUplinkBWP
5047 * Functionality: Deallocating memory of initialUplinkBWP
5049 * @params[in] UplinkConfig_t *ulCfg
5054 * ****************************************************************/
5055 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5057 BWP_UplinkDedicated_t *ulBwp=NULLP;
5058 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5060 if(ulCfg->initialUplinkBWP)
5062 ulBwp=ulCfg->initialUplinkBWP;
5063 if(ulCfg->firstActiveUplinkBWP_Id)
5065 if(ulCfg->pusch_ServingCellConfig)
5067 puschCfg=ulCfg->pusch_ServingCellConfig;
5068 if(puschCfg->choice.setup)
5070 if(puschCfg->choice.setup->ext1)
5072 CU_FREE(puschCfg->choice.setup->ext1->\
5073 processingType2Enabled,sizeof(BOOLEAN_t));
5074 CU_FREE(puschCfg->choice.setup->ext1->\
5075 maxMIMO_Layers,sizeof(long));
5076 CU_FREE(puschCfg->choice.setup->ext1, \
5077 sizeof(struct PUSCH_ServingCellConfig__ext1));
5079 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5081 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5083 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5085 FreeInitialUlBWP(ulBwp);
5086 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5089 /*******************************************************************
5091 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5095 * Function : FreeBWPDlDedPdschCfg
5097 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5099 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5104 * ****************************************************************/
5105 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5107 struct PDSCH_Config *pdschCfg=NULLP;
5108 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5109 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5110 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5112 if(dlBwp->pdsch_Config->choice.setup)
5114 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5115 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5117 if(pdschCfg->pdsch_TimeDomainAllocationList)
5119 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5120 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5122 prbBndlType=&pdschCfg->prb_BundlingType;
5123 CU_FREE(prbBndlType->choice.staticBundling,\
5124 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5125 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5127 FreePdschTimeDomAllocList(timeDomAllocList);
5128 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5129 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5131 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5132 if(dmrsDlCfg->choice.setup)
5134 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5136 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5138 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5139 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5141 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5144 /*******************************************************************
5146 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5150 * Function : FreeBWPDlDedPdcchCfg
5152 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5154 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5159 * ****************************************************************/
5160 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5164 struct PDCCH_Config *pdcchCfg=NULLP;
5165 struct ControlResourceSet *controlRSet=NULLP;
5166 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5168 if(dlBwp->pdcch_Config->choice.setup)
5170 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5171 if(pdcchCfg->controlResourceSetToAddModList)
5173 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5174 if(controlRSetList->list.array)
5176 controlRSet = controlRSetList->list.array[idx2];
5179 if(controlRSet->frequencyDomainResources.buf)
5181 if(controlRSet->pdcch_DMRS_ScramblingID)
5183 if(pdcchCfg->searchSpacesToAddModList)
5185 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5186 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5187 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5189 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5191 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5192 controlRSet->frequencyDomainResources.size);
5195 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5197 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5199 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5201 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5202 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5204 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5207 /*******************************************************************
5209 * @brief Builds RLC Config
5213 * Function : BuildRlcConfig
5215 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5217 * @params[in] RLC_Config *rlcConfig
5219 * @return ROK - success
5222 * ****************************************************************/
5223 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5226 rlcConfig->present = RLC_Config_PR_am;
5228 rlcConfig->choice.am = NULLP;
5229 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5230 if(!rlcConfig->choice.am)
5232 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5237 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5238 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5239 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5241 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5244 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5245 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5246 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5247 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5248 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5251 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5252 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5253 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5255 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5258 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5259 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5260 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5265 /*******************************************************************
5267 * @brief Builds MAC LC Config
5271 * Function : BuildMacLCConfig
5273 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5275 * @params[in] struct LogicalChannelConfig macLcConfig
5277 * @return ROK - success
5280 * ****************************************************************/
5281 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5284 macLcConfig->ul_SpecificParameters = NULLP;
5285 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5286 if(!macLcConfig->ul_SpecificParameters)
5288 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5292 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5293 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5294 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5295 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5296 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5297 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5298 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5300 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5301 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5302 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5304 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5307 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5309 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5310 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5311 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5313 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5316 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5318 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5319 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5320 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5324 /*******************************************************************
5326 * @brief Builds RLC Bearer to Add/Mod list
5330 * Function :BuildRlcBearerToAddModList
5332 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5334 * @params[in] rlc_BearerToAddModList
5336 * @return ROK - success
5339 * ****************************************************************/
5340 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5342 uint8_t idx, elementCnt;
5345 rlcBearerList->list.count = elementCnt;
5346 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5348 rlcBearerList->list.array = NULLP;
5349 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5350 if(!rlcBearerList->list.array)
5352 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5356 for(idx=0; idx<rlcBearerList->list.count; idx++)
5358 rlcBearerList->list.array[idx] = NULLP;
5359 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5360 if(!rlcBearerList->list.array[idx])
5362 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5368 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5370 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5371 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5373 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5377 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5378 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5380 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5381 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5382 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5383 if(!rlcBearerList->list.array[idx]->rlc_Config)
5385 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5389 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5391 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5395 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5396 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5397 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5399 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5403 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5405 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5412 /*******************************************************************
5414 * @brief Free memory allocated for CellGroupConfig
5418 * Function : FreeMemCellGrpCfg
5420 * Functionality: Deallocating memory of CellGroupConfig
5422 * @params[in] pointer to CellGroupConfigRrc_t
5424 * @return ROK - success
5427 ******************************************************************/
5428 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5431 SpCellConfig_t *spCellCfg=NULLP;
5432 ServingCellConfig_t *srvCellCfg=NULLP;
5433 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5434 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5435 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5436 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5437 struct RLC_Config *rlcConfig=NULLP;
5438 struct LogicalChannelConfig *macLcConfig=NULLP;
5439 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5440 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5441 struct TAG_Config *tagConfig=NULLP;
5442 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5443 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5444 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5446 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5449 if(rlcBearerList->list.array)
5451 for(idx=0; idx<rlcBearerList->list.count; idx++)
5453 if(rlcBearerList->list.array[idx])
5455 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5456 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5459 if(rlcConfig->choice.am)
5461 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5462 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5463 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5465 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5467 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5470 if(macLcConfig->ul_SpecificParameters)
5472 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5473 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5474 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5476 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5478 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5481 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5483 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5486 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5489 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5490 if(schedulingRequestConfig)
5492 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5495 if(schReqList->list.array)
5497 for(idx=0;idx<schReqList->list.count; idx++)
5499 if(schReqList->list.array[idx])
5501 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5502 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5505 CU_FREE(schReqList->list.array, schReqList->list.size);
5507 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5508 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5509 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5511 if(macCellGrpCfg->bsr_Config)
5513 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5515 tagConfig = macCellGrpCfg->tag_Config;
5518 tagList = tagConfig->tag_ToAddModList;
5521 if(tagList->list.array)
5523 for(idx=0; idx<tagList->list.count; idx++)
5525 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5527 CU_FREE(tagList->list.array, tagList->list.size);
5529 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5531 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5534 phrConfig = macCellGrpCfg->phr_Config;
5537 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5538 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5541 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5544 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5547 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5548 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5551 spCellCfg = cellGrpCfg->spCellConfig;
5554 if(spCellCfg->servCellIndex)
5556 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5558 if(spCellCfg->spCellConfigDedicated)
5560 srvCellCfg = spCellCfg->spCellConfigDedicated;
5561 if(srvCellCfg->initialDownlinkBWP)
5563 dlBwp = srvCellCfg->initialDownlinkBWP;
5564 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5566 if(srvCellCfg->defaultDownlinkBWP_Id)
5568 if(srvCellCfg->uplinkConfig)
5570 if(srvCellCfg->pdsch_ServingCellConfig)
5572 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5573 if(pdschCfg->choice.setup)
5575 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5576 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5578 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5579 ServingCellConfig__pdsch_ServingCellConfig));
5581 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5582 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5584 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5586 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5588 if(dlBwp->pdcch_Config)
5590 if(dlBwp->pdsch_Config)
5592 FreeBWPDlDedPdschCfg(dlBwp);
5593 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5595 FreeBWPDlDedPdcchCfg(dlBwp);
5596 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5598 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5600 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5602 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5604 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5606 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5611 /*******************************************************************
5613 * @brief Fills CellGroupConfig
5617 * Function : fillCellGrpCfg
5619 * Functionality: Fills CellGroupConfig
5621 * @params[in] pointer to CellGroupConfigRrc_t
5623 * @return ROK - success
5626 ******************************************************************/
5628 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5630 uint8_t ret = RFAILED;
5631 CellGroupConfigRrc_t cellGrpCfg;
5632 asn_enc_rval_t encRetVal;
5636 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5638 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5639 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5640 if(!cellGrpCfg.rlc_BearerToAddModList)
5642 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5645 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5647 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5651 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5652 cellGrpCfg.mac_CellGroupConfig = NULLP;
5653 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5654 if(!cellGrpCfg.mac_CellGroupConfig)
5656 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5659 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5661 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5666 cellGrpCfg.physicalCellGroupConfig = NULLP;
5667 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5668 if(!cellGrpCfg.physicalCellGroupConfig)
5670 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5673 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5675 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5679 cellGrpCfg.spCellConfig = NULLP;
5680 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5681 if(!cellGrpCfg.spCellConfig)
5683 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5686 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5688 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5692 cellGrpCfg.sCellToAddModList = NULLP;
5693 cellGrpCfg.sCellToReleaseList = NULLP;
5694 cellGrpCfg.ext1 = NULLP;
5696 /* encode cellGrpCfg into duToCuRrcContainer */
5697 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5698 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5700 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5701 /* Encode results */
5702 if(encRetVal.encoded == ENCODE_FAIL)
5704 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5705 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5710 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5711 for(int i=0; i< encBufSize; i++)
5713 DU_LOG("%x",encBuf[i]);
5717 cellGrp->size = encBufSize;
5718 CU_ALLOC(cellGrp->buf, cellGrp->size);
5721 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5724 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5728 FreeMemCellGrpCfg(&cellGrpCfg);
5732 /*******************************************************************
5734 * @brief Free UE Capability RAT container
5738 * Function : freeUeCapRatCont
5741 * Free UE Capability RAT conatiner
5744 * @return ROK - success
5747 * ****************************************************************/
5748 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5751 FeatureSets_t *featureSets;
5753 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5755 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5757 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5758 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5760 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5763 if(ueNrCap->featureSets)
5765 featureSets = ueNrCap->featureSets;
5766 if(featureSets->featureSetsDownlinkPerCC)
5768 if(featureSets->featureSetsDownlinkPerCC->list.array)
5770 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5772 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5773 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5774 sizeof(ModulationOrder_t));
5775 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5777 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5779 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5782 if(featureSets->featureSetsUplinkPerCC)
5784 if(featureSets->featureSetsUplinkPerCC->list.array)
5786 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5788 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5790 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5791 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5792 sizeof(ModulationOrder_t));
5793 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5796 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5798 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5800 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5804 /*******************************************************************
5806 * @brief Free UE capability RAT container list
5810 * Function : freeUeCapRatContList
5812 * Functionality: Free UE capability RAT container list
5815 * @return ROK - success
5818 * ****************************************************************/
5819 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5822 if(ueCapablityList->list.array)
5824 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5826 if(ueCapablityList->list.array[idx])
5827 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5829 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5833 /*******************************************************************
5835 * @brief Fill feature sets
5839 * Function : fillFeatureSets
5841 * Functionality: Fill feature sets
5844 * @return ROK - success
5847 * ****************************************************************/
5848 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5850 uint8_t idx, elementCnt;
5852 featureSets->featureSetsDownlink = NULLP;
5853 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5854 if(!featureSets->featureSetsDownlinkPerCC)
5856 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5861 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5862 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5863 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5864 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5866 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5870 for(idx = 0; idx < elementCnt; idx++)
5872 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5873 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5875 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5881 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5882 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5883 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5884 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5885 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5887 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5888 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5890 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5893 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5895 featureSets->featureSetsUplink = NULLP;
5896 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5897 if(!featureSets->featureSetsUplinkPerCC)
5899 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5904 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5905 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5906 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5907 if(!featureSets->featureSetsUplinkPerCC->list.array)
5909 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5913 for(idx = 0; idx < elementCnt; idx++)
5915 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5916 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5918 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5924 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5925 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5926 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5927 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5928 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5929 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5931 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5932 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5934 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5937 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5942 /*******************************************************************
5944 * @brief Fill UE capability RAT container
5948 * Function : fillUeCapRatCont
5950 * Functionality: Fill UE capability RAT container
5952 * @params[in] UE Capability RAT container buffer
5953 * @return ROK - success
5956 * ****************************************************************/
5957 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5960 uint8_t idx, elementCnt;
5961 asn_enc_rval_t encRetVal;
5962 UE_NR_Capability_t ueNrCap;
5966 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5968 /* Filling PDCP parameters */
5969 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5970 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5971 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5972 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5973 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5974 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5975 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5976 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5977 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5978 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5979 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5980 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5981 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5982 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5983 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5984 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5985 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5987 ueNrCap.rlc_Parameters = NULLP;
5988 ueNrCap.mac_Parameters = NULLP;
5990 /* Filling PHY parameters */
5991 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5992 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5993 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5994 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5995 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5997 /* Filling RF parameters */
5999 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6000 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6001 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6002 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6004 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6009 for(idx = 0; idx < elementCnt; idx++)
6011 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6012 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6022 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6023 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6024 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6026 ueNrCap.measAndMobParameters = NULLP;
6027 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6028 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6029 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6030 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6031 ueNrCap.featureSets = NULLP;
6033 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6034 if(!ueNrCap.featureSets)
6036 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6041 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6043 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6048 ueNrCap.featureSetCombinations = NULLP;
6049 ueNrCap.lateNonCriticalExtension = NULLP;
6050 ueNrCap.nonCriticalExtension = NULLP;
6052 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6053 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6054 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6056 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6058 /* Encode results */
6059 if(encRetVal.encoded == ENCODE_FAIL)
6061 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6062 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6067 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6068 for(int i=0; i< encBufSize; i++)
6070 DU_LOG("%x",encBuf[i]);
6074 ueCapRatContBuf->size = encBufSize;
6075 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6076 if(!ueCapRatContBuf->buf)
6078 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6081 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6085 freeUeCapRatCont(&ueNrCap);
6089 /*******************************************************************
6091 * @brief Fill UE Capability RAT container list
6095 * Function : fillUeCapRatContList
6097 * Functionality: Fill UE Capability RAT container list
6100 * @params[in] UE capability RAT container list buffer
6101 * @return ROK - success
6104 * ****************************************************************/
6105 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6107 uint8_t ret = RFAILED;
6108 uint8_t idx, elementCnt;
6109 asn_enc_rval_t encRetVal;
6110 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6115 ueCapablityList.list.count = elementCnt;
6116 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6118 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6119 if(!ueCapablityList.list.array)
6121 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6126 for(idx=0; idx<elementCnt; idx++)
6128 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6129 if(ueCapablityList.list.array[idx] == NULLP)
6131 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6137 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6138 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6140 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6141 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6142 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6144 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6145 &ueCapablityList, PrepFinalEncBuf, encBuf);
6147 /* Encode results */
6148 if(encRetVal.encoded == ENCODE_FAIL)
6150 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6151 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6156 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6157 for(int i=0; i< encBufSize; i++)
6159 DU_LOG("%x",encBuf[i]);
6163 ueCapablityListBuf->size = encBufSize;
6164 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6165 if(!ueCapablityListBuf->buf)
6167 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6170 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6174 freeUeCapRatContList(&ueCapablityList);
6178 /*******************************************************************
6180 * @brief Fills CuToDuContainer
6184 * Function : fillCuToDuContainer
6186 * Functionality: Fills CuToDuContainer
6188 * @params[in] pointer to CUtoDURRCInformation_t
6190 * @return ROK - success
6193 ******************************************************************/
6195 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6197 uint8_t elementCnt = 0;
6199 uint8_t idx, idx2, rrcBufLen;
6201 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6202 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6204 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6207 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6209 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6210 if(rrcMsg->iE_Extensions)
6213 rrcMsg->iE_Extensions->list.count = elementCnt;
6214 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6216 /* Initialize the CUtoDURRCInformation_ExtIEs */
6217 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6219 if(rrcMsg->iE_Extensions->list.array == NULLP)
6221 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6225 for(idx=0; idx<elementCnt; idx++)
6227 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6228 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6234 /* Filling CellGroupConfig_t IE */
6235 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6236 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6237 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6238 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6239 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6244 /*******************************************************************
6246 * @brief Free CuToDuContainer
6250 * Function : FreeCuToDuInfo
6252 * Functionality: Free CuToDuContainer
6254 * @params[in] pointer to CUtoDURRCInformation_t
6256 * @return ROK - success
6259 ******************************************************************/
6261 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6265 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6267 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6268 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6269 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6271 if(rrcMsg->iE_Extensions)
6273 if(rrcMsg->iE_Extensions->list.array)
6275 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6277 if(rrcMsg->iE_Extensions->list.array[idx])
6279 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6281 case ProtocolIE_ID_id_CellGroupConfig:
6282 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6284 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6285 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6290 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6291 rrcMsg->iE_Extensions->list.array[idx]->id);
6297 for(idx2 = 0; idx2 < idx; idx2++)
6299 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6301 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6305 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6308 /*******************************************************************
6310 * @brief Builds and sends the UE Setup Request
6314 * Function : BuildAndSendUeContextSetupReq
6316 * Functionality: Constructs the UE Setup Request and sends
6317 * it to the CU through SCTP.
6321 * @return ROK - success
6324 * ****************************************************************/
6325 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6326 uint16_t rrcContLen, uint8_t *rrcContainer)
6329 uint8_t SplCellListret;
6330 uint8_t SrbSetupret;
6332 uint8_t idx, bufLen;
6334 F1AP_PDU_t *f1apMsg = NULLP;
6335 UEContextSetupRequest_t *ueSetReq = NULLP;
6336 asn_enc_rval_t encRetVal; /* Encoder return value */
6337 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6338 uint8_t ret= RFAILED;
6342 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6344 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6345 if(f1apMsg == NULLP)
6347 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6351 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6352 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6353 if(f1apMsg->choice.initiatingMessage == NULLP)
6355 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6359 f1apMsg->choice.initiatingMessage->procedureCode = \
6360 ProcedureCode_id_UEContextSetup;
6361 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6362 f1apMsg->choice.initiatingMessage->value.present = \
6363 InitiatingMessage__value_PR_UEContextSetupRequest;
6365 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6368 ueSetReq->protocolIEs.list.count = elementCnt;
6369 ueSetReq->protocolIEs.list.size = \
6370 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6372 /* Initialize the UESetup members */
6373 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6375 if(ueSetReq->protocolIEs.list.array == NULLP)
6377 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6381 for(idx1=0; idx1<elementCnt; idx1++)
6383 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6384 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6392 /*GNB CU UE F1AP ID*/
6393 ueSetReq->protocolIEs.list.array[idx]->id = \
6394 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6395 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6396 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6397 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6398 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6400 /*GNB DU UE F1AP ID*/
6402 ueSetReq->protocolIEs.list.array[idx]->id = \
6403 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6404 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6405 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6406 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6407 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6411 ueSetReq->protocolIEs.list.array[idx]->id = \
6412 ProtocolIE_ID_id_SpCell_ID;
6413 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6414 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6415 UEContextSetupRequestIEs__value_PR_NRCGI;
6416 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6422 /*Served Cell Index*/
6424 ueSetReq->protocolIEs.list.array[idx]->id = \
6425 ProtocolIE_ID_id_ServCellIndex;
6426 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6427 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6428 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6429 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6432 /*CellULConfigured*/
6434 ueSetReq->protocolIEs.list.array[idx]->id = \
6435 ProtocolIE_ID_id_SpCellULConfigured;
6436 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6437 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6438 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6439 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6440 CellULConfigured_none;
6442 /*CUtoDURRCContainer*/
6444 ueSetReq->protocolIEs.list.array[idx]->id = \
6445 ProtocolIE_ID_id_CUtoDURRCInformation;
6446 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6447 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6448 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6449 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6454 /*Special Cells to be SetupList*/
6456 ueSetReq->protocolIEs.list.array[idx]->id = \
6457 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6458 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6459 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6460 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6461 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6462 if(SplCellListret != ROK)
6466 /*SRBs To Be Setup List*/
6468 ueSetReq->protocolIEs.list.array[idx]->id = \
6469 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6470 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6471 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6472 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6473 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6474 if(SrbSetupret != ROK)
6478 /*DRBs to Be Setup List*/
6480 ueSetReq->protocolIEs.list.array[idx]->id = \
6481 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6482 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6483 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6484 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6485 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6490 /* RRC Container for security mode */
6492 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6493 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6494 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6495 UEContextSetupRequestIEs__value_PR_RRCContainer;
6496 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6498 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6499 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6500 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6501 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6503 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6506 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6507 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6509 /* RRC delivery status request */
6511 ueSetReq->protocolIEs.list.array[idx]->id = \
6512 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6513 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6514 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6515 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6516 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6517 RRCDeliveryStatusRequest_true;
6519 /* Bit Rate hardcoded as in reference logs */
6521 ueSetReq->protocolIEs.list.array[idx]->id = \
6522 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6523 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6524 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6525 UEContextSetupRequestIEs__value_PR_BitRate;
6526 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6528 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6529 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6530 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6531 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6533 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6536 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6537 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6539 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6541 /* Encode the F1SetupRequest type as APER */
6542 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6544 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6546 /* Encode results */
6547 if(encRetVal.encoded == ENCODE_FAIL)
6549 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6550 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6555 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6556 for(int i=0; i< encBufSize; i++)
6558 DU_LOG("%x",encBuf[i]);
6563 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6565 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6571 FreeUeContextSetupReq(f1apMsg);
6574 }/* End of BuildAndSendUeContextSetupReq*/
6576 /****************************************************************
6577 * @brief Function to process Ul Rrc Msg received from DU
6581 * Function : procUlRrcMsg
6584 * - Function to process Ul Rrc Msg received from DU
6587 * @return ROK - success
6590 * ****************************************************************/
6592 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6594 uint8_t idx, ret, srbId, rrcMsgType;
6595 uint8_t cuUeF1apId, duUeF1apId;
6596 uint8_t *rrcContainer = NULLP;
6597 uint16_t rrcContLen;
6598 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6601 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6603 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6605 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6607 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6609 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6612 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6614 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6617 case ProtocolIE_ID_id_SRBID:
6618 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6620 case ProtocolIE_ID_id_RRCContainer:
6622 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6623 CU_ALLOC(rrcContainer, rrcContLen)
6626 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6629 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6635 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6641 f1apMsgDb.dlRrcMsgCount++;
6642 rrcMsgType = setDlRRCMsgType();
6643 if(rrcMsgType == REGISTRATION_ACCEPT)
6645 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6646 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6648 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6650 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6651 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6652 rrcContLen, rrcContainer);
6654 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6656 /* To trigger the DL RRC Msg for RRC Reconfig */
6657 f1apMsgDb.dlRrcMsgCount++;
6658 rrcMsgType = setDlRRCMsgType();
6659 if(rrcMsgType == RRC_RECONFIG)
6661 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6662 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6665 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6667 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6668 BuildAndSendUeContextModificationReq();
6674 /****************************************************************
6675 * @brief Build And Send F1ResetAck
6679 * Function : FreeF1ResetAck
6682 * - Build And Send F1ResetRSP
6685 * @return ROK - success
6688 * ****************************************************************/
6689 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6692 ResetAcknowledge_t *f1ResetAck;
6696 if(f1apMsg->choice.successfulOutcome)
6698 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6700 if(f1ResetAck->protocolIEs.list.array)
6702 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6704 if(f1ResetAck->protocolIEs.list.array[idx])
6706 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6709 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6711 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6713 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6717 /****************************************************************
6718 * @brief Build And Send F1ResetAck
6722 * Function : BuildAndSendF1ResetAck
6725 * - Build And Send F1ResetRSP
6728 * @return ROK - success
6731 * ****************************************************************/
6733 uint8_t BuildAndSendF1ResetAck()
6736 uint8_t elementCnt = 0;
6737 uint8_t ret = RFAILED;
6738 F1AP_PDU_t *f1apMsg = NULL;
6739 ResetAcknowledge_t *f1ResetAck = NULLP;
6740 asn_enc_rval_t encRetVal;
6741 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6744 /* Allocate the memory for F1ResetRequest_t */
6745 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6746 if(f1apMsg == NULLP)
6748 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6752 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6754 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6755 if(f1apMsg->choice.successfulOutcome == NULLP)
6757 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6761 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6762 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6763 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6764 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6768 f1ResetAck->protocolIEs.list.count = elementCnt;
6769 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6771 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6772 if(f1ResetAck->protocolIEs.list.array == NULLP)
6774 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6778 for(idx=0; idx<elementCnt; idx++)
6780 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6781 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6788 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6789 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6790 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6791 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6793 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6795 /* Encode the F1SetupRequest type as UPER */
6796 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6798 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6800 /* Check encode results */
6801 if(encRetVal.encoded == ENCODE_FAIL)
6803 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6804 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6809 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6810 for(int i=0; i< encBufSize; i++)
6812 DU_LOG("%x",encBuf[i]);
6816 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6818 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6826 FreeF1ResetAck(f1apMsg);
6829 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6833 if(ulInfo->list.array)
6835 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6837 if(ulInfo->list.array[arrIdx])
6839 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6841 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6843 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6845 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6846 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6847 gTPTunnel->gTP_TEID.size);
6849 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6850 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6851 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6853 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6854 sizeof(GTPTunnel_t));
6856 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6859 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6862 /*******************************************************************
6864 * @brief Builds the Uplink Tunnel Info
6868 * Function : BuildUlTnlInfoforDrb2
6870 * Functionality: Constructs the UL TnlInfo For DRB list
6872 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6874 * @return ROK - success
6877 * ****************************************************************/
6878 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6884 ulInfo->list.count = ulCnt;
6885 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6886 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6887 if(ulInfo->list.array == NULLP)
6889 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6892 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6894 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6895 if(ulInfo->list.array[arrIdx] == NULLP)
6897 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6903 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6904 UPTransportLayerInformation_PR_gTPTunnel;
6907 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6908 sizeof(GTPTunnel_t));
6909 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6911 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6914 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6915 transportLayerAddress.size = 4*sizeof(uint8_t);
6916 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6917 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6918 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6919 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6920 transportLayerAddress.buf == NULLP)
6922 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6926 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6927 transportLayerAddress.buf[0] = 192;
6928 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6929 transportLayerAddress.buf[1] = 168;
6930 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6931 transportLayerAddress.buf[2] = 130;
6932 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6933 transportLayerAddress.buf[3] = 82;
6934 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6935 transportLayerAddress.bits_unused = 0;
6938 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6939 = 4 * sizeof(uint8_t);
6940 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6941 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6942 gTPTunnel->gTP_TEID.size);
6943 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6946 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6949 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6950 gTP_TEID.buf[0] = 0;
6951 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6952 gTP_TEID.buf[1] = 0;
6953 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6954 gTP_TEID.buf[2] = 0;
6955 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6956 gTP_TEID.buf[3] = 2;
6959 }/*End of BuildULTnlInfo*/
6960 /*******************************************************************
6962 * @brief freeing the DRB 2 item
6966 * Function : FreeDrb2Item
6968 * Functionality: freeing the DRB 2 item
6970 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6972 * @return ROK - success
6975 * ****************************************************************/
6977 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6980 SNSSAI_t *snssai =NULLP;
6981 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6983 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6984 switch(drbItem->qoSInformation.present)
6986 case QoSInformation_PR_NOTHING:
6988 case QoSInformation_PR_eUTRANQoS:
6990 if(drbItem->qoSInformation.choice.eUTRANQoS)
6992 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6996 case QoSInformation_PR_choice_extension:
6998 if(drbItem->qoSInformation.choice.choice_extension)
7000 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7002 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7005 CU_FREE(snssai->sST.buf,snssai->sST.size);
7011 CU_FREE(snssai->sD->buf,snssai->sD->size);
7013 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7016 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7017 if(flowMap->list.array)
7019 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7021 if(flowMap->list.array[arrIdx] )
7023 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7024 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7027 CU_FREE(flowMap->list.array,flowMap->list.size);
7030 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7036 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7037 if(drbItem->uLConfiguration)
7039 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7042 /*******************************************************************
7044 * @brief filling the DRB 2 item
7048 * Function : FillDrb2Item
7050 * Functionality: filling the DRB 2 item
7052 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7054 * @return ROK - success
7057 * ****************************************************************/
7059 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
7064 drbItem->dRBID = DRB2;
7067 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7069 switch(drbItem->qoSInformation.present)
7071 case QoSInformation_PR_NOTHING:
7075 case QoSInformation_PR_eUTRANQoS:
7078 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7079 if(drbItem->qoSInformation.choice.eUTRANQoS)
7081 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7084 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7085 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7086 PriorityLevel_no_priority;
7088 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7089 Pre_emptionCapability_may_trigger_pre_emption;
7091 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7092 Pre_emptionVulnerability_pre_emptable;
7096 case QoSInformation_PR_choice_extension:
7098 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7099 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7101 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7105 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7106 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7107 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7108 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7111 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7116 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7117 choice_extension->value.choice.DRB_Information.sNSSAI);
7120 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7124 /*Flows mapped to DRB List*/
7125 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7126 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7129 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7135 /*ULUPTNLInformation To Be Setup List*/
7136 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7139 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7144 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7146 /*UL Configuration*/
7147 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7148 if(drbItem->uLConfiguration == NULLP)
7150 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7153 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7156 /*******************************************************************
7158 * @brief Builds the DRB to be Setup Mod ItemIes
7162 * Function : FillDrbItemList
7164 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7166 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7168 * @return ROK - success
7171 * ****************************************************************/
7173 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7175 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7176 drbItemIe->criticality = Criticality_reject;
7177 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7179 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7181 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7186 /*******************************************************************
7188 * @brief free the DRB to be Setup Mod list
7192 * Function : FreeDrbToBeSetupModList
7194 * Functionality: free the DRB to be Setup Mod list
7196 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7198 * @return ROK - success
7201 * ****************************************************************/
7202 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7205 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7207 if(drbSet->list.array)
7209 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7211 if(drbSet->list.array[arrIdx] != NULLP)
7215 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7216 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7218 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7221 CU_FREE(drbSet->list.array, drbSet->list.size);
7227 /*******************************************************************
7229 * @brief Builds the DRB to be Setup Mod list
7233 * Function : BuildDrbToBeSetupModList
7235 * Functionality: Constructs the DRB to be Setup Mod list
7237 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7239 * @return ROK - success
7242 * ****************************************************************/
7244 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7251 drbSet->list.count = drbCnt;
7252 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7253 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7254 if(drbSet->list.array == NULLP)
7256 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7259 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7261 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7262 if(drbSet->list.array[arrIdx] == NULLP)
7264 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7270 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7273 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7278 /*******************************************************************
7280 * @brief free the UeContextModification Request
7284 * Function : FreeUeContextModicationRequest
7286 * Functionality : deallocation of memory allocated in UeContextModiification
7289 * @params[in] F1AP_PDU_t *f1apMsg
7293 * ****************************************************************/
7294 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7296 uint8_t arrIdx =0 , ieId=0;
7297 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7301 if(f1apMsg->choice.initiatingMessage)
7303 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7304 if(UeContextModifyReq->protocolIEs.list.array)
7306 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7308 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7310 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7313 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7315 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7317 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7319 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7320 choice.DRBs_ToBeSetupMod_List);
7324 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7327 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7329 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7331 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7334 /*******************************************************************
7336 * @brief Builds the Ue Context Modification Req
7340 * Function : BuildAndSendUeContextModificationReq
7342 * Functionality: Constructs the Ue Context Modification Req
7346 * @return ROK - success
7349 * ****************************************************************/
7350 uint8_t BuildAndSendUeContextModificationReq()
7353 uint8_t elementCnt = 0;
7354 uint8_t ret = RFAILED;
7355 F1AP_PDU_t *f1apMsg = NULLP;
7356 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7358 asn_enc_rval_t encRetVal;
7359 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7363 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7364 if(f1apMsg == NULLP)
7366 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7370 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7372 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7373 if(f1apMsg->choice.initiatingMessage == NULLP)
7375 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7378 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7379 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7380 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7382 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7385 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7386 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7388 /* Initialize the UE context modification members */
7389 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7390 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7392 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7396 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7398 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7399 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7401 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7408 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7409 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7410 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7411 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7412 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
7415 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7416 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7417 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7418 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7419 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
7422 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7423 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7424 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7425 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7426 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7427 value.choice.DRBs_ToBeSetupMod_List));
7432 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7434 /* Encode the F1SetupRequest type as APER */
7435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7437 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7440 /* Encode results */
7441 if(encRetVal.encoded == ENCODE_FAIL)
7443 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7444 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7449 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7450 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7452 DU_LOG("%x",encBuf[ieIdx]);
7456 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7458 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7466 FreeUeContextModicationRequest(f1apMsg);
7469 /*****************************************************************i
7471 * @brief Free memory allocated for UE Context Release Command
7475 * Function : FreeUeContextReleaseCommand
7478 * - Free memory allocated for UE Context Release Command
7480 * @params[in] F1AP_PDU_t *f1apMsg
7483 * *************************************************************/
7484 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
7487 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
7491 if(f1apMsg->choice.initiatingMessage)
7493 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7494 if(ueReleaseCommand->protocolIEs.list.array)
7496 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
7498 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7500 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
7502 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7504 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7507 /*******************************************************************
7509 * @brief Builds the Ue Context Release Command
7513 * Function : BuildAndSendUeContextReleaseCommand
7515 * Functionality: Constructs the Ue Context Release Command
7519 * @return ROK - success
7522 * ****************************************************************/
7523 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
7525 bool memAllocFailed = false;
7526 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
7527 F1AP_PDU_t *f1apMsg = NULLP;
7528 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
7530 asn_enc_rval_t encRetVal;
7531 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
7535 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7536 if(f1apMsg == NULLP)
7538 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
7542 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7544 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7545 if(f1apMsg->choice.initiatingMessage == NULLP)
7547 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
7550 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
7551 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7552 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
7554 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7557 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
7558 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
7560 /* Initialize the UE context modification members */
7561 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
7562 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
7564 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
7568 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7570 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7571 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
7573 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
7574 memAllocFailed = true;
7579 if(memAllocFailed == true)
7584 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7585 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7586 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7587 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
7588 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
7591 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7592 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7593 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7594 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
7595 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
7598 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
7599 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7600 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7601 UEContextReleaseCommandIEs__value_PR_Cause;
7602 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7603 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
7604 CauseRadioNetwork_normal_release;
7606 /* RRC Container for RRC release */
7608 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
7609 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7610 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7611 UEContextReleaseCommandIEs__value_PR_RRCContainer;
7612 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
7614 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
7615 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7616 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7617 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7619 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
7622 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
7623 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
7625 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7627 /* Encode the UE Context Release Command type as APER */
7628 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7630 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7633 /* Encode results */
7634 if(encRetVal.encoded == ENCODE_FAIL)
7636 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
7637 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7642 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
7643 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7645 DU_LOG("%x",encBuf[ieIdx]);
7649 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7651 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
7659 FreeUeContextReleaseCommand(f1apMsg);
7662 /*******************************************************************
7664 * @brief process Ue context release request
7668 * Function : procUeContextReleaseReq
7671 * - process Ue context release request
7673 * @params[in] F1AP_PDU_t *f1apMsg
7674 * @return ROK - success
7677 * ****************************************************************/
7678 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
7680 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
7682 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
7683 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
7685 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
7687 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
7689 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7691 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7694 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7696 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7703 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
7705 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
7710 /*******************************************************************
7712 * @brief processing of Gnb-DU config update
7716 * Function : procGnbDuUpdate
7719 * - processing of Gnb-DU config update
7721 * @params[in] F1AP_PDU_t *f1apMsg
7722 * @return ROK - success
7725 * ****************************************************************/
7726 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
7728 bool cellToBeDelete = false;
7730 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
7732 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
7734 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
7736 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
7738 case ProtocolIE_ID_id_TransactionID:
7740 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
7742 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
7744 cellToBeDelete = true;
7747 case ProtocolIE_ID_id_gNB_DU_ID:
7751 if(BuildAndSendDUUpdateAck() != ROK)
7753 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
7757 if(cellToBeDelete == false)
7759 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7760 if(BuildAndSendF1ResetReq() != ROK)
7762 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
7768 memset(&f1apMsgDb, 0, sizeof(F1apMsgDb));
7773 /*******************************************************************
7775 * @brief Handles received F1AP message and sends back response
7779 * Function : F1APMsgHdlr
7782 * - Decodes received F1AP control message
7783 * - Prepares response message, encodes and sends to SCTP
7786 * @return ROK - success
7789 * ****************************************************************/
7790 void F1APMsgHdlr(Buffer *mBuf)
7796 F1AP_PDU_t *f1apMsg = NULLP;
7797 asn_dec_rval_t rval; /* Decoder return value */
7798 F1AP_PDU_t f1apasnmsg ;
7800 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7801 ODU_PRINT_MSG(mBuf, 0,0);
7803 /* Copy mBuf into char array to decode it */
7804 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7805 CU_ALLOC(recvBuf, (Size)recvBufLen);
7807 if(recvBuf == NULLP)
7809 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
7812 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7814 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
7818 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
7819 for(i=0; i< recvBufLen; i++)
7821 DU_LOG("%x",recvBuf[i]);
7824 /* Decoding flat buffer into F1AP messsage */
7825 f1apMsg = &f1apasnmsg;
7826 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7828 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7829 CU_FREE(recvBuf, (Size)recvBufLen);
7831 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7833 DU_LOG("\nERROR --> F1AP : ASN decode failed");
7837 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7839 switch(f1apMsg->present)
7841 case F1AP_PDU_PR_initiatingMessage:
7843 switch(f1apMsg->choice.initiatingMessage->value.present)
7845 case InitiatingMessage__value_PR_Reset:
7847 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
7848 BuildAndSendF1ResetAck();
7852 case InitiatingMessage__value_PR_F1SetupRequest:
7854 DU_LOG("\nINFO --> F1AP : F1 setup request received");
7855 BuildAndSendF1SetupRsp();
7859 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7861 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
7862 procGnbDuUpdate(f1apMsg);
7865 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7867 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
7868 procInitULRRCMsg(f1apMsg);
7871 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7873 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
7874 procUlRrcMsg(f1apMsg);
7878 case InitiatingMessage__value_PR_RRCDeliveryReport:
7880 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
7883 case InitiatingMessage__value_PR_UEContextReleaseRequest:
7885 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
7886 procUeContextReleaseReq(f1apMsg);
7891 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
7892 f1apMsg->choice.initiatingMessage->value.present);
7895 }/* End of switch(initiatingMessage) */
7899 case F1AP_PDU_PR_successfulOutcome:
7901 switch(f1apMsg->choice.successfulOutcome->value.present)
7903 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7905 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
7908 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7910 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
7911 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7914 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
7916 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
7919 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
7921 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
7926 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
7927 f1apMsg->choice.successfulOutcome->value.present);
7930 }/* End of switch(successfulOutcome) */
7935 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7938 }/* End of switch(f1apMsg->present) */
7940 } /* End of F1APMsgHdlr */
7942 /**********************************************************************
7944 **********************************************************************/