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"
27 /*header files needed for Ue Context Setup */
28 #include<ProtocolIE-Field.h>
29 #include "ProtocolExtensionField.h"
30 #include "ProtocolIE-SingleContainer.h"
32 #include "ModulationOrder.h"
34 #include "UE-CapabilityRAT-Container.h"
35 #include "UE-CapabilityRAT-ContainerList.h"
36 #include "UE-CapabilityRAT-ContainerListRRC.h"
37 #include "SupportedBandwidth.h"
38 #include "FeatureSetUplinkPerCC.h"
39 #include "FeatureSetDownlinkPerCC.h"
40 #include "FeatureSets.h"
41 #include "RF-Parameters.h"
42 #include "UE-NR-Capability.h"
43 #include "ProtocolExtensionContainer.h"
44 #include "CellGroupConfigRrc.h"
45 #include "MAC-CellGroupConfig.h"
46 #include "SchedulingRequestConfig.h"
47 #include "SchedulingRequestToAddMod.h"
48 #include "BSR-Config.h"
49 #include "TAG-Config.h"
51 #include "PHR-Config.h"
52 #include "RLC-Config.h"
53 #include "UL-AM-RLC.h"
54 #include "DL-AM-RLC.h"
55 #include "LogicalChannelConfig.h"
56 #include "RLC-BearerConfig.h"
57 #include "PhysicalCellGroupConfig.h"
58 #include "SpCellConfig.h"
59 #include "ServingCellConfig.h"
60 #include "ControlResourceSet.h"
61 #include "SearchSpace.h"
62 #include "PDCCH-Config.h"
63 #include "PDSCH-TimeDomainResourceAllocation.h"
64 #include "PDSCH-TimeDomainResourceAllocationList.h"
65 #include "DMRS-DownlinkConfig.h"
66 #include "PDSCH-Config.h"
67 #include "BWP-DownlinkDedicated.h"
68 #include "PUSCH-TimeDomainResourceAllocation.h"
69 #include "PUSCH-TimeDomainResourceAllocationList.h"
70 #include "DMRS-UplinkConfig.h"
71 #include "PUSCH-Config.h"
72 #include "SRS-ResourceId.h"
73 #include "SRS-Resource.h"
74 #include "SRS-ResourceSet.h"
75 #include "SRS-Config.h"
76 #include "PUCCH-Config.h"
77 #include "PUCCH-ResourceSet.h"
78 #include "PUCCH-Resource.h"
79 #include "PUCCH-format1.h"
80 #include "PUCCH-FormatConfig.h"
81 #include "BWP-UplinkDedicated.h"
82 #include "PUSCH-ServingCellConfig.h"
83 #include "UplinkConfig.h"
84 #include "PDSCH-ServingCellConfig.h"
85 #include "EUTRANQoS.h"
86 #include "GBR-QosInformation.h"
87 #include "DRBs-ToBeSetupMod-List.h"
88 #include "DRBs-ToBeSetupMod-Item.h"
89 #include "DRBs-Setup-Item.h"
90 #include "DLUPTNLInformation-ToBeSetup-List.h"
91 #include "DLUPTNLInformation-ToBeSetup-Item.h"
92 #include "UPTransportLayerInformation.h"
93 #include "GTPTunnel.h"
94 #include "QoSInformation.h"
96 /* MACRO for CUtoDURRCInformation */
98 #define FREQ_DOM_RSRC_SIZE 6
99 #define CORESET0_END_PRB 48
100 #define CORESET1_NUM_PRB 24
101 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
102 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
103 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
104 #define PDCCH_SRCH_SPC_TWO_ID 2
106 #define SCRAMBLING_ID NR_PCI
107 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
108 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
109 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
110 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
111 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
112 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
113 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
114 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
115 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
117 /* MACRO Ddefine for PDSCH Configuration */
119 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
120 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
121 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
122 #define PDSCH_NUM_HARQ_PROC 5
123 #define PDSCH_MAPPING_TYPE_A 0
124 #define PDSCH_MAPPING_TYPE_B 1
126 /* MACRO Define for PUSCH Configuration */
127 #define PUSCH_K2_CFG1 1
128 #define PUSCH_K2_CFG2 2
130 #define PUSCH_MSG3_DELTA_PREAMBLE 0
131 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
132 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
133 #define PUSCH_MAX_MIMO_LAYERS 1
134 #define PUSCH_PROCESS_TYPE2_ENABLED false
135 #define PUSCH_MAPPING_TYPE_A 0
136 #define PUSCH_MAPPING_TYPE_B 1
138 /* MACRO defines for SRC config */
139 #define SRS_RSRC_ID 1
140 #define SRS_RSET_ID 1
141 #define SRS_COMB_OFFSET_N2 0
142 #define SRS_CYCLIC_SHIFT_N2 0
143 #define SRS_FREQ_DOM_POS 0
144 #define SRS_FREQ_DOM_SHIFT 0
149 #define APERIODIC_SRS_RESRC_TRIGGER 1
151 /* Macro definitions for DUtoCuRrcContainer */
152 #define CELL_GRP_ID 1
154 #define SR_PROHIBIT_TMR 5
155 #define SR_TRANS_MAX 2
156 #define PERIODIC_BSR_TMR 2
157 #define RETX_BSR_TMR 5
158 #define SR_DELAY_TMR 6
160 #define TIME_ALIGNMENT_TMR 7
161 #define PHR_PERIODIC_TMR 7
162 #define PHR_PROHIBHIT_TMR 0
163 #define PHR_PWR_FACTOR_CHANGE 3
164 #define PHR_MODE_OTHER_CG 0
167 #define SN_FIELD_LEN 0
168 #define T_POLL_RETRANSMIT 8
171 #define MAX_RETX_THRESHOLD 5
172 #define T_REASSEMBLY 8
173 #define T_STATUS_PROHIBHIT 7
174 #define MAC_LC_PRIORITY 1
175 #define PRIORTISIED_BIT_RATE 15
176 #define BUCKET_SIZE_DURATION 5
179 #define PDSCH_HARQ_ACK_CODEBOOK 1
180 #define SERV_CELL_IDX 0
181 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
182 #define ACTIVE_DL_BWP_ID 0
183 #define ACTIVE_UL_BWP_ID 0
184 #define SCRAMBLING_ID NR_PCI
185 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
186 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
187 #define FIVE_QI_VALUE9 9 /*spec 23.501, Table 5.7.4-1*/
188 #define FIVE_QI_VALUE8 8 /*spec 23.501, Table 5.7.4-1*/
189 #define PDU_SESSION_ID_1 1
190 #define PDU_SESSION_ID_2 2
191 #define INVALID_PDU_SESSION_ID -1
193 /*******************************************************************
195 * @brief Sends F1 msg over SCTP
199 * Function : SendF1APMsg
201 * Functionality: Sends F1 msg over SCTP
203 * @params[in] Region region
205 * @return ROK - success
208 * ****************************************************************/
209 S16 SendF1APMsg(Region region, Pool pool)
211 Buffer *mBuf = NULLP;
213 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
215 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
217 ODU_PRINT_MSG(mBuf, 0,0);
219 if(sctpSend(mBuf) != ROK)
221 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
222 ODU_PUT_MSG_BUF(mBuf);
228 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
229 ODU_PUT_MSG_BUF(mBuf);
232 ODU_PUT_MSG_BUF(mBuf);
236 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
243 /*******************************************************************
245 * @brief Builds NRCell ID
249 * Function : BuildNrCellId
251 * Functionality: Building the NR Cell ID
253 * @params[in] BIT_STRING_t *nrcell
254 * @return ROK - success
257 * ****************************************************************/
259 S16 BuildNrCellId(BIT_STRING_t *nrcell)
261 memset(nrcell->buf, 0, nrcell->size);
263 nrcell->bits_unused = 4;
264 nrcell->size = 5 * sizeof(uint8_t);
268 /********************************************************************
270 * @brief Builds and sends the F1SetupResponse
274 * Function : BuildAndSendF1SetupRsp
276 * Functionality: Constructs the F1SetupResponse message and sends
277 * it back to the DU through SCTP.
279 * @params[in] void **buf,Buffer to which encoded pattern is written into
280 * @params[in] int *size,size of buffer
282 * @return ROK - success
285 * ****************************************************************/
286 S16 BuildAndSendF1SetupRsp(BIT_STRING_t *nrcellId)
289 uint8_t elementCnt,cellCnt;
290 F1AP_PDU_t *f1apMsg = NULL;
291 F1SetupResponse_t *f1SetupRsp;
292 GNB_CU_Name_t *cuName;
293 Cells_to_be_Activated_List_t *cellToActivate;
294 RRC_Version_t *rrcVer;
295 asn_enc_rval_t encRetVal;
296 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
298 /* Allocate the memory for F1SetupRequest_t */
299 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
302 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
305 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
307 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
308 if(f1apMsg->choice.successfulOutcome == NULLP)
310 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
311 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
315 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
316 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
317 f1apMsg->choice.successfulOutcome->value.present = \
318 SuccessfulOutcome__value_PR_F1SetupResponse;
319 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
322 f1SetupRsp->protocolIEs.list.count = elementCnt;
323 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
325 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
326 elementCnt * sizeof(F1SetupResponseIEs_t *));
327 if(f1SetupRsp->protocolIEs.list.array == NULLP)
329 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
330 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
331 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
335 for(idx=0; idx<elementCnt; idx++)
337 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
338 sizeof(F1SetupResponseIEs_t));
339 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
341 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
342 elementCnt * sizeof(F1SetupResponseIEs_t *));
343 CU_FREE(f1apMsg->choice.successfulOutcome, \
344 sizeof(SuccessfulOutcome_t));
345 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
352 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
353 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
354 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
355 F1SetupResponseIEs__value_PR_TransactionID;
356 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
361 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
362 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
363 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
364 F1SetupResponseIEs__value_PR_GNB_CU_Name;
365 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
366 cuName->size = sizeof(cuCfgParams.cuName);
368 CU_ALLOC(cuName->buf, sizeof(cuName->size));
369 if(cuName->buf == NULLP)
371 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
373 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
374 sizeof(F1SetupResponseIEs_t));
376 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
377 elementCnt * sizeof(F1SetupResponseIEs_t *));
378 CU_FREE(f1apMsg->choice.successfulOutcome,\
379 sizeof(SuccessfulOutcome_t));
380 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
383 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
385 /*Cells to be activated list*/
387 f1SetupRsp->protocolIEs.list.array[idx]->id = \
388 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
389 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
390 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
391 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
392 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
393 Cells_to_be_Activated_List;
395 cellToActivate->list.count = cellCnt;
396 cellToActivate->list.size = \
397 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
398 CU_ALLOC(cellToActivate->list.array,\
399 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
400 if(cellToActivate->list.array == NULLP)
402 CU_FREE(cuName->buf, sizeof(cuName->size));
403 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
405 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
406 sizeof(F1SetupResponseIEs_t));
408 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
409 elementCnt * sizeof(F1SetupResponseIEs_t *));
410 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
411 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
414 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
416 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
417 if(cellToActivate->list.array[ieIdx] == NULLP)
419 CU_FREE(cellToActivate->list.array,\
420 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
421 CU_FREE(cuName->buf, sizeof(cuName->size));
422 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
424 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
425 sizeof(F1SetupResponseIEs_t));
427 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
428 elementCnt * sizeof(F1SetupResponseIEs_t *));
429 CU_FREE(f1apMsg->choice.successfulOutcome, \
430 sizeof(SuccessfulOutcome_t));
431 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
435 cellToActivate->list.array[0]->id = \
436 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
437 cellToActivate->list.array[0]->criticality = Criticality_ignore;
438 cellToActivate->list.array[0]->value.present = \
439 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
440 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
441 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
442 CU_ALLOC(cellToActivate->list.array[0]->\
443 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
445 if(cellToActivate->list.array[0]->value.choice.\
446 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
449 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
451 CU_FREE(cellToActivate->list.array[ieIdx],\
452 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
455 CU_FREE(cellToActivate->list.array,\
456 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
457 CU_FREE(cuName->buf, sizeof(cuName->size));
458 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
460 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
461 sizeof(F1SetupResponseIEs_t));
463 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
464 elementCnt * sizeof(F1SetupResponseIEs_t *));
465 CU_FREE(f1apMsg->choice.successfulOutcome, \
466 sizeof(SuccessfulOutcome_t));
467 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
470 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
471 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
472 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
473 nRCGI.nRCellIdentity.size = 5;
474 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
475 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
477 if(cellToActivate->list.array[0]->value.choice.\
478 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
480 CU_FREE(cellToActivate->list.array[0]->\
481 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
483 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
485 CU_FREE(cellToActivate->list.array[ieIdx],\
486 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
489 CU_FREE(cellToActivate->list.array,\
490 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
491 CU_FREE(cuName->buf, sizeof(cuName->size));
492 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
494 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
495 sizeof(F1SetupResponseIEs_t));
497 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
498 elementCnt * sizeof(F1SetupResponseIEs_t *));
499 CU_FREE(f1apMsg->choice.successfulOutcome, \
500 sizeof(SuccessfulOutcome_t));
501 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
504 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
507 f1SetupRsp->protocolIEs.list.array[idx]->id = \
508 ProtocolIE_ID_id_GNB_CU_RRC_Version;
509 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
510 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
511 F1SetupResponseIEs__value_PR_RRC_Version;
512 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
513 rrcVer->latest_RRC_Version.size = RRC_SIZE;
515 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
516 if(rrcVer->latest_RRC_Version.buf == NULLP)
518 CU_FREE(cuName->buf, sizeof(cuName->size));
519 for(ieIdx=0; ieIdx<elementCnt; idx++)
521 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
522 sizeof(F1SetupResponseIEs_t));
524 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
525 elementCnt * sizeof(F1SetupResponseIEs_t *));
526 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
527 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
531 /* Need to check RRC Version */
532 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
533 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
534 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
535 if(rrcVer->iE_Extensions == NULLP)
537 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
538 CU_FREE(cuName->buf, sizeof(cuName->size));
539 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
541 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
542 sizeof(F1SetupResponseIEs_t));
544 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
545 elementCnt * sizeof(F1SetupResponseIEs_t *));
546 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
547 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
550 rrcVer->iE_Extensions->list.count = 1;
551 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
552 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
553 sizeof(struct RRC_Version_ExtIEs *));
554 if(rrcVer->iE_Extensions->list.array == NULLP)
556 CU_FREE(rrcVer->iE_Extensions,\
557 sizeof(ProtocolExtensionContainer_4624P81_t));
558 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
559 CU_FREE(cuName->buf, sizeof(cuName->size));
560 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
562 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
563 sizeof(F1SetupResponseIEs_t));
565 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
566 elementCnt * sizeof(F1SetupResponseIEs_t *));
567 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
568 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
571 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
572 sizeof(struct RRC_Version_ExtIEs));
573 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
575 CU_FREE(rrcVer->iE_Extensions->list.array,\
576 sizeof(struct RRC_Version_ExtIEs *));
577 CU_FREE(rrcVer->iE_Extensions,\
578 sizeof(ProtocolExtensionContainer_4624P81_t));
579 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
580 CU_FREE(cuName->buf, sizeof(cuName->size));
581 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
583 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
584 sizeof(F1SetupResponseIEs_t));
586 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
587 elementCnt * sizeof(F1SetupResponseIEs_t *));
588 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
589 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
592 rrcVer->iE_Extensions->list.array[0]->id = \
593 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
594 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
595 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
596 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
597 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
598 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
599 CU_ALLOC(rrcVer->iE_Extensions->list.\
600 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
602 if(rrcVer->iE_Extensions->list.\
603 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
605 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
606 sizeof(struct RRC_Version_ExtIEs));
607 CU_FREE(rrcVer->iE_Extensions->list.array,\
608 sizeof(struct RRC_Version_ExtIEs *));
609 CU_FREE(rrcVer->iE_Extensions,\
610 sizeof(ProtocolExtensionContainer_4624P81_t));
611 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
612 CU_FREE(cuName->buf, sizeof(cuName->size));
613 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
615 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
616 sizeof(F1SetupResponseIEs_t));
618 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
619 elementCnt * sizeof(F1SetupResponseIEs_t *));
620 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
621 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
624 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
625 Latest_RRC_Version_Enhanced.buf[0] = 0;
626 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
627 Latest_RRC_Version_Enhanced.buf[1] = 5;
628 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
629 Latest_RRC_Version_Enhanced.buf[2] = 15;
631 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
633 /* Encode the F1SetupRequest type as UPER */
634 memset(encBuf, 0, ENC_BUF_MAX_LEN);
636 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
639 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
640 CU_FREE(cuName->buf, sizeof(cuName->size));
641 for(idx=0; idx<elementCnt; idx++)
643 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
645 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
646 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
647 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
649 /* Check encode results */
650 if(encRetVal.encoded == ENCODE_FAIL)
652 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
653 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
658 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
659 for(int i=0; i< encBufSize; i++)
661 DU_LOG("%x",encBuf[i]);
666 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
668 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
673 }/* End of BuildAndSendF1SetupRsp */
675 /*******************************************************************
677 * @brief Builds and sends the DUUpdateAcknowledge
681 * Function : BuildAndSendDUUpdateAck
683 * Functionality: Constructs the DU Update Acknowledge message and sends
684 * it to the DU through SCTP.
688 * @return ROK - success
691 * ****************************************************************/
693 S16 BuildAndSendDUUpdateAck()
697 F1AP_PDU_t *f1apMsg = NULL;
698 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
699 asn_enc_rval_t enRetVal; /* Encoder return value */
701 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
703 /* Allocate the memory for F1SetupRequest_t */
704 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
707 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
711 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
713 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
714 if(f1apMsg->choice.successfulOutcome == NULLP)
716 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
717 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
721 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
722 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
723 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
724 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
727 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
728 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
730 /* Initialize the F1Setup members */
731 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
732 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
734 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
735 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
736 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
740 for(idx=0; idx<elementCnt; idx++)
742 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
743 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
745 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
746 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
747 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
754 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
755 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
756 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
757 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
758 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
760 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
762 /* Encode the F1SetupRequest type as UPER */
763 memset(encBuf, 0, ENC_BUF_MAX_LEN);
765 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
768 for(idx=0; idx<elementCnt; idx++)
770 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
772 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
773 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
774 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
776 /* Checking encode results */
777 if(enRetVal.encoded == ENCODE_FAIL)
779 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
780 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
785 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
786 for(int i=0; i< encBufSize; i++)
788 DU_LOG("%x",encBuf[i]);
793 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
795 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
801 }/* End of BuildAndSendDUUpdateAck*/
802 /*******************************************************************
804 * @brief deallocating the memory of F1reset msg
808 * Function : FreeF1ResetReq
811 * - freeing memory of F1reset request msg
817 * ****************************************************************/
818 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
821 Reset_t *f1ResetMsg = NULLP;
825 if(f1apMsg->choice.initiatingMessage)
827 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
828 if(f1ResetMsg->protocolIEs.list.array)
830 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
832 if(f1ResetMsg->protocolIEs.list.array[idx])
834 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
837 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
839 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
841 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
844 /*******************************************************************
846 * @brief build ansld ans send f1reset msg
850 * Function : BuildAndSendF1ResetReq
852 * Functionality: build and send f1reset msg
854 * @return ROK - success
857 * ****************************************************************/
858 uint8_t BuildAndSendF1ResetReq()
860 uint8_t elementCnt=0;
862 uint8_t ret= RFAILED;
863 Reset_t *f1ResetMsg = NULLP;
864 F1AP_PDU_t *f1apMsg = NULLP;
865 asn_enc_rval_t encRetVal;
866 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
869 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
872 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
875 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
876 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
877 if(f1apMsg->choice.initiatingMessage == NULLP)
879 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
882 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
883 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
884 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
886 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
889 f1ResetMsg->protocolIEs.list.count = elementCnt;
890 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
892 /* Initialize the F1Reset members */
893 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
894 if(f1ResetMsg->protocolIEs.list.array == NULLP)
896 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
899 for(idx=0; idx<elementCnt; idx++)
901 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
902 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
904 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
911 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
912 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
913 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
914 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
918 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
919 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
920 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
921 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
922 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
926 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
927 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
928 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
929 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
930 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
932 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
934 /* Encode the F1SetupRequest type as APER */
935 memset(encBuf, 0, ENC_BUF_MAX_LEN);
937 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
941 if(encRetVal.encoded == ENCODE_FAIL)
943 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
944 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
949 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
950 for(idx=0; idx< encBufSize; idx++)
952 DU_LOG("%x",encBuf[idx]);
956 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
958 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
966 FreeF1ResetReq(f1apMsg);
970 /*******************************************************************
972 * @brief Fills Radio Bearer Config
976 * Function : fillSrbCfg
978 * Functionality: Fills Radio Bearer Config
980 * @params[in] SRB_ToAddModList *
982 * @return ROK - success
985 * ****************************************************************/
986 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
990 if(bearerCfg != NULLP)
993 bearerCfg->list.count = elementCnt;
994 bearerCfg->list.size =\
995 elementCnt * sizeof(SRB_ToAddMod_t *);
996 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
997 if(bearerCfg->list.array != NULLP)
999 for(idx = 0; idx < elementCnt; idx++)
1001 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
1002 if(bearerCfg->list.array[idx] == NULLP)
1004 for(ieId = 0; ieId < idx; ieId++)
1006 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
1008 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1018 bearerCfg->list.array[idx]->srb_Identity = srbId;
1023 /*******************************************************************
1025 * @brief Fills Master CellGroup Info
1029 * Function : fillMasterCellGroup
1031 * Functionality: Fills Master Cell Group IE
1033 * @params[in] RRCSetup_IEs_t *
1035 * @return ROK - success
1038 * ****************************************************************/
1040 uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
1043 masterCellGroup->buf = NULLP;
1044 if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
1046 masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
1047 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1048 if(masterCellGroup->buf != NULLP)
1050 memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
1051 masterCellGroup->size);
1065 /*******************************************************************
1067 * @brief Fills RRC setup IE
1071 * Function : fillRRCSetupIE
1073 * Functionality: Fills RRC Setup IE
1075 * @params[in] RRCSetup_IEs_t *
1077 * @return ROK - success
1080 * ****************************************************************/
1082 uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
1087 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1088 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1090 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1094 ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
1098 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1104 /*******************************************************************
1106 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1110 * Function : fillDlCcchRrcMsg
1112 * Functionality: Fills DL DCCCH Message required for
1113 * DLRRCMessageTransfer
1115 * @params[in] RRCContainer_t *rrcContainer
1117 * @return ROK - success
1120 * ****************************************************************/
1122 uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
1126 DL_CCCH_Message_t dl_CCCH_Msg;
1127 asn_enc_rval_t encRetVal;
1129 if(rrcContainer != NULLP)
1131 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1133 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1134 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1136 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1137 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1138 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1140 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1141 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1142 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1143 /* Fill RRC Setup IE */
1144 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1145 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1146 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1147 criticalExtensions.choice.rrcSetup != NULLP)
1149 ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1150 criticalExtensions.choice.rrcSetup);
1154 /* encode DL-CCCH message into RRC Container */
1155 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1156 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1158 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1159 /* Encode results */
1160 if(encRetVal.encoded == ENCODE_FAIL)
1162 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1163 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1168 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1169 for(int i = 0; i< encBufSize; i++)
1171 DU_LOG("%x",encBuf[i]);
1173 rrcContainer->size = encBufSize;
1174 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1175 if(rrcContainer->buf != NULLP)
1177 memset(rrcContainer->buf, 0, encBufSize);
1178 for(idx2 = 0; idx2 < encBufSize; idx2++)
1180 rrcContainer->buf[idx2] = encBuf[idx2];
1192 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1198 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1204 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1210 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1215 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1217 uint8_t idx, ied, elementCnt;
1220 qosFlow->list.count = elementCnt;
1221 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1222 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1223 if(qosFlow->list.array != NULLP)
1225 for(idx = 0; idx < elementCnt; idx++)
1227 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1228 if(qosFlow->list.array[idx] == NULLP)
1230 for(ied = 0; ied < idx; ied++)
1232 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1234 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1240 *qosFlow->list.array[idx] = 9;
1244 /*******************************************************************
1246 * @brief Fills CN Assoc for Drb to Add/Mod List
1250 * Function : fillCnAssoc
1252 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1254 * @params[in] struct DRB_ToAddMod__cnAssociation *
1256 * @return ROK - success
1259 * ****************************************************************/
1261 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1265 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1266 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1268 cnAssoc->choice.eps_BearerIdentity = 5;
1270 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1272 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1273 if(cnAssoc->choice.sdap_Config)
1275 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1276 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1277 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1278 cnAssoc->choice.sdap_Config->defaultDRB = true;
1279 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1280 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1281 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1282 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1283 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1285 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1289 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1290 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1296 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1303 /*******************************************************************
1305 * @brief Fills Radio Bearer Config for Drb
1309 * Function : fillDrbCfg
1311 * Functionality: Fills Radio Bearer Config for Drb
1313 * @params[in] drbId, DRB_ToAddModList *
1315 * @return ROK - success
1318 * ****************************************************************/
1319 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1321 uint8_t idx, ied, ret, elementCnt;
1327 drbCfg->list.count = elementCnt;
1328 drbCfg->list.size =\
1329 elementCnt * sizeof(DRB_ToAddMod_t *);
1330 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1331 if(drbCfg->list.array != NULLP)
1333 for(idx = 0; idx < elementCnt; idx++)
1335 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1336 if(drbCfg->list.array[idx] == NULLP)
1338 for(ied = 0; ied < idx; ied++)
1340 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1342 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1352 /* CN ASSOCIATION */
1353 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1354 if(drbCfg->list.array[idx]->cnAssociation)
1356 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1359 drbCfg->list.array[idx]->drb_Identity = drbId;
1364 /*******************************************************************
1366 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1370 * Function : fillRrcReconfigIE
1372 * Functionality: Fills RRC Reconfig Message required for
1373 * DLRRCMessageTransfer
1375 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1377 * @return ROK - success
1380 * ****************************************************************/
1382 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1385 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1386 if(rrcReconfigMsg->radioBearerConfig)
1388 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1389 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1391 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1396 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1397 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1399 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1402 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1403 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1404 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1410 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1411 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1417 /*******************************************************************
1419 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1423 * Function : fillDlDcchRrcMsg
1425 * Functionality: Fills DL DCCH Message required for
1426 * DLRRCMessageTransfer
1428 * @params[in] RRCContainer_t *rrcContainer
1430 * @return ROK - success
1433 * ****************************************************************/
1435 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1439 DL_DCCH_Message_t dl_DCCH_Msg;
1440 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1441 asn_enc_rval_t encRetVal;
1443 if(rrcContainer != NULLP)
1445 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1447 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1448 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1450 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1451 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1452 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1454 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1455 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1456 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1457 /* Fill RRC Reconfig IE */
1458 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1459 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1460 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1461 criticalExtensions.choice.rrcReconfiguration != NULLP)
1463 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1464 criticalExtensions.choice.rrcReconfiguration);
1468 /* encode DL-DCCH message into RRC Container */
1469 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1470 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1472 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1473 /* Encode results */
1474 if(encRetVal.encoded == ENCODE_FAIL)
1476 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1477 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1482 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1483 for(int i = 0; i< encBufSize; i++)
1485 DU_LOG("%x",encBuf[i]);
1487 rrcContainer->size = encBufSize;
1488 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1489 if(rrcContainer->buf != NULLP)
1491 memset(rrcContainer->buf, 0, encBufSize);
1492 for(idx2 = 0; idx2 < encBufSize; idx2++)
1494 rrcContainer->buf[idx2] = encBuf[idx2];
1501 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1506 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1512 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1518 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1524 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1530 /*******************************************************************
1532 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1536 * Function : BuildDLRRCContainer
1538 * Functionality: Builds RRC Container IE required for
1539 * DLRRCMessageTransfer
1543 * @return ROK - success
1546 * ****************************************************************/
1548 uint8_t BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1550 uint8_t ret, bufLen;
1553 if(rrcMsgType == RRC_SETUP)
1555 ret = fillDlCcchRrcMsg(ueId, rrcContainer);
1557 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1559 else if(rrcMsgType == REGISTRATION_ACCEPT)
1561 /*Hardcoded RRC Container from reference logs*/
1562 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1564 rrcContainer->size = bufLen;
1565 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1566 if(rrcContainer->buf != NULLP)
1568 memset(rrcContainer->buf, 0, bufLen);
1569 memcpy(rrcContainer->buf, buf, bufLen);
1572 else if(rrcMsgType == RRC_RECONFIG)
1574 /*Hardcoded RRC Container from reference logs*/
1576 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1577 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1578 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1579 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1580 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1581 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1582 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1583 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1584 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1585 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1586 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1587 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1588 0x00, 0x00, 0x00, 0x00};
1590 rrcContainer->size = bufLen;
1591 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1592 if(rrcContainer->buf != NULLP)
1594 memset(rrcContainer->buf, 0, bufLen);
1595 memcpy(rrcContainer->buf, buf, bufLen);
1602 /*******************************************************************
1604 * @brief Builds and sends the DLRRCMessageTransfer
1608 * Function : BuildAndSendDLRRCMessageTransfer
1610 * Functionality: Constructs the DL RRC Message Transfer and sends
1611 * it to the CU through SCTP.
1615 * @return ROK - success
1618 * ****************************************************************/
1619 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
1621 uint8_t elementCnt = 0;
1624 F1AP_PDU_t *f1apMsg = NULLP;
1625 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1626 asn_enc_rval_t encRetVal; /* Encoder return value */
1628 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1630 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1631 if(f1apMsg == NULLP)
1633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1637 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1638 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1639 sizeof(InitiatingMessage_t));
1640 if(f1apMsg->choice.initiatingMessage == NULLP)
1642 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1643 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1647 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1648 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1649 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1650 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1653 dlRRCMsg->protocolIEs.list.count = elementCnt;
1654 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1656 /* Initialize the F1Setup members */
1657 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1658 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1660 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1661 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1662 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1666 for(idx=0; idx<elementCnt; idx++)
1668 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1669 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1671 for(ieId=0; ieId<idx; ieId++)
1673 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1674 sizeof(DLRRCMessageTransferIEs_t));
1676 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1677 dlRRCMsg->protocolIEs.list.size);
1678 CU_FREE(f1apMsg->choice.initiatingMessage,\
1679 sizeof(InitiatingMessage_t));
1680 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1685 /* GNB CU UE F1AP ID */
1687 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1688 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1689 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1690 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1691 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
1693 /* GNB DU UE F1AP ID */
1695 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1696 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1697 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1698 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1699 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1700 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
1704 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1705 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1706 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1707 DLRRCMessageTransferIEs__value_PR_SRBID;
1708 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1712 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1713 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1714 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1715 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1716 BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1718 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1720 /* Encode the F1SetupRequest type as APER */
1721 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1723 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1725 /* Encode results */
1726 if(encRetVal.encoded == ENCODE_FAIL)
1728 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1729 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1734 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1735 for(int i=0; i< encBufSize; i++)
1737 DU_LOG("%x",encBuf[i]);
1742 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1744 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1749 }/* End of BuildAndSendDLRRCMessageTransfer */
1751 /*******************************************************************
1753 * @brief Function to set the Dl RRC Msg Type
1757 * Function : setDlRRCMsgType
1759 * Functionality: Constructs the UE Setup Response and sends
1760 * it to the DU through SCTP.
1764 * @return ROK - success
1767 * ****************************************************************/
1769 uint8_t setDlRRCMsgType(uint8_t ueId)
1771 uint8_t rrcMsgType = 0;
1772 switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
1775 rrcMsgType = RRC_SETUP;
1777 case REGISTRATION_ACCEPT:
1778 rrcMsgType = REGISTRATION_ACCEPT;
1780 case UE_CONTEXT_SETUP_REQ:
1781 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1783 case SECURITY_MODE_COMPLETE:
1784 rrcMsgType = SECURITY_MODE_COMPLETE;
1787 rrcMsgType = RRC_RECONFIG;
1789 case UE_CONTEXT_MOD_REQ:
1790 rrcMsgType = UE_CONTEXT_MOD_REQ;
1798 /*******************************************************************
1800 * @brief Function to build Initial UL RRC Message
1804 * Function : procInitULRRCMsg
1806 * Functionality: Function to build Initial UL RRC Message
1810 * @return ROK - success
1813 * ****************************************************************/
1815 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1817 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1819 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1820 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1822 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1824 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1826 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1828 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1829 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1831 case ProtocolIE_ID_id_NRCGI:
1833 case ProtocolIE_ID_id_C_RNTI:
1835 case ProtocolIE_ID_id_RRCContainer:
1837 case ProtocolIE_ID_id_DUtoCURRCContainer:
1839 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1840 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1841 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1843 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1844 ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
1845 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1846 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1847 CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
1848 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
1849 if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
1851 memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1852 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
1853 .duToCuContainer.size);
1858 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1864 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1870 ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
1871 rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
1872 ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
1877 /*******************************************************************
1879 * @brief Builds Nrcgi
1883 * Function : BuildNrcgi
1885 * Functionality: Building the PLMN ID and NR Cell id
1887 * @params[in] NRCGI_t *nrcgi
1888 * @return ROK - success
1891 * ****************************************************************/
1892 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1895 uint8_t unused_bits = 4;
1896 uint8_t byteSize = 5;
1898 /* Allocate Buffer Memory */
1899 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1900 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1901 if(nrcgi->pLMN_Identity.buf == NULLP)
1905 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1911 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1912 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1913 if(nrcgi->nRCellIdentity.buf == NULLP)
1917 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
1921 /*******************************************************************
1923 * @brief Builds Special cell list for UE Setup Request
1927 * Function : BuildSplCellList
1929 * Functionality: Constructs the Special Cell list for UESetReq
1931 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1933 * @return ROK - success
1936 * ****************************************************************/
1937 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1943 spCellLst->list.count = cellCnt;
1944 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1945 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1946 if(spCellLst->list.array == NULLP)
1950 for(idx=0; idx<cellCnt; idx++)
1952 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1953 if(spCellLst->list.array[idx] == NULLP)
1959 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1960 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1961 spCellLst->list.array[idx]->value.present =\
1962 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1963 /* Special Cell ID -NRCGI */
1964 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1969 /*Special Cell Index*/
1970 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1972 }/* End of BuildSplCellList*/
1974 /*******************************************************************
1976 * @brief Builds SRBS to be setup
1980 * Function : BuildSRBSetup
1982 * Functionality: Constructs the SRB's for UESetReq
1984 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1986 * @return ROK - success
1989 * ****************************************************************/
1990 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1995 srbSet->list.count = srbCnt;
1996 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1997 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1998 if(srbSet->list.array == NULLP)
2002 for(idx=0; idx<srbCnt; idx++)
2004 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2005 if(srbSet->list.array[idx] == NULLP)
2011 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2012 srbSet->list.array[idx]->criticality = Criticality_ignore;
2013 srbSet->list.array[idx]->value.present = \
2014 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2015 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2017 }/* End of BuildSRBSetup*/
2019 /*******************************************************************
2021 * @brief Builds QOS Info for DRB Setum Item
2025 * Function : BuildQOSInfo
2027 * Functionality: Constructs the QOS Info for DRB Setup Item
2029 * @params[in] QoSInformation_t *qosinfo
2030 * int16_t pduSessionID
2032 * @return ROK - success
2035 * ****************************************************************/
2036 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
2037 int16_t pduSessionID)
2039 uint8_t elementCnt = 0, qosCntIdx = 0;
2040 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2042 /* NonDynamic5QIDescriptor */
2043 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2044 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2045 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2050 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2051 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2053 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2056 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2057 sizeof(AveragingWindow_t));
2058 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2063 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2064 /*MaxDataBurstVolume*/
2065 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2066 sizeof(MaxDataBurstVolume_t));
2067 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2072 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2074 /*nRGRAN Allocation Retention Priority*/
2075 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2076 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2077 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2079 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2080 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2082 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2086 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2087 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2091 elementCnt = NUM_QOS_EXT;
2092 qosIeExt->list.count = elementCnt;
2093 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2095 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2096 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2098 if(qosIeExt->list.array == NULLP)
2100 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2104 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2106 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2107 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2109 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2112 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2113 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2114 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2115 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2116 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2117 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2118 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2123 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2128 }/*End of BuildQOSInfo*/
2130 /*******************************************************************
2132 * @brief Builds SNSSAI
2136 * Function : BuildSNSSAI
2138 * Functionality: Constructs the SNSSAI For DRB list
2140 * @params[in] SNSSAI_t *snssai
2141 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2143 * @return ROK - success
2146 * ****************************************************************/
2147 uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
2151 snssai->sST.size = sizeof(uint8_t);
2152 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2153 if(snssai->sST.buf == NULLP)
2157 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2159 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2160 if(snssai->sD == NULLP)
2164 snssai->sD->size = 3*sizeof(uint8_t);
2165 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2166 if(snssai->sD->buf == NULLP)
2170 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2172 }/*End of BuildSNSSAI*/
2174 /*******************************************************************
2176 * @brief Builds the flow map.
2180 * Function : BuildFlowsMap
2182 * Functionality: Constructs the flowmap For DRB list
2184 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2186 * @return ROK - success
2189 * ****************************************************************/
2190 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2192 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2195 flowMap->list.count = flowCnt;
2196 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2197 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2198 if(flowMap->list.array == NULLP)
2200 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2203 for(idx=0; idx<flowCnt; idx++)
2205 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2206 if(flowMap->list.array[idx] == NULLP)
2208 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2213 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2214 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2215 actionType, INVALID_PDU_SESSION_ID);
2218 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2222 }/*End of BuildFlowsMap*/
2224 /*******************************************************************
2226 * @brief Builds the Uplink Tunnel Info
2230 * Function : BuildULTnlInfo
2232 * Functionality: Constructs the UL TnlInfo For DRB list
2234 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2236 * @return ROK - success
2239 * ****************************************************************/
2240 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2245 ulInfo->list.count = ulCnt;
2246 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2247 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2248 if(ulInfo->list.array == NULLP)
2250 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2253 for(idx=0; idx<ulCnt; idx++)
2255 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2256 if(ulInfo->list.array[idx] == NULLP)
2258 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2263 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2264 UPTransportLayerInformation_PR_gTPTunnel;
2266 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2267 sizeof(GTPTunnel_t));
2268 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2270 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2273 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2274 transportLayerAddress.size = 4*sizeof(uint8_t);
2275 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2276 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2277 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2278 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2279 transportLayerAddress.buf == NULLP)
2281 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2284 /* NOTE: Below IP address must be changed if running on different IP configuration */
2285 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2286 transportLayerAddress.buf[0] = 192;
2287 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2288 transportLayerAddress.buf[1] = 168;
2289 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2290 transportLayerAddress.buf[2] = 130;
2291 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2292 transportLayerAddress.buf[3] = 82;
2293 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2294 transportLayerAddress.bits_unused = 0;
2296 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2297 = 4 * sizeof(uint8_t);
2298 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2299 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2300 gTPTunnel->gTP_TEID.size);
2301 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2304 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2307 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2308 gTP_TEID.buf[0] = 0;
2309 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2310 gTP_TEID.buf[1] = 0;
2311 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2312 gTP_TEID.buf[2] = 0;
2313 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2314 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2317 }/*End of BuildULTnlInfo*/
2319 /*******************************************************************
2321 * @brief Builds DRBS to be setup
2325 * Function : BuildDRBSetup
2327 * Functionality: Constructs the DRB's for UESetReq
2329 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2331 * @return ROK - success
2334 * ****************************************************************/
2335 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2337 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2338 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2339 DRBs_ToBeSetup_Item_t *drbSetItem;
2341 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2342 drbSet->list.count = drbCnt;
2343 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2344 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2345 if(drbSet->list.array == NULLP)
2347 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2350 for(idx=0; idx<drbCnt; idx++)
2352 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2353 if(drbSet->list.array[idx] == NULLP)
2355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2359 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2360 drbSet->list.array[idx]->criticality = Criticality_ignore;
2361 drbSet->list.array[idx]->value.present = \
2362 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2363 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2365 drbSetItem->dRBID = idx + 1;
2367 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2368 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2369 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2371 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2374 drbSetItem->qoSInformation.choice.choice_extension->id = \
2375 ProtocolIE_ID_id_DRB_Information;
2376 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2378 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2379 QoSInformation_ExtIEs__value_PR_DRB_Information;
2380 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2381 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2382 ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
2383 if(BuildQOSInforet != ROK)
2385 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2389 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2390 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[0]);
2391 if(BuildSNSSAIret != ROK)
2393 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2396 /*Flows mapped to DRB List*/
2397 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2398 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2399 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2400 if(BuildFlowsMapret != ROK)
2402 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2405 /*ULUPTNLInformation To Be Setup List*/
2406 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2407 if(BuildULTnlInforet != ROK)
2409 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2413 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2416 }/* End of BuildDRBSetup*/
2418 /*******************************************************************
2420 * @brief Deallocating memory of function BuildAndSendUESetReq
2424 * Function : FreeNrcgi
2426 * Functionality: Deallocating memory for function BuildNrcgi
2428 * @params[in] NRCGI_t *nrcgi
2432 *******************************************************************/
2433 void FreeNrcgi(NRCGI_t *nrcgi)
2435 if(nrcgi->pLMN_Identity.buf != NULLP)
2437 if(nrcgi->nRCellIdentity.buf != NULLP)
2439 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2441 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2444 /*******************************************************************
2446 * @brief Deallocating memory of function BuildAndSendUESetReq
2450 * Function : FreeSplCellList
2452 * Functionality: Deallocating memory for function BuildSplCellList
2454 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2459 * *****************************************************************/
2460 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2463 if(spCellLst->list.array != NULLP)
2465 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2467 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2469 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2471 if(spCellLst->list.array[cellidx]!=NULLP)
2473 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2476 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2479 /*******************************************************************
2481 * @brief Deallocating memory of function BuildAndSendUESetReq
2485 * Function : FreeSRBSetup
2487 * Functionality: Deallocating memory for function BuildSRBSetup
2489 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2494 * ******************************************************************/
2495 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2498 if(srbSet->list.array != NULLP)
2500 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2502 if(srbSet->list.array[srbidx]!=NULLP)
2504 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2507 CU_FREE(srbSet->list.array,srbSet->list.size);
2510 /*******************************************************************
2512 * @brief Deallocating memory of function BuildAndSendUESetReq
2516 * Function : FreeQOSInfo
2518 * Functionality: Deallocating memory for function BuildQOSInfo
2520 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2524 * ****************************************************************/
2525 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2527 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2528 uint8_t qosCntIdx = 0;
2530 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2532 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2534 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2536 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2537 sizeof(MaxDataBurstVolume_t));
2539 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2540 sizeof(AveragingWindow_t));
2542 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2543 sizeof(NonDynamic5QIDescriptor_t));
2545 if(drbQos->iE_Extensions)
2547 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2548 if(qosIeExt->list.array != NULLP)
2550 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2552 if(qosIeExt->list.array[qosCntIdx])
2554 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2557 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2560 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2563 /*******************************************************************
2565 * @brief Deallocating memory of function BuildAndSendUESetReq
2569 * Function : FreeULTnlInfo
2571 * Functionality: Deallocating memory for function BuildULTnlInfo
2573 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2578 * ****************************************************************/
2579 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2582 if(ulInfo->list.array != NULLP)
2584 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2586 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2588 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2590 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2591 transportLayerAddress.buf != NULLP)
2593 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2596 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2597 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2598 gTPTunnel->gTP_TEID.size);
2600 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2601 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2602 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2604 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2605 sizeof(GTPTunnel_t));
2608 if(ulInfo->list.array[ulidx]!=NULLP)
2610 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2613 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2616 /*******************************************************************
2618 * @brief Deallocating memory for BuildAndSendUESetReq
2622 * Function : FreeDRBSetup
2624 * Functionality: Deallocating memory for BuildDRBSetup
2626 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2630 * ****************************************************************/
2631 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2633 DRBs_ToBeSetup_Item_t *drbSetItem;
2634 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2636 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
2638 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
2639 if(drbSet->list.array != NULLP)
2641 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2643 if(drbSet->list.array[drbidx] != NULLP)
2645 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2646 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2648 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2649 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2651 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2652 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2654 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2655 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2657 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2659 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2661 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2663 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2664 flows_Mapped_To_DRB_List.list.array != NULLP)
2666 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2667 flows_Mapped_To_DRB_List.list.count; flowidx++)
2669 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2670 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2672 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2673 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2674 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2676 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2677 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2678 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2680 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2681 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2682 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2684 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2685 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2687 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2688 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2689 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2690 sizeof(MaxDataBurstVolume_t));
2692 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2693 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2694 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2696 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2697 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2698 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2701 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2702 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2704 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2705 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2708 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2709 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2710 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2712 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2713 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2715 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2716 sizeof(OCTET_STRING_t));
2718 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2719 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2721 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2722 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2724 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2725 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2727 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2728 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2730 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2731 iE_Extensions != NULLP)
2733 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
2734 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
2735 if(qosIeExt->list.array != NULLP)
2737 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2739 if(qosIeExt->list.array[qosCntIdx] != NULLP)
2741 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2744 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2746 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2747 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2750 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2752 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2755 CU_FREE(drbSet->list.array,drbSet->list.size);
2760 /*******************************************************************
2762 * @brief Free the UE Setup Request
2766 * Function : FreeUeContextSetupReq
2768 * Functionality: Deallocate the memory of BuildUESetReq
2770 * @params[in] F1AP_PDU_t *f1apMsg
2775 * ****************************************************************/
2776 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2779 UEContextSetupRequest_t *ueSetReq = NULLP;
2781 if(f1apMsg != NULLP)
2783 if(f1apMsg->choice.initiatingMessage != NULLP)
2785 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2786 if(ueSetReq->protocolIEs.list.array != NULLP)
2788 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2790 if(ueSetReq->protocolIEs.list.array[idx])
2792 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2794 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2796 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2798 case ProtocolIE_ID_id_SpCell_ID:
2799 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2801 case ProtocolIE_ID_id_ServCellIndex:
2803 case ProtocolIE_ID_id_SpCellULConfigured:
2805 case ProtocolIE_ID_id_CUtoDURRCInformation:
2806 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2808 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2809 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2811 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2812 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2814 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2815 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2817 case ProtocolIE_ID_id_RRCContainer:
2818 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2820 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2821 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2825 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2829 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
2831 for(ieId=0; ieId<idx; ieId++)
2833 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2835 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2838 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2840 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2842 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2846 /**Filling cell group info **/
2847 /*******************************************************************
2849 * @brief Build Control resource set to add/modify list
2853 * Function : BuildControlRSetToAddModList
2855 * Functionality: Build Control resource set to add/modify list
2858 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2860 * @return ROK - success
2863 * ****************************************************************/
2864 uint8_t BuildControlRSetToAddModList
2866 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2871 uint8_t numBytes, bitsUnused;
2872 struct ControlResourceSet *controlRSet;
2873 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2874 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2877 controlRSetList->list.count = elementCnt;
2878 controlRSetList->list.size = \
2879 elementCnt * sizeof(struct ControlResourceSet *);
2881 controlRSetList->list.array = NULLP;
2882 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2883 if(!controlRSetList->list.array)
2885 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2889 for(idx = 0; idx < elementCnt; idx++)
2891 controlRSetList->list.array[idx] = NULLP;
2892 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2893 if(!controlRSetList->list.array[idx])
2895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2901 controlRSet = controlRSetList->list.array[idx];
2902 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2904 /* Values harcoded according to our design:
2907 * Bit string stored ff0000000000
2911 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2912 controlRSet->frequencyDomainResources.buf = NULLP;
2913 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2914 controlRSet->frequencyDomainResources.size);
2915 if(!controlRSet->frequencyDomainResources.buf)
2917 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2921 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2922 coreset0EndPrb = CORESET0_END_PRB;
2923 coreset1StartPrb = coreset0EndPrb + 6;
2924 coreset1NumPrb = CORESET1_NUM_PRB;
2925 /* calculate the PRBs */
2926 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2927 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2928 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2930 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2931 controlRSet->cce_REG_MappingType.present = \
2932 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2934 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2935 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2936 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2937 controlRSet->tci_PresentInDCI = NULLP;
2939 uint8_t tciStateIdx;
2941 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2942 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2943 if(!controlRset->tci_StatesPDCCH_ToAddList)
2945 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2950 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2951 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2952 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2953 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2954 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2956 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2960 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2962 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2963 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2965 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2972 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2974 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2975 if(!controlRset->tci_PresentInDCI)
2977 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2981 *(controlRset->tci_PresentInDCI);
2984 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2985 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2986 if(!controlRSet->pdcch_DMRS_ScramblingID)
2988 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2991 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2994 } /* End BuildControlRSetToAddModList */
2996 /*******************************************************************
2998 * @brief Build search space to add/modify list
3002 * Function : BuildSearchSpcToAddModList
3004 * Functionality: Build search space to add/modify list
3007 * @return ROK - success
3010 * ****************************************************************/
3011 uint8_t BuildSearchSpcToAddModList
3013 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3021 struct SearchSpace *searchSpc;
3024 searchSpcList->list.count = elementCnt;
3025 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3027 searchSpcList->list.array = NULLP;
3028 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3029 if(!searchSpcList->list.array)
3031 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3035 for(idx = 0; idx < elementCnt; idx++)
3037 searchSpcList->list.array[idx] = NULLP;
3038 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3039 if(!searchSpcList->list.array[idx])
3041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3047 searchSpc = searchSpcList->list.array[idx];
3049 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3051 searchSpc->controlResourceSetId = NULLP;
3052 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3053 if(!searchSpc->controlResourceSetId)
3055 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3058 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3060 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3061 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3062 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3063 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3065 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3068 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3069 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3071 searchSpc->duration = NULLP;
3072 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3073 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3074 if(!searchSpc->monitoringSymbolsWithinSlot)
3076 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3080 /* Values taken from reference logs :
3083 * Bit string stores 8000
3088 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3089 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3090 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3091 searchSpc->monitoringSymbolsWithinSlot->size);
3092 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3094 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3099 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3100 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3101 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3102 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3104 searchSpc->nrofCandidates = NULLP;
3105 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3106 if(!searchSpc->nrofCandidates)
3108 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3112 searchSpc->nrofCandidates->aggregationLevel1 = \
3113 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3114 searchSpc->nrofCandidates->aggregationLevel2 = \
3115 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3116 searchSpc->nrofCandidates->aggregationLevel4 = \
3117 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3118 searchSpc->nrofCandidates->aggregationLevel8 = \
3119 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3120 searchSpc->nrofCandidates->aggregationLevel16 = \
3121 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3123 searchSpc->searchSpaceType = NULLP;
3124 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3125 if(!searchSpc->searchSpaceType)
3127 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3131 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3133 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3134 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3135 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3136 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3138 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3141 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3142 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3145 }/* End BuildSearchSpcToAddModList */
3147 /*******************************************************************
3149 * @brief Builds BWP DL dedicated PDCCH config
3153 * Function : BuildBWPDlDedPdcchCfg
3155 * Functionality: Builds BWP DL dedicated PDCCH config
3157 * @params[in] struct PDCCH_Config *pdcchCfg
3159 * @return ROK - success
3162 * ****************************************************************/
3163 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3165 pdcchCfg->controlResourceSetToAddModList = NULLP;
3166 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3167 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3168 if(!pdcchCfg->controlResourceSetToAddModList)
3170 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3174 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3179 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3181 pdcchCfg->searchSpacesToAddModList = NULLP;
3182 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3183 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3184 if(!pdcchCfg->searchSpacesToAddModList)
3186 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3190 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3195 pdcchCfg->searchSpacesToReleaseList = NULLP;
3196 pdcchCfg->downlinkPreemption = NULLP;
3197 pdcchCfg->tpc_PUSCH = NULLP;
3198 pdcchCfg->tpc_PUCCH = NULLP;
3199 pdcchCfg->tpc_SRS = NULLP;
3204 /*******************************************************************
3206 * @brief Builds DMRS DL PDSCH Mapping type A
3210 * Function : BuildDMRSDLPdschMapTypeA
3212 * Functionality: Builds DMRS DL PDSCH Mapping type A
3215 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3216 * @return ROK - success
3219 * ****************************************************************/
3220 uint8_t BuildDMRSDLPdschMapTypeA
3222 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3225 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3226 dmrsDlCfg->choice.setup = NULLP;
3227 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3228 if(!dmrsDlCfg->choice.setup)
3230 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3234 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3235 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3236 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3237 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3239 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3242 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3244 dmrsDlCfg->choice.setup->maxLength = NULLP;
3245 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3246 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3247 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3252 /*******************************************************************
3254 * @brief Builds TCI states to add/modify list
3258 * Function : BuildTCIStatesToAddModList
3260 * Functionality:Builds TCI states to add/modify list
3263 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3265 * @return ROK - success
3268 * ****************************************************************/
3269 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3274 /*******************************************************************
3276 * @brief Builds PDSCH time domain allocation list
3280 * Function : BuildPdschTimeDomAllocList
3282 * Functionality: Builds PDSCH time domain allocation list
3285 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3287 * @return ROK - success
3290 * ****************************************************************/
3291 uint8_t BuildPdschTimeDomAllocList
3293 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3298 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3300 timeDomAllocList->present = \
3301 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3303 timeDomAllocList->choice.setup = NULLP;
3304 CU_ALLOC(timeDomAllocList->choice.setup, \
3305 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3306 if(!timeDomAllocList->choice.setup)
3308 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3313 timeDomAllocList->choice.setup->list.count = elementCnt;
3314 timeDomAllocList->choice.setup->list.size = \
3315 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3317 timeDomAllocList->choice.setup->list.array = NULLP;
3318 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3319 timeDomAllocList->choice.setup->list.size);
3320 if(!timeDomAllocList->choice.setup->list.array)
3322 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3326 for(idx = 0; idx < elementCnt; idx++)
3328 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3329 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3330 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3331 if(!timeDomAllocList->choice.setup->list.array[idx])
3333 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3339 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3340 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3341 if(!timeDomAlloc->k0)
3343 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3346 *(timeDomAlloc->k0) = 0;
3347 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3348 timeDomAlloc->startSymbolAndLength = 66;
3351 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3352 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3353 if(!timeDomAlloc->k0)
3355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3358 *(timeDomAlloc->k0) = 1;
3359 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3360 timeDomAlloc->startSymbolAndLength = 66;
3365 /*******************************************************************
3367 * @brief Builds PDSCH PRB Bundling type
3371 * Function : BuildPdschPrbBundlingType
3373 * Functionality: Builds PDSCH PRB Bundling type
3376 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3378 * @return ROK - success
3381 * ****************************************************************/
3382 uint8_t BuildPdschPrbBundlingType
3384 struct PDSCH_Config__prb_BundlingType *prbBndlType
3387 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3389 prbBndlType->choice.staticBundling = NULLP;
3390 CU_ALLOC(prbBndlType->choice.staticBundling, \
3391 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3392 if(!prbBndlType->choice.staticBundling)
3394 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3397 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3402 /*******************************************************************
3404 * @brief Builds BWP DL dedicated PDSCH config
3408 * Function : BuildBWPDlDedPdschCfg
3410 * Functionality: Builds BWP DL dedicated PDSCH config
3412 * @params[in] struct PDSCH_Config *pdschCfg
3414 * @return ROK - success
3417 * ****************************************************************/
3418 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3420 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3422 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3423 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3424 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3425 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3427 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3431 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3436 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3437 pdschCfg->tci_StatesToAddModList = NULLP;
3438 pdschCfg->tci_StatesToReleaseList = NULLP;
3439 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3441 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3442 if(!pdschCfg->tci_StatesToAddModList)
3444 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3447 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3453 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3455 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3456 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3457 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3458 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3460 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3463 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3467 pdschCfg->pdsch_AggregationFactor = NULLP;
3468 pdschCfg->rateMatchPatternToAddModList = NULLP;
3469 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3470 pdschCfg->rateMatchPatternGroup1 = NULLP;
3471 pdschCfg->rateMatchPatternGroup2 = NULLP;
3472 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3473 pdschCfg->mcs_Table = NULLP;
3475 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3476 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3477 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3479 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3482 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3484 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3489 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3490 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3491 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3492 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3493 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3494 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3495 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3500 /*******************************************************************
3502 * @brief Builds intitial DL BWP
3505 * Function : BuildInitialDlBWP
3507 * Functionality: Builds intitial DL BWP in spCellCfgDed
3509 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3511 * @return ROK - success
3514 * ****************************************************************/
3515 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3517 dlBwp->pdcch_Config = NULLP;
3518 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3519 if(!dlBwp->pdcch_Config)
3521 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3524 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3526 dlBwp->pdcch_Config->choice.setup = NULLP;
3527 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3528 if(!dlBwp->pdcch_Config->choice.setup)
3530 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3533 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3538 dlBwp->pdsch_Config = NULLP;
3539 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3540 if(!dlBwp->pdsch_Config)
3542 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3545 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3547 dlBwp->pdsch_Config->choice.setup = NULLP;
3548 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3549 if(!dlBwp->pdsch_Config->choice.setup)
3551 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3555 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3560 dlBwp->sps_Config = NULLP;
3561 dlBwp->radioLinkMonitoringConfig = NULLP;
3565 /*******************************************************************
3567 * @brief Builds DMRS UL Pusch Mapping type A
3571 * Function : BuildDMRSULPuschMapTypeA
3573 * Functionality: Builds DMRS UL Pusch Mapping type A
3576 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3577 * @return ROK - success
3580 * ****************************************************************/
3581 uint8_t BuildDMRSULPuschMapTypeA
3583 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3586 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3587 dmrsUlCfg->choice.setup= NULLP;
3588 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3589 if(!dmrsUlCfg->choice.setup)
3591 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3595 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3596 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3597 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3598 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3603 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3605 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3606 dmrsUlCfg->choice.setup->maxLength = NULLP;
3607 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3608 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3609 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3610 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3612 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3616 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3617 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3619 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3621 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3624 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3626 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3627 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3631 /*******************************************************************
3633 * @brief Build PUSCH time domain allocation list
3637 * Function : BuildPuschTimeDomAllocList
3639 * Functionality: Build PUSCH time domain allocation list
3642 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3644 * @return ROK - success
3647 * ****************************************************************/
3648 uint8_t BuildPuschTimeDomAllocList
3650 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3655 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3657 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3658 timeDomAllocList->choice.setup = NULLP;
3659 CU_ALLOC(timeDomAllocList->choice.setup, \
3660 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3661 if(!timeDomAllocList->choice.setup)
3663 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3668 timeDomAllocList->choice.setup->list.count = elementCnt;
3669 timeDomAllocList->choice.setup->list.size = \
3670 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3671 timeDomAllocList->choice.setup->list.array = NULLP;
3672 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3673 timeDomAllocList->choice.setup->list.size);
3674 if(!timeDomAllocList->choice.setup->list.array)
3676 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3680 for(idx = 0; idx < elementCnt; idx++)
3682 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3683 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3684 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3685 if(!timeDomAllocList->choice.setup->list.array[idx])
3687 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3693 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3694 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3695 if(!timeDomAlloc->k2)
3697 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3700 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3701 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3702 timeDomAlloc->startSymbolAndLength = 66;
3705 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3706 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3707 if(!timeDomAlloc->k2)
3709 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3712 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3713 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3714 timeDomAlloc->startSymbolAndLength = 66;
3719 /*******************************************************************
3721 * @brief Builds BWP UL dedicated PUSCH Config
3725 * Function : BuildBWPUlDedPuschCfg
3728 * Builds BWP UL dedicated PUSCH Config
3730 * @params[in] : PUSCH_Config_t *puschCfg
3732 * @return ROK - success
3735 * ****************************************************************/
3736 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3738 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3739 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3740 if(!puschCfg->dataScramblingIdentityPUSCH)
3742 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3745 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3747 puschCfg->txConfig = NULLP;
3748 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3749 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3750 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3751 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3753 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3757 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3762 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3763 puschCfg->pusch_PowerControl = NULLP;
3764 puschCfg->frequencyHopping = NULLP;
3765 puschCfg->frequencyHoppingOffsetLists = NULLP;
3766 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3768 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3769 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3770 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3771 if(!puschCfg->pusch_TimeDomainAllocationList)
3773 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3777 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3782 puschCfg->pusch_AggregationFactor = NULLP;
3783 puschCfg->mcs_Table = NULLP;
3784 puschCfg->mcs_TableTransformPrecoder = NULLP;
3785 puschCfg->transformPrecoder = NULLP;
3786 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3787 if(!puschCfg->transformPrecoder)
3789 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3792 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3794 puschCfg->codebookSubset = NULLP;
3795 puschCfg->maxRank = NULLP;
3796 puschCfg->rbg_Size = NULLP;
3797 puschCfg->uci_OnPUSCH = NULLP;
3798 puschCfg->tp_pi2BPSK = NULLP;
3803 /*******************************************************************
3805 * @brief Builds BWP UL dedicated PUCCH Config
3809 * Function : BuildBWPUlDedPucchCfg
3812 * Builds BWP UL dedicated PUCCH Config
3814 * @params[in] : PUCCH_Config_t *pucchCfg
3816 * @return ROK - success
3819 * ****************************************************************/
3820 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3822 uint8_t arrIdx, elementCnt;
3823 uint8_t rsrcIdx, rsrcSetIdx;
3824 PUCCH_ResourceSet_t *rsrcSet = NULLP;
3825 PUCCH_Resource_t *rsrc = NULLP;
3829 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
3830 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
3831 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
3832 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
3833 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
3835 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
3838 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
3839 rsrcSet->pucch_ResourceSetId = 1;
3841 rsrcSet->resourceList.list.count = elementCnt;
3842 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
3843 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
3844 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
3846 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
3849 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
3853 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
3854 pucchCfg->resourceToAddModList->list.count = elementCnt;
3855 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
3856 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
3857 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
3859 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
3862 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
3863 rsrc->pucch_ResourceId = 1;
3864 rsrc->startingPRB = 0;
3865 rsrc->format.present = PUCCH_Resource__format_PR_format1;
3866 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
3867 rsrc->format.choice.format1->initialCyclicShift = 0;
3868 rsrc->format.choice.format1->nrofSymbols = 4;
3869 rsrc->format.choice.format1->startingSymbolIndex = 0;
3870 rsrc->format.choice.format1->timeDomainOCC = 0;
3873 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
3874 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
3875 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
3876 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
3877 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
3880 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3881 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3883 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3888 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3889 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3890 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3891 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3893 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3897 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3899 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3900 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3902 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3908 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
3909 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
3914 /*******************************************************************
3916 * @brief Fills SRS resource to add/modify list
3920 * Function : BuildSrsRsrcAddModList
3922 * Functionality: Fills SRS resource to add/modify list
3925 * @return ROK - success
3928 * ****************************************************************/
3929 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3935 resourceList->list.count = elementCnt;
3936 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3937 resourceList->list.array = NULLP;
3938 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3939 if(!resourceList->list.array)
3941 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3945 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3947 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3948 if(!resourceList->list.array[rsrcIdx])
3950 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3956 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3957 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3958 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3960 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3961 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3962 sizeof(struct SRS_Resource__transmissionComb__n2));
3963 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3965 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3968 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3969 = SRS_COMB_OFFSET_N2;
3970 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3971 = SRS_CYCLIC_SHIFT_N2;
3973 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3975 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3976 SRS_Resource__resourceMapping__nrofSymbols_n1;
3977 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3978 SRS_Resource__resourceMapping__repetitionFactor_n1;
3980 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3981 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3982 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3983 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3984 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3985 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3986 SRS_Resource__groupOrSequenceHopping_neither;
3988 /* Setting resource type to aperiodic for intergration purposes */
3989 resourceList->list.array[rsrcIdx]->resourceType.present = \
3990 SRS_Resource__resourceType_PR_aperiodic;
3991 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3992 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3993 sizeof(struct SRS_Resource__resourceType__aperiodic));
3994 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3996 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3999 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4004 /*******************************************************************
4006 * @brief Build SRS resource set Add/mod list
4010 * Function : BuildSrsRsrcSetAddModList
4012 * Functionality: Build SRS resource set Add/mod list
4015 * @return ROK - success
4018 * ****************************************************************/
4019 uint8_t BuildSrsRsrcSetAddModList
4021 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4027 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4030 rsrcSetList->list.count = elementCnt;
4031 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4032 rsrcSetList->list.array = NULLP;
4033 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4034 if(!rsrcSetList->list.array)
4036 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4040 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4042 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4043 if(!rsrcSetList->list.array[rSetIdx])
4045 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4051 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4053 /* Fill Resource Id list in resource set */
4054 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4055 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4056 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4057 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4059 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4064 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4065 rsrcIdList->list.count = elementCnt;
4066 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4067 rsrcIdList->list.array = NULLP;
4068 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4069 if(!rsrcIdList->list.array)
4071 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4075 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4077 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4078 if(!rsrcIdList->list.array[rsrcIdx])
4080 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4086 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4088 /* Fill resource type */
4089 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4090 SRS_ResourceSet__resourceType_PR_aperiodic;
4092 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4093 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4094 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4095 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4097 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4100 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4101 = APERIODIC_SRS_RESRC_TRIGGER;
4103 /* TODO : Fill values for below IEs as expected by Viavi */
4104 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4105 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4108 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4109 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4110 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4111 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4112 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4117 /*******************************************************************
4119 * @brief Builds BWP UL dedicated SRS Config
4123 * Function : BuildBWPUlDedSrsCfg
4125 * Functionality: Builds BWP UL dedicated SRS Config
4127 * @params[in] SRS Config
4128 * @return ROK - success
4131 * ****************************************************************/
4132 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4134 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4135 srsCfg->srs_ResourceSetToAddModList = NULLP;
4136 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4137 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4138 if(!srsCfg->srs_ResourceSetToAddModList)
4140 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4143 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4148 srsCfg->srs_ResourceToReleaseList = NULLP;
4150 /* Resource to Add/Modify list */
4151 srsCfg->srs_ResourceToAddModList = NULLP;
4152 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4153 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4154 if(!srsCfg->srs_ResourceToAddModList)
4156 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4160 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4165 srsCfg->tpc_Accumulation = NULLP;
4170 /*******************************************************************
4172 * @brief Builds inital UL BWP
4176 * Function : BuildInitialUlBWP
4178 * Functionality: Builds initial UL BWP
4180 * @params[in] BWP_UplinkDedicated_t *ulBwp
4181 * @return ROK - success
4184 * ****************************************************************/
4185 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4187 ulBwp->pucch_Config = NULLP;
4188 ulBwp->pucch_Config = NULLP;
4189 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4190 if(!ulBwp->pucch_Config)
4192 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4196 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4197 ulBwp->pucch_Config->choice.setup = NULLP;
4198 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4199 if(!ulBwp->pucch_Config->choice.setup)
4201 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4205 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4210 /* Fill BWP UL dedicated PUSCH config */
4211 ulBwp->pusch_Config = NULLP;
4212 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4213 if(!ulBwp->pusch_Config)
4215 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4219 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4220 ulBwp->pusch_Config->choice.setup = NULLP;
4221 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4222 if(!ulBwp->pusch_Config->choice.setup)
4224 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4228 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4233 ulBwp->configuredGrantConfig = NULLP;
4235 /* Fill BPW UL dedicated SRS config */
4236 ulBwp->srs_Config = NULLP;
4237 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4238 if(!ulBwp->srs_Config)
4240 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4244 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4245 ulBwp->srs_Config->choice.setup = NULLP;
4246 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4247 if(!ulBwp->srs_Config->choice.setup)
4249 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4253 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4258 ulBwp->beamFailureRecoveryConfig = NULLP;
4263 /*******************************************************************
4265 * @brief Builds Pusch Serving cell Config
4269 * Function : BuildPuschSrvCellCfg
4271 * Functionality: Builds Pusch Serving cell Config
4273 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4275 * @return ROK - success
4278 * ****************************************************************/
4279 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4281 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4282 puschCfg->choice.setup = NULLP;
4283 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4284 if(!puschCfg->choice.setup)
4286 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4290 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4291 puschCfg->choice.setup->rateMatching = NULLP;
4292 puschCfg->choice.setup->xOverhead = NULLP;
4293 puschCfg->choice.setup->ext1 = NULLP;
4294 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4295 if(!puschCfg->choice.setup->ext1)
4297 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4301 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4302 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4303 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4305 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4308 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4310 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4311 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4312 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4317 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4321 /*******************************************************************
4323 * @brief Builds UL config
4326 * Function : BuildUlCfg
4328 * Functionality: Builds UL config in spCellCfgDed
4330 * @params[in] UplinkConfig_t *ulCfg
4332 * @return ROK - success
4335 * ****************************************************************/
4336 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4338 ulCfg->initialUplinkBWP = NULLP;
4339 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4340 if(!ulCfg->initialUplinkBWP)
4342 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4346 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4351 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4352 ulCfg->uplinkBWP_ToAddModList = NULLP;
4353 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4354 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4355 if(!ulCfg->firstActiveUplinkBWP_Id)
4357 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4360 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4362 ulCfg->pusch_ServingCellConfig = NULLP;
4363 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4364 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4365 if(!ulCfg->pusch_ServingCellConfig)
4367 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4371 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4376 ulCfg->carrierSwitching = NULLP;
4377 ulCfg->ext1 = NULLP;
4381 /*******************************************************************
4383 * @brief Builds PDSCH serving cell config
4386 * Function : BuildPdschSrvCellCfg
4388 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4390 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4392 * @return ROK - success
4395 * ****************************************************************/
4396 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4398 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4399 pdschCfg->choice.setup = NULLP;
4400 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4401 if(!pdschCfg->choice.setup)
4403 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4407 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4408 pdschCfg->choice.setup->xOverhead = NULLP;
4409 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4410 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4411 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4413 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4416 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4417 pdschCfg->choice.setup->pucch_Cell = NULLP;
4418 pdschCfg->choice.setup->ext1 = NULLP;
4423 /*******************************************************************
4425 * @brief Builds CSI Meas config
4428 * Function : BuildCsiMeasCfg
4430 * Functionality: Builds CSI Meas config in spCellCfgDed
4432 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4434 * @return ROK - success
4437 * ****************************************************************/
4438 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4444 /*******************************************************************
4446 * @brief Builds Spcell config dedicated
4449 * Function : BuildSpCellCfgDed
4451 * Functionality: Builds sp cell config dedicated in spCellCfg
4453 * @params[in] ServingCellConfig_t srvCellCfg
4455 * @return ROK - success
4458 * ****************************************************************/
4459 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4461 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4463 srvCellCfg->initialDownlinkBWP = NULLP;
4464 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4465 if(!srvCellCfg->initialDownlinkBWP)
4467 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4471 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4473 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4476 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4477 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4479 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4480 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4481 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4483 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4486 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4488 srvCellCfg->bwp_InactivityTimer = NULLP;
4490 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4491 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4492 if(!srvCellCfg->defaultDownlinkBWP_Id)
4494 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4497 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4499 srvCellCfg->uplinkConfig = NULLP;
4500 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4501 if(!srvCellCfg->uplinkConfig)
4503 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4507 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4509 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4512 srvCellCfg->supplementaryUplink = NULLP;
4513 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4515 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4516 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4517 if(!srvCellCfg->pdsch_ServingCellConfig)
4519 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4523 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4525 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4529 srvCellCfg->csi_MeasConfig = NULLP;
4531 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4532 if(!srvCellCfg->csi_MeasConfig)
4534 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4538 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4540 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4544 srvCellCfg->sCellDeactivationTimer = NULLP;
4545 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4546 srvCellCfg->tag_Id = TAG_ID;
4547 srvCellCfg->dummy = NULLP;
4548 srvCellCfg->pathlossReferenceLinking = NULLP;
4549 srvCellCfg->servingCellMO = NULLP;
4550 srvCellCfg->ext1 = NULLP;
4554 /*******************************************************************
4556 * @brief Builds Spcell config
4560 * Function : BuildSpCellCfg
4562 * Functionality: Builds sp cell config in DuToCuRrcContainer
4564 * @params[in] SpCellConfig_t spCellCfg
4566 * @return ROK - success
4569 * ****************************************************************/
4570 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4573 spCellCfg->servCellIndex = NULLP;
4574 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4575 if(!spCellCfg->servCellIndex)
4577 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4580 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4582 spCellCfg->reconfigurationWithSync = NULLP;
4583 spCellCfg->rlf_TimersAndConstants = NULLP;
4584 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4585 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4586 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4588 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4591 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4593 spCellCfg->spCellConfigDedicated = NULLP;
4594 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4595 if(!spCellCfg->spCellConfigDedicated)
4597 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4600 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4602 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4607 /*******************************************************************
4609 * @brief Builds Phy cell group config
4613 * Function : BuildPhyCellGrpCfg
4615 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4617 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4619 * @return ROK - success
4622 * ****************************************************************/
4623 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4625 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4626 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4628 phyCellGrpCfg->p_NR_FR1 = NULLP;
4629 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4630 if(!phyCellGrpCfg->p_NR_FR1)
4632 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4635 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4636 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4637 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4638 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4639 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4640 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4641 phyCellGrpCfg->cs_RNTI = NULLP;
4642 phyCellGrpCfg->ext1 = NULLP;
4643 phyCellGrpCfg->ext2 = NULLP;
4648 /*******************************************************************
4650 * @brief Builds tag config
4654 * Function : BuildTagConfig
4656 * Functionality: Builds tag config in MacCellGroupConfig
4658 * @params[in] TAG_Config *tag_Config
4660 * @return ROK - success
4663 * ****************************************************************/
4664 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4666 struct TAG_Config__tag_ToAddModList *tagList;
4667 uint8_t idx, elementCnt;
4669 tagConfig->tag_ToReleaseList = NULLP;
4670 tagConfig->tag_ToAddModList = NULLP;
4671 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4672 if(!tagConfig->tag_ToAddModList)
4674 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4678 elementCnt = 1; //ODU_VALUE_ONE;
4679 tagList = tagConfig->tag_ToAddModList;
4680 tagList->list.count = elementCnt;
4681 tagList->list.size = elementCnt * sizeof(struct TAG *);
4683 tagList->list.array = NULLP;
4684 CU_ALLOC(tagList->list.array, tagList->list.size);
4685 if(!tagList->list.array)
4687 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4691 for(idx=0; idx<tagList->list.count; idx++)
4693 tagList->list.array[idx] = NULLP;
4694 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4695 if(!tagList->list.array[idx])
4697 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4703 tagList->list.array[idx]->tag_Id = TAG_ID;
4704 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4709 /*******************************************************************
4711 * @brief Builds PHR Config
4715 * Function : BuildPhrConfig
4717 * Functionality: Builds phrConfig in MacCellGroupConfig
4719 * @params[in] PHR Config *
4721 * @return ROK - success
4724 * ****************************************************************/
4725 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4728 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4729 phrConfig->choice.setup = NULLP;
4730 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4731 if(!phrConfig->choice.setup)
4733 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4737 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4738 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4739 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4740 phrConfig->choice.setup->multiplePHR = false;
4741 phrConfig->choice.setup->dummy = false;
4742 phrConfig->choice.setup->phr_Type2OtherCell = false;
4743 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4748 /*******************************************************************
4750 * @brief Builds BSR Config
4754 * Function : BuildBsrConfig
4756 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4758 * @params[in] BSR_Config *bsrConfig
4760 * @return ROK - success
4763 * ****************************************************************/
4764 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4766 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4767 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4768 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4773 /*******************************************************************
4775 * @brief Builds scheduling request config
4779 * Function : BuildSchedulingReqConfig
4781 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4783 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4785 * @return ROK - success
4788 * ****************************************************************/
4789 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4791 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4792 uint8_t idx, elementCnt;
4794 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4795 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4796 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4797 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4799 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4803 elementCnt = 1; //ODU_VALUE_ONE;
4804 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4805 schReqList->list.count = elementCnt;
4806 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4808 schReqList->list.array = NULLP;
4809 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4810 if(!schReqList->list.array)
4812 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4816 for(idx=0;idx<schReqList->list.count; idx++)
4818 schReqList->list.array[idx] = NULLP;
4819 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4820 if(!schReqList->list.array[idx])
4822 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4828 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4830 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4831 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4832 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4834 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4837 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4838 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4839 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4843 /*******************************************************************
4845 * @brief Builds Mac cell group config
4849 * Function : BuildMacCellGrpCfg
4851 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4853 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4855 * @return ROK - success
4858 * ****************************************************************/
4859 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4861 macCellGrpCfg->drx_Config = NULLP;
4862 macCellGrpCfg->schedulingRequestConfig = NULLP;
4863 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4864 if(!macCellGrpCfg->schedulingRequestConfig)
4866 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4870 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4872 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4876 macCellGrpCfg->bsr_Config = NULLP;
4877 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4878 if(!macCellGrpCfg->bsr_Config)
4880 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4884 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4886 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4890 macCellGrpCfg->tag_Config = NULLP;
4891 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4892 if(!macCellGrpCfg->tag_Config)
4894 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4898 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4900 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4904 macCellGrpCfg->phr_Config = NULLP;
4905 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4906 if(!macCellGrpCfg->phr_Config)
4908 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4912 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4914 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4918 macCellGrpCfg->skipUplinkTxDynamic = false;
4919 macCellGrpCfg->ext1 = NULLP;
4923 /*******************************************************************
4925 * @brief Frees memeory allocated for SearchSpcToAddModList
4929 * Function : FreeSearchSpcToAddModList
4931 * Functionality: Deallocating memory of SearchSpcToAddModList
4933 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4937 4221 * ****************************************************************/
4938 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4942 struct SearchSpace *searchSpc=NULLP;
4944 if(searchSpcList->list.array)
4946 if(searchSpcList->list.array[idx2])
4948 searchSpc = searchSpcList->list.array[idx2];
4949 if(searchSpc->controlResourceSetId)
4951 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4953 if(searchSpc->monitoringSymbolsWithinSlot)
4955 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4957 if(searchSpc->nrofCandidates)
4959 if(searchSpc->searchSpaceType)
4961 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4962 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4963 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4964 SearchSpace__searchSpaceType));
4966 CU_FREE(searchSpc->nrofCandidates,
4967 sizeof(struct SearchSpace__nrofCandidates));
4969 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4970 searchSpc->monitoringSymbolsWithinSlot->size);
4972 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4973 sizeof(BIT_STRING_t));
4975 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4976 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4978 CU_FREE(searchSpc->controlResourceSetId,
4979 sizeof(ControlResourceSetId_t));
4982 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4984 CU_FREE(searchSpcList->list.array[idx1],
4985 sizeof(struct SearchSpace));
4987 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4990 /*******************************************************************
4992 * @brief Frees memory allocated for PdschTimeDomAllocList
4996 * Function : FreePdschTimeDomAllocList
4998 * Functionality: Deallocating memory of PdschTimeDomAllocList
5000 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5004 4221 * ****************************************************************/
5005 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5009 if(timeDomAllocList->choice.setup)
5011 if(timeDomAllocList->choice.setup->list.array)
5013 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5015 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5016 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5018 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5019 timeDomAllocList->choice.setup->list.size);
5021 CU_FREE(timeDomAllocList->choice.setup,\
5022 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5025 /*******************************************************************
5027 * @brief Frees memory allocated for PuschTimeDomAllocList
5031 * Function : FreePuschTimeDomAllocList
5033 * Functionality: Deallocating memory of PuschTimeDomAllocList
5035 * @params[in] PUSCH_Config_t *puschCfg
5039 ***********************************************************************/
5040 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5044 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5046 if(puschCfg->pusch_TimeDomainAllocationList)
5048 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5049 if(timeDomAllocList_t->choice.setup)
5051 if(timeDomAllocList_t->choice.setup->list.array)
5053 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5054 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5056 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5057 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5059 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5060 timeDomAllocList_t->choice.setup->list.size);
5062 CU_FREE(timeDomAllocList_t->choice.setup, \
5063 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5065 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5066 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5067 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5072 /*******************************************************************
5074 * @brief Frees memory allocated for Dedicated PUCCH config
5078 * Function : FreeBWPUlDedPucchCfg
5080 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5082 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5086 * ****************************************************************/
5087 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5089 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5090 PUCCH_Config_t *pucchCfg = NULLP;
5091 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5092 PUCCH_Resource_t *rsrc = NULLP;
5096 if(ulBwpPucchCfg->choice.setup)
5098 pucchCfg = ulBwpPucchCfg->choice.setup;
5100 //Free resource set list
5101 if(pucchCfg->resourceSetToAddModList)
5103 if(pucchCfg->resourceSetToAddModList->list.array)
5105 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5107 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5108 if(rsrcSet->resourceList.list.array)
5110 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5112 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5114 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5116 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5118 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5120 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5123 //Free resource list
5124 if(pucchCfg->resourceToAddModList)
5126 if(pucchCfg->resourceToAddModList->list.array)
5128 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5130 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5131 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5132 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5134 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5136 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5140 if(pucchCfg->format1)
5142 if(pucchCfg->format1->choice.setup)
5144 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5145 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5147 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5151 if(pucchCfg->dl_DataToUL_ACK)
5153 if(pucchCfg->dl_DataToUL_ACK->list.array)
5155 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5157 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5159 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5161 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5164 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5166 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5170 /*******************************************************************
5172 * @brief Frees memory allocated for InitialUlBWP
5176 * Function : FreeInitialUlBWP
5178 * Functionality: Deallocating memory of InitialUlBWP
5180 * @params[in] BWP_UplinkDedicated_t *ulBwp
5184 * ****************************************************************/
5185 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5187 uint8_t rSetIdx, rsrcIdx;
5188 SRS_Config_t *srsCfg = NULLP;
5189 PUSCH_Config_t *puschCfg = NULLP;
5190 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5191 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5192 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5193 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5195 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5197 if(ulBwp->pusch_Config)
5199 if(ulBwp->pusch_Config->choice.setup)
5201 puschCfg=ulBwp->pusch_Config->choice.setup;
5202 if(puschCfg->dataScramblingIdentityPUSCH)
5204 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5206 FreePuschTimeDomAllocList(puschCfg);
5207 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5208 if(dmrsUlCfg->choice.setup)
5210 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5212 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5214 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5216 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5217 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5219 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5222 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5224 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5225 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5227 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5229 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5231 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5233 /* Free SRS-Config */
5234 if(ulBwp->srs_Config)
5236 if(ulBwp->srs_Config->choice.setup)
5238 srsCfg = ulBwp->srs_Config->choice.setup;
5240 /* Free Resource Set to add/mod list */
5241 if(srsCfg->srs_ResourceSetToAddModList)
5243 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5244 if(rsrcSetList->list.array)
5248 /* Free SRS resource Id list in this SRS resource set */
5249 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5251 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5253 if(rsrcIdList->list.array)
5255 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5257 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5259 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5261 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5262 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5265 /* Free resource type info for this SRS resource set */
5266 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5267 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5269 /* Free memory for each resource set */
5270 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5272 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5274 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5276 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5277 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5280 /* Free resource to add/modd list */
5281 if(srsCfg->srs_ResourceToAddModList)
5283 resourceList = srsCfg->srs_ResourceToAddModList;
5284 if(resourceList->list.array)
5287 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5288 sizeof(struct SRS_Resource__transmissionComb__n2));
5289 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5290 sizeof(struct SRS_Resource__resourceType__aperiodic));
5292 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5294 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5296 CU_FREE(resourceList->list.array, resourceList->list.size);
5298 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5299 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5302 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5304 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5308 /*******************************************************************
5310 * @brief Frees memory allocated for initialUplinkBWP
5314 * Function : FreeinitialUplinkBWP
5316 * Functionality: Deallocating memory of initialUplinkBWP
5318 * @params[in] UplinkConfig_t *ulCfg
5323 * ****************************************************************/
5324 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5326 BWP_UplinkDedicated_t *ulBwp=NULLP;
5327 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5329 if(ulCfg->initialUplinkBWP)
5331 ulBwp=ulCfg->initialUplinkBWP;
5332 if(ulCfg->firstActiveUplinkBWP_Id)
5334 if(ulCfg->pusch_ServingCellConfig)
5336 puschCfg=ulCfg->pusch_ServingCellConfig;
5337 if(puschCfg->choice.setup)
5339 if(puschCfg->choice.setup->ext1)
5341 CU_FREE(puschCfg->choice.setup->ext1->\
5342 processingType2Enabled,sizeof(BOOLEAN_t));
5343 CU_FREE(puschCfg->choice.setup->ext1->\
5344 maxMIMO_Layers,sizeof(long));
5345 CU_FREE(puschCfg->choice.setup->ext1, \
5346 sizeof(struct PUSCH_ServingCellConfig__ext1));
5348 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5350 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5352 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5354 FreeInitialUlBWP(ulBwp);
5355 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5358 /*******************************************************************
5360 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5364 * Function : FreeBWPDlDedPdschCfg
5366 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5368 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5373 * ****************************************************************/
5374 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5376 struct PDSCH_Config *pdschCfg=NULLP;
5377 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5378 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5379 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5381 if(dlBwp->pdsch_Config->choice.setup)
5383 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5384 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5386 if(pdschCfg->pdsch_TimeDomainAllocationList)
5388 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5389 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5391 prbBndlType=&pdschCfg->prb_BundlingType;
5392 CU_FREE(prbBndlType->choice.staticBundling,\
5393 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5394 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5396 FreePdschTimeDomAllocList(timeDomAllocList);
5397 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5398 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5400 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5401 if(dmrsDlCfg->choice.setup)
5403 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5405 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5407 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5408 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5410 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5413 /*******************************************************************
5415 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5419 * Function : FreeBWPDlDedPdcchCfg
5421 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5423 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5428 * ****************************************************************/
5429 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5433 struct PDCCH_Config *pdcchCfg=NULLP;
5434 struct ControlResourceSet *controlRSet=NULLP;
5435 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5437 if(dlBwp->pdcch_Config->choice.setup)
5439 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5440 if(pdcchCfg->controlResourceSetToAddModList)
5442 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5443 if(controlRSetList->list.array)
5445 controlRSet = controlRSetList->list.array[idx2];
5448 if(controlRSet->frequencyDomainResources.buf)
5450 if(controlRSet->pdcch_DMRS_ScramblingID)
5452 if(pdcchCfg->searchSpacesToAddModList)
5454 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5455 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5456 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5458 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5460 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5461 controlRSet->frequencyDomainResources.size);
5464 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5466 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5468 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5470 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5471 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5473 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5476 /*******************************************************************
5478 * @brief Builds RLC Config
5482 * Function : BuildRlcConfig
5484 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5486 * @params[in] RLC_Config *rlcConfig
5488 * @return ROK - success
5491 * ****************************************************************/
5492 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5495 rlcConfig->present = RLC_Config_PR_am;
5497 rlcConfig->choice.am = NULLP;
5498 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5499 if(!rlcConfig->choice.am)
5501 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5506 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5507 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5508 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5510 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5513 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5514 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5515 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5516 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5517 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5520 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5521 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5522 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5524 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5527 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5528 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5529 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5534 /*******************************************************************
5536 * @brief Builds MAC LC Config
5540 * Function : BuildMacLCConfig
5542 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5544 * @params[in] struct LogicalChannelConfig macLcConfig
5546 * @return ROK - success
5549 * ****************************************************************/
5550 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5553 macLcConfig->ul_SpecificParameters = NULLP;
5554 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5555 if(!macLcConfig->ul_SpecificParameters)
5557 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5561 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5562 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5563 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5564 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5565 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5566 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5567 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5569 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5570 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5571 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5573 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5576 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5578 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5579 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5580 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5582 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5585 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5587 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5588 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5589 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5593 /*******************************************************************
5595 * @brief Builds RLC Bearer to Add/Mod list
5599 * Function :BuildRlcBearerToAddModList
5601 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5603 * @params[in] rlc_BearerToAddModList
5605 * @return ROK - success
5608 * ****************************************************************/
5609 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5611 uint8_t idx, elementCnt;
5614 rlcBearerList->list.count = elementCnt;
5615 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5617 rlcBearerList->list.array = NULLP;
5618 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5619 if(!rlcBearerList->list.array)
5621 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5625 for(idx=0; idx<rlcBearerList->list.count; idx++)
5627 rlcBearerList->list.array[idx] = NULLP;
5628 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5629 if(!rlcBearerList->list.array[idx])
5631 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5637 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5639 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5640 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5642 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5646 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5647 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5649 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5650 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5651 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5652 if(!rlcBearerList->list.array[idx]->rlc_Config)
5654 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5658 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5660 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5664 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5665 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5666 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5668 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5672 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5674 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5681 /*******************************************************************
5683 * @brief Free memory allocated for CellGroupConfig
5687 * Function : FreeMemCellGrpCfg
5689 * Functionality: Deallocating memory of CellGroupConfig
5691 * @params[in] pointer to CellGroupConfigRrc_t
5693 * @return ROK - success
5696 ******************************************************************/
5697 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5700 SpCellConfig_t *spCellCfg=NULLP;
5701 ServingCellConfig_t *srvCellCfg=NULLP;
5702 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5703 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5704 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5705 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5706 struct RLC_Config *rlcConfig=NULLP;
5707 struct LogicalChannelConfig *macLcConfig=NULLP;
5708 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5709 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5710 struct TAG_Config *tagConfig=NULLP;
5711 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5712 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5713 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5715 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5718 if(rlcBearerList->list.array)
5720 for(idx=0; idx<rlcBearerList->list.count; idx++)
5722 if(rlcBearerList->list.array[idx])
5724 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5725 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5728 if(rlcConfig->choice.am)
5730 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5731 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5732 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5734 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5736 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5739 if(macLcConfig->ul_SpecificParameters)
5741 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5742 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5743 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5745 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5747 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5750 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5752 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5755 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5758 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5759 if(schedulingRequestConfig)
5761 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5764 if(schReqList->list.array)
5766 for(idx=0;idx<schReqList->list.count; idx++)
5768 if(schReqList->list.array[idx])
5770 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5771 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5774 CU_FREE(schReqList->list.array, schReqList->list.size);
5776 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5777 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5778 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5780 if(macCellGrpCfg->bsr_Config)
5782 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5784 tagConfig = macCellGrpCfg->tag_Config;
5787 tagList = tagConfig->tag_ToAddModList;
5790 if(tagList->list.array)
5792 for(idx=0; idx<tagList->list.count; idx++)
5794 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5796 CU_FREE(tagList->list.array, tagList->list.size);
5798 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5800 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5803 phrConfig = macCellGrpCfg->phr_Config;
5806 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5807 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5810 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5813 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5816 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5817 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5820 spCellCfg = cellGrpCfg->spCellConfig;
5823 if(spCellCfg->servCellIndex)
5825 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5827 if(spCellCfg->spCellConfigDedicated)
5829 srvCellCfg = spCellCfg->spCellConfigDedicated;
5830 if(srvCellCfg->initialDownlinkBWP)
5832 dlBwp = srvCellCfg->initialDownlinkBWP;
5833 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5835 if(srvCellCfg->defaultDownlinkBWP_Id)
5837 if(srvCellCfg->uplinkConfig)
5839 if(srvCellCfg->pdsch_ServingCellConfig)
5841 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5842 if(pdschCfg->choice.setup)
5844 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5845 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5847 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5848 ServingCellConfig__pdsch_ServingCellConfig));
5850 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5851 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5853 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5855 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5857 if(dlBwp->pdcch_Config)
5859 if(dlBwp->pdsch_Config)
5861 FreeBWPDlDedPdschCfg(dlBwp);
5862 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5864 FreeBWPDlDedPdcchCfg(dlBwp);
5865 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5867 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5869 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5871 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5873 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5875 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5880 /*******************************************************************
5882 * @brief Fills CellGroupConfig
5886 * Function : fillCellGrpCfg
5888 * Functionality: Fills CellGroupConfig
5890 * @params[in] pointer to CellGroupConfigRrc_t
5892 * @return ROK - success
5895 ******************************************************************/
5897 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5899 uint8_t ret = RFAILED;
5900 CellGroupConfigRrc_t cellGrpCfg;
5901 asn_enc_rval_t encRetVal;
5905 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5907 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5908 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5909 if(!cellGrpCfg.rlc_BearerToAddModList)
5911 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5914 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5916 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5920 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5921 cellGrpCfg.mac_CellGroupConfig = NULLP;
5922 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5923 if(!cellGrpCfg.mac_CellGroupConfig)
5925 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5928 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5930 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5935 cellGrpCfg.physicalCellGroupConfig = NULLP;
5936 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5937 if(!cellGrpCfg.physicalCellGroupConfig)
5939 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5942 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5944 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5948 cellGrpCfg.spCellConfig = NULLP;
5949 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5950 if(!cellGrpCfg.spCellConfig)
5952 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5955 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5957 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5961 cellGrpCfg.sCellToAddModList = NULLP;
5962 cellGrpCfg.sCellToReleaseList = NULLP;
5963 cellGrpCfg.ext1 = NULLP;
5965 /* encode cellGrpCfg into duToCuRrcContainer */
5966 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5967 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5969 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5970 /* Encode results */
5971 if(encRetVal.encoded == ENCODE_FAIL)
5973 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5974 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5979 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5980 for(int i=0; i< encBufSize; i++)
5982 DU_LOG("%x",encBuf[i]);
5986 cellGrp->size = encBufSize;
5987 CU_ALLOC(cellGrp->buf, cellGrp->size);
5990 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5993 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5997 FreeMemCellGrpCfg(&cellGrpCfg);
6001 /*******************************************************************
6003 * @brief Free UE Capability RAT container
6007 * Function : freeUeCapRatCont
6010 * Free UE Capability RAT conatiner
6013 * @return ROK - success
6016 * ****************************************************************/
6017 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6020 FeatureSets_t *featureSets;
6022 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6024 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6026 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6027 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6029 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6032 if(ueNrCap->featureSets)
6034 featureSets = ueNrCap->featureSets;
6035 if(featureSets->featureSetsDownlinkPerCC)
6037 if(featureSets->featureSetsDownlinkPerCC->list.array)
6039 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6041 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6042 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6043 sizeof(ModulationOrder_t));
6044 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6046 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6048 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6051 if(featureSets->featureSetsUplinkPerCC)
6053 if(featureSets->featureSetsUplinkPerCC->list.array)
6055 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6057 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6059 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6060 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6061 sizeof(ModulationOrder_t));
6062 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6065 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6067 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6069 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6073 /*******************************************************************
6075 * @brief Free UE capability RAT container list
6079 * Function : freeUeCapRatContList
6081 * Functionality: Free UE capability RAT container list
6084 * @return ROK - success
6087 * ****************************************************************/
6088 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6091 if(ueCapablityList->list.array)
6093 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6095 if(ueCapablityList->list.array[idx])
6096 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6098 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6102 /*******************************************************************
6104 * @brief Fill feature sets
6108 * Function : fillFeatureSets
6110 * Functionality: Fill feature sets
6113 * @return ROK - success
6116 * ****************************************************************/
6117 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6119 uint8_t idx, elementCnt;
6121 featureSets->featureSetsDownlink = NULLP;
6122 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6123 if(!featureSets->featureSetsDownlinkPerCC)
6125 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6130 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6131 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6132 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6133 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6135 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6139 for(idx = 0; idx < elementCnt; idx++)
6141 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6142 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6150 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6151 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6152 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6153 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6154 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6156 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6157 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6159 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6162 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6164 featureSets->featureSetsUplink = NULLP;
6165 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6166 if(!featureSets->featureSetsUplinkPerCC)
6168 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6173 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6174 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6175 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6176 if(!featureSets->featureSetsUplinkPerCC->list.array)
6178 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6182 for(idx = 0; idx < elementCnt; idx++)
6184 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6185 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6187 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6193 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6194 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6195 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6196 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6197 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6198 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6200 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6201 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6203 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6206 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6211 /*******************************************************************
6213 * @brief Fill UE capability RAT container
6217 * Function : fillUeCapRatCont
6219 * Functionality: Fill UE capability RAT container
6221 * @params[in] UE Capability RAT container buffer
6222 * @return ROK - success
6225 * ****************************************************************/
6226 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6229 uint8_t idx, elementCnt;
6230 asn_enc_rval_t encRetVal;
6231 UE_NR_Capability_t ueNrCap;
6235 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6237 /* Filling PDCP parameters */
6238 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6239 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6240 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6241 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6242 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6243 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6244 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6245 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6246 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6247 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6248 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6249 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6250 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6251 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6252 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6253 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6254 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6256 ueNrCap.rlc_Parameters = NULLP;
6257 ueNrCap.mac_Parameters = NULLP;
6259 /* Filling PHY parameters */
6260 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6261 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6262 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6263 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6264 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6266 /* Filling RF parameters */
6268 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6269 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6270 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6271 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6273 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6278 for(idx = 0; idx < elementCnt; idx++)
6280 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6281 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6291 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6292 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6293 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6295 ueNrCap.measAndMobParameters = NULLP;
6296 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6297 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6298 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6299 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6300 ueNrCap.featureSets = NULLP;
6302 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6303 if(!ueNrCap.featureSets)
6305 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6310 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6312 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6317 ueNrCap.featureSetCombinations = NULLP;
6318 ueNrCap.lateNonCriticalExtension = NULLP;
6319 ueNrCap.nonCriticalExtension = NULLP;
6321 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6322 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6323 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6325 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6327 /* Encode results */
6328 if(encRetVal.encoded == ENCODE_FAIL)
6330 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6331 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6336 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6337 for(int i=0; i< encBufSize; i++)
6339 DU_LOG("%x",encBuf[i]);
6343 ueCapRatContBuf->size = encBufSize;
6344 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6345 if(!ueCapRatContBuf->buf)
6347 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6350 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6354 freeUeCapRatCont(&ueNrCap);
6358 /*******************************************************************
6360 * @brief Fill UE Capability RAT container list
6364 * Function : fillUeCapRatContList
6366 * Functionality: Fill UE Capability RAT container list
6369 * @params[in] UE capability RAT container list buffer
6370 * @return ROK - success
6373 * ****************************************************************/
6374 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6376 uint8_t ret = RFAILED;
6377 uint8_t idx, elementCnt;
6378 asn_enc_rval_t encRetVal;
6379 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6384 ueCapablityList.list.count = elementCnt;
6385 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6387 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6388 if(!ueCapablityList.list.array)
6390 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6395 for(idx=0; idx<elementCnt; idx++)
6397 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6398 if(ueCapablityList.list.array[idx] == NULLP)
6400 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6406 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6407 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6409 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6410 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6411 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6413 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6414 &ueCapablityList, PrepFinalEncBuf, encBuf);
6416 /* Encode results */
6417 if(encRetVal.encoded == ENCODE_FAIL)
6419 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6420 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6425 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6426 for(int i=0; i< encBufSize; i++)
6428 DU_LOG("%x",encBuf[i]);
6432 ueCapablityListBuf->size = encBufSize;
6433 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6434 if(!ueCapablityListBuf->buf)
6436 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6439 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6443 freeUeCapRatContList(&ueCapablityList);
6447 /*******************************************************************
6449 * @brief Fills CuToDuContainer
6453 * Function : fillCuToDuContainer
6455 * Functionality: Fills CuToDuContainer
6457 * @params[in] pointer to CUtoDURRCInformation_t
6459 * @return ROK - success
6462 ******************************************************************/
6464 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6466 uint8_t elementCnt = 0;
6468 uint8_t idx, idx2, rrcBufLen;
6470 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6471 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6473 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6476 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6478 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6479 if(rrcMsg->iE_Extensions)
6482 rrcMsg->iE_Extensions->list.count = elementCnt;
6483 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6485 /* Initialize the CUtoDURRCInformation_ExtIEs */
6486 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6488 if(rrcMsg->iE_Extensions->list.array == NULLP)
6490 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6494 for(idx=0; idx<elementCnt; idx++)
6496 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6497 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6503 /* Filling CellGroupConfig_t IE */
6504 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6505 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6506 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6507 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6508 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6513 /*******************************************************************
6515 * @brief Free CuToDuContainer
6519 * Function : FreeCuToDuInfo
6521 * Functionality: Free CuToDuContainer
6523 * @params[in] pointer to CUtoDURRCInformation_t
6525 * @return ROK - success
6528 ******************************************************************/
6530 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6534 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6536 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6537 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6538 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6540 if(rrcMsg->iE_Extensions)
6542 if(rrcMsg->iE_Extensions->list.array)
6544 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6546 if(rrcMsg->iE_Extensions->list.array[idx])
6548 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6550 case ProtocolIE_ID_id_CellGroupConfig:
6551 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6553 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6554 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6559 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6560 rrcMsg->iE_Extensions->list.array[idx]->id);
6566 for(idx2 = 0; idx2 < idx; idx2++)
6568 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6570 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6574 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6577 /*******************************************************************
6579 * @brief Builds and sends the UE Setup Request
6583 * Function : BuildAndSendUeContextSetupReq
6585 * Functionality: Constructs the UE Setup Request and sends
6586 * it to the CU through SCTP.
6590 * @return ROK - success
6593 * ****************************************************************/
6594 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6595 uint16_t rrcContLen, uint8_t *rrcContainer)
6598 uint8_t SplCellListret;
6599 uint8_t SrbSetupret;
6601 uint8_t idx, bufLen;
6603 F1AP_PDU_t *f1apMsg = NULLP;
6604 UEContextSetupRequest_t *ueSetReq = NULLP;
6605 asn_enc_rval_t encRetVal; /* Encoder return value */
6606 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6607 uint8_t ret= RFAILED;
6611 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6613 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6614 if(f1apMsg == NULLP)
6616 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6620 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6621 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6622 if(f1apMsg->choice.initiatingMessage == NULLP)
6624 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6628 f1apMsg->choice.initiatingMessage->procedureCode = \
6629 ProcedureCode_id_UEContextSetup;
6630 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6631 f1apMsg->choice.initiatingMessage->value.present = \
6632 InitiatingMessage__value_PR_UEContextSetupRequest;
6634 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6637 ueSetReq->protocolIEs.list.count = elementCnt;
6638 ueSetReq->protocolIEs.list.size = \
6639 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6641 /* Initialize the UESetup members */
6642 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6644 if(ueSetReq->protocolIEs.list.array == NULLP)
6646 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6650 for(idx1=0; idx1<elementCnt; idx1++)
6652 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6653 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6661 /*GNB CU UE F1AP ID*/
6662 ueSetReq->protocolIEs.list.array[idx]->id = \
6663 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6664 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6665 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6666 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6667 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6669 /*GNB DU UE F1AP ID*/
6671 ueSetReq->protocolIEs.list.array[idx]->id = \
6672 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6673 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6674 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6675 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6676 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6680 ueSetReq->protocolIEs.list.array[idx]->id = \
6681 ProtocolIE_ID_id_SpCell_ID;
6682 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6683 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6684 UEContextSetupRequestIEs__value_PR_NRCGI;
6685 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6691 /*Served Cell Index*/
6693 ueSetReq->protocolIEs.list.array[idx]->id = \
6694 ProtocolIE_ID_id_ServCellIndex;
6695 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6696 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6697 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6698 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6701 /*CellULConfigured*/
6703 ueSetReq->protocolIEs.list.array[idx]->id = \
6704 ProtocolIE_ID_id_SpCellULConfigured;
6705 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6706 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6707 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6708 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6709 CellULConfigured_none;
6711 /*CUtoDURRCContainer*/
6713 ueSetReq->protocolIEs.list.array[idx]->id = \
6714 ProtocolIE_ID_id_CUtoDURRCInformation;
6715 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6716 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6717 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6718 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6723 /*Special Cells to be SetupList*/
6725 ueSetReq->protocolIEs.list.array[idx]->id = \
6726 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6727 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6728 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6729 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6730 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6731 if(SplCellListret != ROK)
6735 /*SRBs To Be Setup List*/
6737 ueSetReq->protocolIEs.list.array[idx]->id = \
6738 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6739 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6740 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6741 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6742 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6743 if(SrbSetupret != ROK)
6747 /*DRBs to Be Setup List*/
6749 ueSetReq->protocolIEs.list.array[idx]->id = \
6750 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6751 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6752 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6753 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6754 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6759 /* RRC Container for security mode */
6761 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6762 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6763 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6764 UEContextSetupRequestIEs__value_PR_RRCContainer;
6765 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6767 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6768 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6769 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6770 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6772 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6775 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6776 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6778 /* RRC delivery status request */
6780 ueSetReq->protocolIEs.list.array[idx]->id = \
6781 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6782 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6783 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6784 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6785 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6786 RRCDeliveryStatusRequest_true;
6788 /* Bit Rate hardcoded as in reference logs */
6790 ueSetReq->protocolIEs.list.array[idx]->id = \
6791 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6792 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6793 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6794 UEContextSetupRequestIEs__value_PR_BitRate;
6795 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6797 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6798 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6799 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6800 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6802 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6805 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6806 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6808 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6810 /* Encode the F1SetupRequest type as APER */
6811 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6813 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6815 /* Encode results */
6816 if(encRetVal.encoded == ENCODE_FAIL)
6818 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6819 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6824 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6825 for(int i=0; i< encBufSize; i++)
6827 DU_LOG("%x",encBuf[i]);
6832 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6834 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6840 FreeUeContextSetupReq(f1apMsg);
6843 }/* End of BuildAndSendUeContextSetupReq*/
6845 /**********************************************************************
6846 * @brief Function to extractTeId received in UE context setup Response
6850 * Function : extractTeId
6853 * - Function to extract TeId
6856 * @return ROK - success
6859 **********************************************************************/
6860 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6864 GTPTunnel_t *gtpDl = NULLP;
6866 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6868 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6870 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6872 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6873 if(gtpDl->gTP_TEID.size > 0)
6875 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6878 DU_LOG("\nERROR --> EGTP: No TeId received");
6886 /****************************************************************
6887 * @brief Function to add Drb tunnels
6891 * Function : addDrbTunnels
6894 * - Function to add Drb tunnels
6897 * @return ROK - success
6900 * ****************************************************************/
6901 uint8_t addDrbTunnels(uint8_t teId)
6906 if(teId > MAX_TEID || teId < MIN_TEID)
6908 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6910 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6911 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6912 tnlEvt.lclTeid = teId;
6913 tnlEvt.remTeid = teId;
6914 ret = cuEgtpTnlMgmtReq(tnlEvt);
6917 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6922 /****************************************************************
6923 * @brief Function to process Drb Setup List
6927 * Function : procDrbSetupList
6930 * - Function to process DRB Setup List
6933 * @return ROK - success
6936 * ****************************************************************/
6937 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
6941 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
6943 if(drbSetupList != NULLP)
6945 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
6947 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
6948 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
6950 /* extracting teId */
6951 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
6954 if(addDrbTunnels(teId)== ROK)
6956 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
6967 /****************************************************************
6968 * @brief Function to process Ue Context Setup Response
6972 * Function : procUeContextSetupResponse
6975 * - Function to process Ue Context Setup Response
6978 * @return ROK - success
6981 * ****************************************************************/
6982 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6984 uint8_t idx, duUeF1apId;
6985 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
6986 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
6988 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
6990 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
6992 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6994 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6997 case ProtocolIE_ID_id_DRBs_Setup_List:
6999 /* Adding Tunnels for successful DRB */
7000 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
7006 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7010 /****************************************************************
7011 * @brief Function to process Ul Rrc Msg received from DU
7015 * Function : procUlRrcMsg
7018 * - Function to process Ul Rrc Msg received from DU
7021 * @return ROK - success
7024 * ****************************************************************/
7026 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
7028 uint8_t idx, ret, srbId, rrcMsgType;
7029 uint8_t cuUeF1apId, duUeF1apId;
7030 uint8_t *rrcContainer = NULLP;
7031 uint16_t rrcContLen;
7032 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
7035 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
7037 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
7039 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
7041 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7043 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
7046 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7048 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7051 case ProtocolIE_ID_id_SRBID:
7052 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
7054 case ProtocolIE_ID_id_RRCContainer:
7056 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
7057 CU_ALLOC(rrcContainer, rrcContLen)
7060 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
7063 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
7069 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
7075 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7076 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7077 if(rrcMsgType == REGISTRATION_ACCEPT)
7079 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
7080 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7082 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
7084 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
7085 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
7086 rrcContLen, rrcContainer);
7088 if(rrcMsgType == SECURITY_MODE_COMPLETE)
7090 /* To trigger the DL RRC Msg for RRC Reconfig */
7091 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7092 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7093 if(rrcMsgType == RRC_RECONFIG)
7095 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
7096 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7099 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
7101 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
7102 BuildAndSendUeContextModificationReq(duUeF1apId);
7108 /****************************************************************
7109 * @brief Build And Send F1ResetAck
7113 * Function : FreeF1ResetAck
7116 * - Build And Send F1ResetRSP
7119 * @return ROK - success
7122 * ****************************************************************/
7123 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7126 ResetAcknowledge_t *f1ResetAck;
7130 if(f1apMsg->choice.successfulOutcome)
7132 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7134 if(f1ResetAck->protocolIEs.list.array)
7136 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7138 if(f1ResetAck->protocolIEs.list.array[idx])
7140 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7143 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7145 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7147 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7151 /****************************************************************
7152 * @brief Build And Send F1ResetAck
7156 * Function : BuildAndSendF1ResetAck
7159 * - Build And Send F1ResetRSP
7162 * @return ROK - success
7165 * ****************************************************************/
7167 uint8_t BuildAndSendF1ResetAck()
7170 uint8_t elementCnt = 0;
7171 uint8_t ret = RFAILED;
7172 F1AP_PDU_t *f1apMsg = NULL;
7173 ResetAcknowledge_t *f1ResetAck = NULLP;
7174 asn_enc_rval_t encRetVal;
7175 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
7178 /* Allocate the memory for F1ResetRequest_t */
7179 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7180 if(f1apMsg == NULLP)
7182 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7186 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7188 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7189 if(f1apMsg->choice.successfulOutcome == NULLP)
7191 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7195 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
7196 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7197 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7198 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7202 f1ResetAck->protocolIEs.list.count = elementCnt;
7203 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7205 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7206 if(f1ResetAck->protocolIEs.list.array == NULLP)
7208 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
7212 for(idx=0; idx<elementCnt; idx++)
7214 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7215 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7222 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7223 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7224 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7225 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7227 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7229 /* Encode the F1SetupRequest type as UPER */
7230 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7232 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7234 /* Check encode results */
7235 if(encRetVal.encoded == ENCODE_FAIL)
7237 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
7238 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7243 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
7244 for(int i=0; i< encBufSize; i++)
7246 DU_LOG("%x",encBuf[i]);
7250 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7252 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7260 FreeF1ResetAck(f1apMsg);
7263 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7267 if(ulInfo->list.array)
7269 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7271 if(ulInfo->list.array[arrIdx])
7273 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7275 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7277 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7279 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7280 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7281 gTPTunnel->gTP_TEID.size);
7283 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7284 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7285 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7287 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7288 sizeof(GTPTunnel_t));
7290 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7293 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7297 /*******************************************************************
7299 * @brief Deletes the EGTP tunnel
7303 * Function : deleteEgtpTunnel
7305 * Functionality: Deletes the EGTP tunnel
7307 * @params[in] uint8_t *buf
7309 * @return ROK - success
7312 * ****************************************************************/
7313 uint8_t deleteEgtpTunnel(uint8_t *buf)
7318 teIdStringToInt(buf, &teId);
7319 if(teId > MAX_TEID || teId < MIN_TEID)
7321 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7324 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7325 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7326 tnlEvt.lclTeid = teId;
7327 tnlEvt.remTeid = teId;
7328 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7330 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7335 /*******************************************************************
7337 * @brief Builds the Uplink Tunnel Info
7341 * Function : BuildUlTnlInfoforSetupMod
7343 * Functionality: Constructs the UL TnlInfo For DRB list
7345 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7347 * @return ROK - success
7350 * ****************************************************************/
7351 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7357 ulInfo->list.count = ulCnt;
7358 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7359 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7360 if(ulInfo->list.array == NULLP)
7362 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7365 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7367 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7368 if(ulInfo->list.array[arrIdx] == NULLP)
7370 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7376 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7377 UPTransportLayerInformation_PR_gTPTunnel;
7380 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7381 sizeof(GTPTunnel_t));
7382 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7384 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7387 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7388 transportLayerAddress.size = 4*sizeof(uint8_t);
7389 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7390 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7391 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7392 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7393 transportLayerAddress.buf == NULLP)
7395 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7399 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7400 transportLayerAddress.buf[0] = 192;
7401 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7402 transportLayerAddress.buf[1] = 168;
7403 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7404 transportLayerAddress.buf[2] = 130;
7405 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7406 transportLayerAddress.buf[3] = 82;
7407 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7408 transportLayerAddress.bits_unused = 0;
7411 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7412 = 4 * sizeof(uint8_t);
7413 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7414 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7415 gTPTunnel->gTP_TEID.size);
7416 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7419 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7422 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7423 gTP_TEID.buf[0] = 0;
7424 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7425 gTP_TEID.buf[1] = 0;
7426 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7427 gTP_TEID.buf[2] = 0;
7428 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7430 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7431 * fetched based on the Drb Id */
7433 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
7434 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
7435 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
7439 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7440 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
7443 }/*End of BuildULTnlInfo*/
7445 /*******************************************************************
7447 * @brief freeing the DRB item
7451 * Function : FreeDrbItem
7453 * Functionality: freeing the DRB item
7455 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7457 * @return ROK - success
7460 * ****************************************************************/
7462 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7465 SNSSAI_t *snssai =NULLP;
7466 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7468 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7469 switch(drbItem->qoSInformation.present)
7471 case QoSInformation_PR_NOTHING:
7473 case QoSInformation_PR_eUTRANQoS:
7475 if(drbItem->qoSInformation.choice.eUTRANQoS)
7477 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7481 case QoSInformation_PR_choice_extension:
7483 if(drbItem->qoSInformation.choice.choice_extension)
7485 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7487 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7490 CU_FREE(snssai->sST.buf,snssai->sST.size);
7496 CU_FREE(snssai->sD->buf,snssai->sD->size);
7498 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7501 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7502 if(flowMap->list.array)
7504 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7506 if(flowMap->list.array[arrIdx] )
7508 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7509 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7512 CU_FREE(flowMap->list.array,flowMap->list.size);
7515 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7521 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7522 if(drbItem->uLConfiguration)
7524 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7528 /*******************************************************************
7530 * @brief filling the DRB setup Mod item
7534 * Function : FillDrbItemToSetupMod
7536 * Functionality: filling the DRB setup Mod item
7539 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7541 * @return ROK - success
7544 * ****************************************************************/
7546 uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7551 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
7554 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7556 switch(drbItem->qoSInformation.present)
7558 case QoSInformation_PR_NOTHING:
7562 case QoSInformation_PR_eUTRANQoS:
7565 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7566 if(drbItem->qoSInformation.choice.eUTRANQoS)
7568 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7571 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7572 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7573 PriorityLevel_no_priority;
7575 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7576 Pre_emptionCapability_may_trigger_pre_emption;
7578 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7579 Pre_emptionVulnerability_pre_emptable;
7583 case QoSInformation_PR_choice_extension:
7585 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7586 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7588 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7592 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7593 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7594 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7595 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7596 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
7599 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7604 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7605 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[1]);
7608 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7612 /*Flows mapped to DRB List*/
7613 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7614 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7615 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7618 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7624 /*ULUPTNLInformation To Be Setup List*/
7625 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
7626 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7629 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7634 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7638 /*******************************************************************
7640 * @brief Builds the DRB to be Setup Mod ItemIes
7644 * Function : FillDrbItemList
7646 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7648 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7650 * @return ROK - success
7653 * ****************************************************************/
7655 uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7657 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7658 drbItemIe->criticality = Criticality_reject;
7659 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7661 if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7663 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7668 /*******************************************************************
7670 * @brief free the DRB to be Setup Mod list
7674 * Function : FreeDrbToBeSetupModList
7676 * Functionality: free the DRB to be Setup Mod list
7678 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7680 * @return ROK - success
7683 * ****************************************************************/
7684 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7687 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7689 if(drbSet->list.array)
7691 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7693 if(drbSet->list.array[arrIdx] != NULLP)
7697 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7698 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7700 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7703 CU_FREE(drbSet->list.array, drbSet->list.size);
7708 /*******************************************************************
7710 * @brief Builds the DRB to be Setup Mod list
7714 * Function : BuildDrbToBeSetupList
7716 * Functionality: Constructs the DRB to be Setup Mod list
7718 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7720 * @return ROK - success
7723 * ****************************************************************/
7725 uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
7731 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7732 drbSet->list.count = drbCnt;
7733 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7734 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7735 if(drbSet->list.array == NULLP)
7737 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7741 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7743 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7744 if(drbSet->list.array[arrIdx] == NULLP)
7746 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7750 ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7753 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7760 /*******************************************************************
7762 * @brief Filling the DRB to be modified item
7766 * Function : FillDrbToBeModItem
7768 * Functionality: filling the DRB to be modified item
7770 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7772 * @return ROK - success
7775 * ****************************************************************/
7777 uint8_t FillDrbToBeModItem(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
7782 drbItem->dRBID = DRB2 + arrIdx;
7785 drbItem->qoSInformation = NULLP;
7786 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7787 if(drbItem->qoSInformation != NULLP)
7789 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7791 switch(drbItem->qoSInformation->present)
7793 case QoSInformation_PR_NOTHING:
7797 case QoSInformation_PR_eUTRANQoS:
7800 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7801 if(drbItem->qoSInformation->choice.eUTRANQoS)
7803 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7806 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7807 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7808 PriorityLevel_no_priority;
7810 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7811 Pre_emptionCapability_may_trigger_pre_emption;
7813 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7814 Pre_emptionVulnerability_pre_emptable;
7818 case QoSInformation_PR_choice_extension:
7820 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7821 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7823 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7827 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7828 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7829 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7830 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7831 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
7834 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7839 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7840 choice_extension->value.choice.DRB_Information.sNSSAI,cuCfgParams.snssaiList[0]);
7843 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7847 /*Flows mapped to DRB List*/
7848 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7849 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7850 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7853 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7860 /*ULUPTNLInformation To Be Setup List*/
7861 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
7862 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7865 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7871 /*******************************************************************
7873 * @brief Builds the DRB to be modified Item IE
7877 * Function : FillDrbToBeModItemList
7879 * Functionality: Constructs the DRB to be modified Mod Item Ies
7881 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7883 * @return ROK - success
7886 * ****************************************************************/
7888 uint8_t FillDrbToBeModItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7890 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7891 drbItemIe->criticality = Criticality_reject;
7892 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7893 if(FillDrbToBeModItem(ueId, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7895 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7902 /*******************************************************************
7904 * @brief Builds the DRB to be modified list
7908 * Function : BuildDrbToBeModList
7910 * Functionality: Constructs the DRB to be modified list
7912 * @params[in] DRBs_ToBeModified_List_t *drbSet
7914 * @return ROK - success
7917 * ****************************************************************/
7919 uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
7925 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
7926 drbSet->list.count = drbCnt;
7927 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
7928 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7929 if(drbSet->list.array == NULLP)
7931 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
7934 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7936 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
7937 if(drbSet->list.array[arrIdx] == NULLP)
7939 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7943 ret = FillDrbToBeModItemList(ueId, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
7946 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
7953 /*******************************************************************
7955 * @brief freeing the DRB item
7959 * Function : FreeModifiedDrbItem
7961 * Functionality: freeing the DRB 2 item
7963 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7965 * @return ROK - success
7968 * ****************************************************************/
7970 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
7973 SNSSAI_t *snssai =NULLP;
7974 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7976 if(drbItem->qoSInformation != NULLP)
7978 switch(drbItem->qoSInformation->present)
7980 case QoSInformation_PR_NOTHING:
7982 case QoSInformation_PR_eUTRANQoS:
7984 if(drbItem->qoSInformation->choice.eUTRANQoS)
7986 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7990 case QoSInformation_PR_choice_extension:
7992 if(drbItem->qoSInformation->choice.choice_extension)
7994 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7996 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7999 CU_FREE(snssai->sST.buf,snssai->sST.size);
8005 CU_FREE(snssai->sD->buf,snssai->sD->size);
8007 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
8010 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
8011 if(flowMap->list.array)
8013 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
8015 if(flowMap->list.array[arrIdx] )
8017 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
8018 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
8021 CU_FREE(flowMap->list.array,flowMap->list.size);
8024 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
8030 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
8031 if(drbItem->uLConfiguration)
8033 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
8037 /*******************************************************************
8039 * @brief free the DRB to be modfified list
8043 * Function : FreeDrbToBeModifiedList
8045 * Functionality: free the DRB to be Setup Mod list
8047 * @params[in] FreeDrbToBeModifiedList_t *drbSet
8049 * @return ROK - success
8052 * ****************************************************************/
8053 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
8056 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
8058 if(drbSet->list.array)
8060 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
8062 if(drbSet->list.array[arrIdx] != NULLP)
8064 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
8065 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
8066 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8069 CU_FREE(drbSet->list.array, drbSet->list.size);
8074 /*******************************************************************
8076 * @brief free the UeContextModification Request
8080 * Function : FreeUeContextModicationRequest
8082 * Functionality : deallocation of memory allocated in UeContextModiification
8085 * @params[in] F1AP_PDU_t *f1apMsg
8089 * ****************************************************************/
8090 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
8092 uint8_t arrIdx =0 , ieId=0;
8093 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
8097 if(f1apMsg->choice.initiatingMessage)
8099 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8100 if(UeContextModifyReq->protocolIEs.list.array)
8102 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
8104 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
8106 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
8109 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8111 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8113 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
8115 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8116 choice.DRBs_ToBeSetupMod_List);
8119 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
8121 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8122 choice.DRBs_ToBeSetupMod_List);
8127 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
8130 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
8132 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8134 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8137 /*******************************************************************
8139 * @brief Builds the Ue Context Modification Req
8143 * Function : BuildAndSendUeContextModificationReq
8145 * Functionality: Constructs the Ue Context Modification Req
8149 * @return ROK - success
8152 * ****************************************************************/
8153 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
8156 uint8_t elementCnt = 0;
8157 uint8_t ret = RFAILED;
8158 F1AP_PDU_t *f1apMsg = NULLP;
8159 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
8161 asn_enc_rval_t encRetVal;
8162 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
8166 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8167 if(f1apMsg == NULLP)
8169 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8173 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8175 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8176 if(f1apMsg->choice.initiatingMessage == NULLP)
8178 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8181 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
8182 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8183 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
8185 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8188 ueContextModifyReq->protocolIEs.list.count = elementCnt;
8189 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
8191 /* Initialize the UE context modification members */
8192 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
8193 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
8195 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8199 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8201 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
8202 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
8204 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8211 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8212 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8213 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8214 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8215 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
8218 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8219 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8220 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
8221 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8222 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
8224 /* DRB to be setup list */
8226 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
8227 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8228 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8229 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
8230 ret = BuildDrbToBeSetupList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8231 value.choice.DRBs_ToBeSetupMod_List));
8233 /* DRB to be modified list */
8235 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
8236 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8237 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8238 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
8239 ret = BuildDrbToBeModifiedList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8240 value.choice.DRBs_ToBeModified_List));
8242 /* TODO: DRB to be release list */
8248 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8250 /* Encode the F1SetupRequest type as APER */
8251 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8253 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8256 /* Encode results */
8257 if(encRetVal.encoded == ENCODE_FAIL)
8259 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8260 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8265 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8266 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8268 DU_LOG("%x",encBuf[ieIdx]);
8272 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8274 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8282 FreeUeContextModicationRequest(f1apMsg);
8285 /*****************************************************************i
8287 * @brief Free memory allocated for UE Context Release Command
8291 * Function : FreeUeContextReleaseCommand
8294 * - Free memory allocated for UE Context Release Command
8296 * @params[in] F1AP_PDU_t *f1apMsg
8299 * *************************************************************/
8300 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8303 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8307 if(f1apMsg->choice.initiatingMessage)
8309 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8310 if(ueReleaseCommand->protocolIEs.list.array)
8312 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8314 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8316 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8318 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8320 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8323 /*******************************************************************
8325 * @brief Builds the Ue Context Release Command
8329 * Function : BuildAndSendUeContextReleaseCommand
8331 * Functionality: Constructs the Ue Context Release Command
8335 * @return ROK - success
8338 * ****************************************************************/
8339 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
8341 bool memAllocFailed = false;
8342 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8343 F1AP_PDU_t *f1apMsg = NULLP;
8344 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8346 asn_enc_rval_t encRetVal;
8347 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8351 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8352 if(f1apMsg == NULLP)
8354 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8358 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8360 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8361 if(f1apMsg->choice.initiatingMessage == NULLP)
8363 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8366 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8367 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8368 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8370 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8373 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8374 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8376 /* Initialize the UE context modification members */
8377 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8378 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8380 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8384 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8386 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8387 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8389 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8390 memAllocFailed = true;
8395 if(memAllocFailed == true)
8400 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8401 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8402 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8403 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8404 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8407 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8408 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8409 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8410 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8411 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8414 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8415 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8416 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8417 UEContextReleaseCommandIEs__value_PR_Cause;
8418 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8419 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8420 CauseRadioNetwork_normal_release;
8422 /* RRC Container for RRC release */
8424 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8425 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8426 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8427 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8428 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8430 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8431 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8432 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8433 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8435 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8438 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8439 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8441 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8443 /* Encode the UE Context Release Command type as APER */
8444 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8446 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8449 /* Encode results */
8450 if(encRetVal.encoded == ENCODE_FAIL)
8452 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8453 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8458 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8459 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8461 DU_LOG("%x",encBuf[ieIdx]);
8465 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8467 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8475 FreeUeContextReleaseCommand(f1apMsg);
8478 /*******************************************************************
8480 * @brief process Ue context release request
8484 * Function : procUeContextReleaseReq
8487 * - process Ue context release request
8489 * @params[in] F1AP_PDU_t *f1apMsg
8490 * @return ROK - success
8493 * ****************************************************************/
8494 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
8496 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8498 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8499 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8501 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8503 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8505 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8507 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8510 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8512 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8519 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
8521 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8526 /*******************************************************************
8528 * @brief processing of Gnb-DU config update
8532 * Function : procGnbDuUpdate
8535 * - processing of Gnb-DU config update
8537 * @params[in] F1AP_PDU_t *f1apMsg
8538 * @return ROK - success
8541 * ****************************************************************/
8542 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
8544 bool cellToBeDelete = false;
8545 uint8_t ieIdx = 0, ueIdx = 0;
8546 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8548 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8549 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8551 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8553 case ProtocolIE_ID_id_TransactionID:
8555 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8557 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8559 cellToBeDelete = true;
8562 case ProtocolIE_ID_id_gNB_DU_ID:
8566 if(BuildAndSendDUUpdateAck() != ROK)
8568 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8572 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
8573 * commented this trigger for now */
8575 if(cellToBeDelete == false)
8577 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8578 if(BuildAndSendF1ResetReq() != ROK)
8580 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8585 if(cellToBeDelete == true)
8587 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
8589 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
8590 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
8597 /*******************************************************************
8599 * @brief storing slice list in CU database
8603 * Function : buildSliceList
8606 * - storing slice list in CU database
8608 * @params[in] SliceSupportList_t *sliceSupportList
8609 * @return ROK - success
8612 * ****************************************************************/
8613 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8615 uint8_t sliceListIdx = 0;
8617 if(sliceSupportList)
8619 if(sliceSupportList->list.array)
8621 cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
8622 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8624 if(sliceSupportList->list.array[sliceListIdx])
8626 CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai));
8627 if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
8629 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8632 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8634 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8635 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8637 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8639 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
8640 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8641 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8650 /****************************************************************
8651 * @brief Function to process Drb Setup Mod List
8655 * Function : procDrbSetupModList
8658 * - Function to process DRB Setup Mod List
8661 * @return ROK - success
8664 * ****************************************************************/
8665 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8669 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8671 if(drbSetupList != NULLP)
8673 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8675 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8676 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8678 /* extracting teId */
8679 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8682 if(addDrbTunnels(teId)== ROK)
8684 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8695 /*******************************************************************
8697 * @brief processing of GNB_DU_Served_Cells Plmn list information
8701 * Function : procServedCellPlmnList
8704 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8707 * @params[in] F1AP_PDU_t *f1apMsg
8708 * @return ROK - success
8711 * ****************************************************************/
8712 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8714 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8715 ProtocolExtensionContainer_4624P3_t **ieExtend;
8717 if(srvPlmn->list.array)
8719 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8721 if(srvPlmn->list.array[srvPlmnIdx])
8723 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8726 if((*ieExtend)->list.array)
8728 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8730 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8732 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8734 case ProtocolIE_ID_id_TAISliceSupportList:
8736 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8737 extensionValue.choice.SliceSupportList) != ROK)
8739 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8754 /****************************************************************
8755 * @brief Function to process Ue Context Modification Response
8759 * Function : procUeContextModificationResponse
8762 * - Function to process Ue Context Modification Response
8765 * @return ROK - success
8768 * ****************************************************************/
8769 uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
8771 uint8_t idx, duUeF1apId;
8772 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8773 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8775 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8777 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8779 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8781 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8784 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8786 /* Adding Tunnels for successful DRB */
8787 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8796 /*******************************************************************
8798 * @brief processing of F1 setup request
8802 * Function : procF1SetupReq
8805 * - processing of F1 setup request
8807 * @params[in] F1AP_PDU_t *f1apMsg
8808 * @return ROK - success
8811 * ****************************************************************/
8812 void procF1SetupReq(F1AP_PDU_t *f1apMsg)
8814 uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
8815 BIT_STRING_t nrcellIdentity;
8816 F1SetupRequest_t *f1SetupReq = NULLP;
8817 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8818 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8820 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8821 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8823 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8825 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8827 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8828 if(duServedCell->list.array)
8830 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8832 if(duServedCell->list.array[plmnidx])
8834 switch(duServedCell->list.array[plmnidx]->id)
8836 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8838 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8839 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8840 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
8851 BuildAndSendF1SetupRsp(&nrcellIdentity);
8855 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
8859 /*******************************************************************
8861 * @brief Handles received F1AP message and sends back response
8865 * Function : F1APMsgHdlr
8868 * - Decodes received F1AP control message
8869 * - Prepares response message, encodes and sends to SCTP
8872 * @return ROK - success
8875 * ****************************************************************/
8876 void F1APMsgHdlr(Buffer *mBuf)
8882 F1AP_PDU_t *f1apMsg = NULLP;
8883 asn_dec_rval_t rval; /* Decoder return value */
8884 F1AP_PDU_t f1apasnmsg ;
8886 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
8887 ODU_PRINT_MSG(mBuf, 0,0);
8889 /* Copy mBuf into char array to decode it */
8890 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8891 CU_ALLOC(recvBuf, (Size)recvBufLen);
8893 if(recvBuf == NULLP)
8895 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
8898 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8900 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
8904 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
8905 for(i=0; i< recvBufLen; i++)
8907 DU_LOG("%x",recvBuf[i]);
8910 /* Decoding flat buffer into F1AP messsage */
8911 f1apMsg = &f1apasnmsg;
8912 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8914 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8915 CU_FREE(recvBuf, (Size)recvBufLen);
8917 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8919 DU_LOG("\nERROR --> F1AP : ASN decode failed");
8923 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8925 switch(f1apMsg->present)
8927 case F1AP_PDU_PR_initiatingMessage:
8929 switch(f1apMsg->choice.initiatingMessage->value.present)
8931 case InitiatingMessage__value_PR_Reset:
8933 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
8934 BuildAndSendF1ResetAck();
8938 case InitiatingMessage__value_PR_F1SetupRequest:
8940 DU_LOG("\nINFO --> F1AP : F1 setup request received");
8941 procF1SetupReq(f1apMsg);
8945 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
8947 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
8948 procGnbDuUpdate(f1apMsg);
8951 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
8953 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
8954 procInitULRRCMsg(f1apMsg);
8957 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
8959 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
8960 procUlRrcMsg(f1apMsg);
8964 case InitiatingMessage__value_PR_RRCDeliveryReport:
8966 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
8969 case InitiatingMessage__value_PR_UEContextReleaseRequest:
8971 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
8972 procUeContextReleaseReq(f1apMsg);
8977 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
8978 f1apMsg->choice.initiatingMessage->value.present);
8981 }/* End of switch(initiatingMessage) */
8985 case F1AP_PDU_PR_successfulOutcome:
8987 switch(f1apMsg->choice.successfulOutcome->value.present)
8989 case SuccessfulOutcome__value_PR_ResetAcknowledge:
8991 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
8994 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
8996 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
8997 procUeContextSetupResponse(f1apMsg);
9000 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
9002 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
9003 procUeContextModificationResponse(f1apMsg);
9006 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
9008 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
9013 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
9014 f1apMsg->choice.successfulOutcome->value.present);
9017 }/* End of switch(successfulOutcome) */
9022 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
9025 }/* End of switch(f1apMsg->present) */
9027 } /* End of F1APMsgHdlr */
9029 /**********************************************************************
9031 **********************************************************************/