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)
1918 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1924 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1925 nrcgi->nRCellIdentity.buf[0] |= val;
1926 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1930 /*******************************************************************
1932 * @brief Builds Special cell list for UE Setup Request
1936 * Function : BuildSplCellList
1938 * Functionality: Constructs the Special Cell list for UESetReq
1940 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1942 * @return ROK - success
1945 * ****************************************************************/
1946 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1952 spCellLst->list.count = cellCnt;
1953 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1954 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1955 if(spCellLst->list.array == NULLP)
1959 for(idx=0; idx<cellCnt; idx++)
1961 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1962 if(spCellLst->list.array[idx] == NULLP)
1968 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1969 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1970 spCellLst->list.array[idx]->value.present =\
1971 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1972 /* Special Cell ID -NRCGI */
1973 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1978 /*Special Cell Index*/
1979 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1981 }/* End of BuildSplCellList*/
1983 /*******************************************************************
1985 * @brief Builds SRBS to be setup
1989 * Function : BuildSRBSetup
1991 * Functionality: Constructs the SRB's for UESetReq
1993 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1995 * @return ROK - success
1998 * ****************************************************************/
1999 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2004 srbSet->list.count = srbCnt;
2005 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2006 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2007 if(srbSet->list.array == NULLP)
2011 for(idx=0; idx<srbCnt; idx++)
2013 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2014 if(srbSet->list.array[idx] == NULLP)
2020 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2021 srbSet->list.array[idx]->criticality = Criticality_ignore;
2022 srbSet->list.array[idx]->value.present = \
2023 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2024 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2026 }/* End of BuildSRBSetup*/
2028 /*******************************************************************
2030 * @brief Builds QOS Info for DRB Setum Item
2034 * Function : BuildQOSInfo
2036 * Functionality: Constructs the QOS Info for DRB Setup Item
2038 * @params[in] QoSInformation_t *qosinfo
2039 * int16_t pduSessionID
2041 * @return ROK - success
2044 * ****************************************************************/
2045 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
2046 int16_t pduSessionID)
2048 uint8_t elementCnt = 0, qosCntIdx = 0;
2049 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2051 /* NonDynamic5QIDescriptor */
2052 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2053 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2054 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2059 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2060 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2062 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2065 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2066 sizeof(AveragingWindow_t));
2067 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2072 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2073 /*MaxDataBurstVolume*/
2074 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2075 sizeof(MaxDataBurstVolume_t));
2076 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2081 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2083 /*nRGRAN Allocation Retention Priority*/
2084 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2085 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2086 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2088 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2089 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2091 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2095 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2096 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2100 elementCnt = NUM_QOS_EXT;
2101 qosIeExt->list.count = elementCnt;
2102 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2104 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2105 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2107 if(qosIeExt->list.array == NULLP)
2109 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2113 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2115 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2116 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2118 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2121 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2122 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2123 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2124 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2125 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2126 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2127 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2132 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2137 }/*End of BuildQOSInfo*/
2139 /*******************************************************************
2141 * @brief Builds SNSSAI
2145 * Function : BuildSNSSAI
2147 * Functionality: Constructs the SNSSAI For DRB list
2149 * @params[in] SNSSAI_t *snssai
2150 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2152 * @return ROK - success
2155 * ****************************************************************/
2156 uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
2160 snssai->sST.size = sizeof(uint8_t);
2161 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2162 if(snssai->sST.buf == NULLP)
2166 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2168 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2169 if(snssai->sD == NULLP)
2173 snssai->sD->size = 3*sizeof(uint8_t);
2174 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2175 if(snssai->sD->buf == NULLP)
2179 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2181 }/*End of BuildSNSSAI*/
2183 /*******************************************************************
2185 * @brief Builds the flow map.
2189 * Function : BuildFlowsMap
2191 * Functionality: Constructs the flowmap For DRB list
2193 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2195 * @return ROK - success
2198 * ****************************************************************/
2199 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2201 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2204 flowMap->list.count = flowCnt;
2205 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2206 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2207 if(flowMap->list.array == NULLP)
2209 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2212 for(idx=0; idx<flowCnt; idx++)
2214 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2215 if(flowMap->list.array[idx] == NULLP)
2217 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2222 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2223 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2224 actionType, INVALID_PDU_SESSION_ID);
2227 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2231 }/*End of BuildFlowsMap*/
2233 /*******************************************************************
2235 * @brief Builds the Uplink Tunnel Info
2239 * Function : BuildULTnlInfo
2241 * Functionality: Constructs the UL TnlInfo For DRB list
2243 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2245 * @return ROK - success
2248 * ****************************************************************/
2249 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2254 ulInfo->list.count = ulCnt;
2255 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2256 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2257 if(ulInfo->list.array == NULLP)
2259 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2262 for(idx=0; idx<ulCnt; idx++)
2264 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2265 if(ulInfo->list.array[idx] == NULLP)
2267 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2272 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2273 UPTransportLayerInformation_PR_gTPTunnel;
2275 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2276 sizeof(GTPTunnel_t));
2277 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2279 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2282 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2283 transportLayerAddress.size = 4*sizeof(uint8_t);
2284 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2285 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2286 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2287 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2288 transportLayerAddress.buf == NULLP)
2290 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2293 /* NOTE: Below IP address must be changed if running on different IP configuration */
2294 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2295 transportLayerAddress.buf[0] = 192;
2296 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2297 transportLayerAddress.buf[1] = 168;
2298 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2299 transportLayerAddress.buf[2] = 130;
2300 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2301 transportLayerAddress.buf[3] = 82;
2302 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2303 transportLayerAddress.bits_unused = 0;
2305 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2306 = 4 * sizeof(uint8_t);
2307 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2308 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2309 gTPTunnel->gTP_TEID.size);
2310 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2313 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2316 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2317 gTP_TEID.buf[0] = 0;
2318 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2319 gTP_TEID.buf[1] = 0;
2320 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2321 gTP_TEID.buf[2] = 0;
2322 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2323 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2326 }/*End of BuildULTnlInfo*/
2328 /*******************************************************************
2330 * @brief Builds DRBS to be setup
2334 * Function : BuildDRBSetup
2336 * Functionality: Constructs the DRB's for UESetReq
2338 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2340 * @return ROK - success
2343 * ****************************************************************/
2344 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2346 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2347 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2348 DRBs_ToBeSetup_Item_t *drbSetItem;
2350 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2351 drbSet->list.count = drbCnt;
2352 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2353 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2354 if(drbSet->list.array == NULLP)
2356 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2359 for(idx=0; idx<drbCnt; idx++)
2361 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2362 if(drbSet->list.array[idx] == NULLP)
2364 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2368 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2369 drbSet->list.array[idx]->criticality = Criticality_ignore;
2370 drbSet->list.array[idx]->value.present = \
2371 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2372 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2374 drbSetItem->dRBID = idx + 1;
2376 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2377 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2378 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2380 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2383 drbSetItem->qoSInformation.choice.choice_extension->id = \
2384 ProtocolIE_ID_id_DRB_Information;
2385 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2387 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2388 QoSInformation_ExtIEs__value_PR_DRB_Information;
2389 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2390 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2391 ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
2392 if(BuildQOSInforet != ROK)
2394 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2398 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2399 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[0]);
2400 if(BuildSNSSAIret != ROK)
2402 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2405 /*Flows mapped to DRB List*/
2406 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2407 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2408 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2409 if(BuildFlowsMapret != ROK)
2411 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2414 /*ULUPTNLInformation To Be Setup List*/
2415 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2416 if(BuildULTnlInforet != ROK)
2418 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2422 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2425 }/* End of BuildDRBSetup*/
2427 /*******************************************************************
2429 * @brief Deallocating memory of function BuildAndSendUESetReq
2433 * Function : FreeNrcgi
2435 * Functionality: Deallocating memory for function BuildNrcgi
2437 * @params[in] NRCGI_t *nrcgi
2441 *******************************************************************/
2442 void FreeNrcgi(NRCGI_t *nrcgi)
2444 if(nrcgi->pLMN_Identity.buf != NULLP)
2446 if(nrcgi->nRCellIdentity.buf != NULLP)
2448 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2450 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2453 /*******************************************************************
2455 * @brief Deallocating memory of function BuildAndSendUESetReq
2459 * Function : FreeSplCellList
2461 * Functionality: Deallocating memory for function BuildSplCellList
2463 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2468 * *****************************************************************/
2469 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2472 if(spCellLst->list.array != NULLP)
2474 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2476 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2478 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2480 if(spCellLst->list.array[cellidx]!=NULLP)
2482 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2485 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2488 /*******************************************************************
2490 * @brief Deallocating memory of function BuildAndSendUESetReq
2494 * Function : FreeSRBSetup
2496 * Functionality: Deallocating memory for function BuildSRBSetup
2498 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2503 * ******************************************************************/
2504 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2507 if(srbSet->list.array != NULLP)
2509 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2511 if(srbSet->list.array[srbidx]!=NULLP)
2513 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2516 CU_FREE(srbSet->list.array,srbSet->list.size);
2519 /*******************************************************************
2521 * @brief Deallocating memory of function BuildAndSendUESetReq
2525 * Function : FreeQOSInfo
2527 * Functionality: Deallocating memory for function BuildQOSInfo
2529 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2533 * ****************************************************************/
2534 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2536 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2537 uint8_t qosCntIdx = 0;
2539 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2541 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2543 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2545 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2546 sizeof(MaxDataBurstVolume_t));
2548 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2549 sizeof(AveragingWindow_t));
2551 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2552 sizeof(NonDynamic5QIDescriptor_t));
2554 if(drbQos->iE_Extensions)
2556 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2557 if(qosIeExt->list.array != NULLP)
2559 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2561 if(qosIeExt->list.array[qosCntIdx])
2563 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2566 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2569 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2572 /*******************************************************************
2574 * @brief Deallocating memory of function BuildAndSendUESetReq
2578 * Function : FreeULTnlInfo
2580 * Functionality: Deallocating memory for function BuildULTnlInfo
2582 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2587 * ****************************************************************/
2588 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2591 if(ulInfo->list.array != NULLP)
2593 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2595 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2597 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2599 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2600 transportLayerAddress.buf != NULLP)
2602 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2605 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2606 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2607 gTPTunnel->gTP_TEID.size);
2609 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2610 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2611 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2613 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2614 sizeof(GTPTunnel_t));
2617 if(ulInfo->list.array[ulidx]!=NULLP)
2619 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2622 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2625 /*******************************************************************
2627 * @brief Deallocating memory for BuildAndSendUESetReq
2631 * Function : FreeDRBSetup
2633 * Functionality: Deallocating memory for BuildDRBSetup
2635 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2639 * ****************************************************************/
2640 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2642 DRBs_ToBeSetup_Item_t *drbSetItem;
2643 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2645 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
2647 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
2648 if(drbSet->list.array != NULLP)
2650 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2652 if(drbSet->list.array[drbidx] != NULLP)
2654 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2655 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2657 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2658 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2660 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2661 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2663 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2664 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2666 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2668 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2670 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2672 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2673 flows_Mapped_To_DRB_List.list.array != NULLP)
2675 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2676 flows_Mapped_To_DRB_List.list.count; flowidx++)
2678 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2679 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2681 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2682 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2683 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2685 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2686 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2687 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2689 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2690 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2691 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2693 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2694 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_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->maxDataBurstVolume,\
2699 sizeof(MaxDataBurstVolume_t));
2701 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2702 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2703 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2705 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2706 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2707 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2710 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2711 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2713 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2714 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2717 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2718 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2719 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2721 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2722 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2724 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2725 sizeof(OCTET_STRING_t));
2727 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2728 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2730 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2731 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2733 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2734 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2736 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2737 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2739 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2740 iE_Extensions != NULLP)
2742 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
2743 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
2744 if(qosIeExt->list.array != NULLP)
2746 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2748 if(qosIeExt->list.array[qosCntIdx] != NULLP)
2750 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2753 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2755 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2756 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2759 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2761 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2764 CU_FREE(drbSet->list.array,drbSet->list.size);
2769 /*******************************************************************
2771 * @brief Free the UE Setup Request
2775 * Function : FreeUeContextSetupReq
2777 * Functionality: Deallocate the memory of BuildUESetReq
2779 * @params[in] F1AP_PDU_t *f1apMsg
2784 * ****************************************************************/
2785 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2788 UEContextSetupRequest_t *ueSetReq = NULLP;
2790 if(f1apMsg != NULLP)
2792 if(f1apMsg->choice.initiatingMessage != NULLP)
2794 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2795 if(ueSetReq->protocolIEs.list.array != NULLP)
2797 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2799 if(ueSetReq->protocolIEs.list.array[idx])
2801 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2803 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2805 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2807 case ProtocolIE_ID_id_SpCell_ID:
2808 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2810 case ProtocolIE_ID_id_ServCellIndex:
2812 case ProtocolIE_ID_id_SpCellULConfigured:
2814 case ProtocolIE_ID_id_CUtoDURRCInformation:
2815 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2817 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2818 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2820 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2821 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2823 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2824 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2826 case ProtocolIE_ID_id_RRCContainer:
2827 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2829 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2830 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2834 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2838 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
2840 for(ieId=0; ieId<idx; ieId++)
2842 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2844 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2847 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2849 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2851 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2855 /**Filling cell group info **/
2856 /*******************************************************************
2858 * @brief Build Control resource set to add/modify list
2862 * Function : BuildControlRSetToAddModList
2864 * Functionality: Build Control resource set to add/modify list
2867 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2869 * @return ROK - success
2872 * ****************************************************************/
2873 uint8_t BuildControlRSetToAddModList
2875 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2880 uint8_t numBytes, bitsUnused;
2881 struct ControlResourceSet *controlRSet;
2882 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2883 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2886 controlRSetList->list.count = elementCnt;
2887 controlRSetList->list.size = \
2888 elementCnt * sizeof(struct ControlResourceSet *);
2890 controlRSetList->list.array = NULLP;
2891 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2892 if(!controlRSetList->list.array)
2894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2898 for(idx = 0; idx < elementCnt; idx++)
2900 controlRSetList->list.array[idx] = NULLP;
2901 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2902 if(!controlRSetList->list.array[idx])
2904 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2910 controlRSet = controlRSetList->list.array[idx];
2911 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2913 /* Values harcoded according to our design:
2916 * Bit string stored ff0000000000
2920 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2921 controlRSet->frequencyDomainResources.buf = NULLP;
2922 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2923 controlRSet->frequencyDomainResources.size);
2924 if(!controlRSet->frequencyDomainResources.buf)
2926 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2930 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2931 coreset0EndPrb = CORESET0_END_PRB;
2932 coreset1StartPrb = coreset0EndPrb + 6;
2933 coreset1NumPrb = CORESET1_NUM_PRB;
2934 /* calculate the PRBs */
2935 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2936 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2937 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2939 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2940 controlRSet->cce_REG_MappingType.present = \
2941 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2943 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2944 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2945 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2946 controlRSet->tci_PresentInDCI = NULLP;
2948 uint8_t tciStateIdx;
2950 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2951 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2952 if(!controlRset->tci_StatesPDCCH_ToAddList)
2954 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2959 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2960 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2961 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2962 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2963 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2965 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2969 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2971 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2972 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2974 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2981 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2983 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2984 if(!controlRset->tci_PresentInDCI)
2986 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2990 *(controlRset->tci_PresentInDCI);
2993 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2994 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2995 if(!controlRSet->pdcch_DMRS_ScramblingID)
2997 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3000 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3003 } /* End BuildControlRSetToAddModList */
3005 /*******************************************************************
3007 * @brief Build search space to add/modify list
3011 * Function : BuildSearchSpcToAddModList
3013 * Functionality: Build search space to add/modify list
3016 * @return ROK - success
3019 * ****************************************************************/
3020 uint8_t BuildSearchSpcToAddModList
3022 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3030 struct SearchSpace *searchSpc;
3033 searchSpcList->list.count = elementCnt;
3034 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3036 searchSpcList->list.array = NULLP;
3037 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3038 if(!searchSpcList->list.array)
3040 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3044 for(idx = 0; idx < elementCnt; idx++)
3046 searchSpcList->list.array[idx] = NULLP;
3047 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3048 if(!searchSpcList->list.array[idx])
3050 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3056 searchSpc = searchSpcList->list.array[idx];
3058 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3060 searchSpc->controlResourceSetId = NULLP;
3061 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3062 if(!searchSpc->controlResourceSetId)
3064 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3067 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3069 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3070 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3071 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3072 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3077 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3078 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3080 searchSpc->duration = NULLP;
3081 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3082 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3083 if(!searchSpc->monitoringSymbolsWithinSlot)
3085 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3089 /* Values taken from reference logs :
3092 * Bit string stores 8000
3097 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3098 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3099 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3100 searchSpc->monitoringSymbolsWithinSlot->size);
3101 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3103 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3108 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3109 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3110 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3111 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3113 searchSpc->nrofCandidates = NULLP;
3114 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3115 if(!searchSpc->nrofCandidates)
3117 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3121 searchSpc->nrofCandidates->aggregationLevel1 = \
3122 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3123 searchSpc->nrofCandidates->aggregationLevel2 = \
3124 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3125 searchSpc->nrofCandidates->aggregationLevel4 = \
3126 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3127 searchSpc->nrofCandidates->aggregationLevel8 = \
3128 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3129 searchSpc->nrofCandidates->aggregationLevel16 = \
3130 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3132 searchSpc->searchSpaceType = NULLP;
3133 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3134 if(!searchSpc->searchSpaceType)
3136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3140 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3142 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3143 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3144 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3145 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3147 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3150 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3151 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3154 }/* End BuildSearchSpcToAddModList */
3156 /*******************************************************************
3158 * @brief Builds BWP DL dedicated PDCCH config
3162 * Function : BuildBWPDlDedPdcchCfg
3164 * Functionality: Builds BWP DL dedicated PDCCH config
3166 * @params[in] struct PDCCH_Config *pdcchCfg
3168 * @return ROK - success
3171 * ****************************************************************/
3172 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3174 pdcchCfg->controlResourceSetToAddModList = NULLP;
3175 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3176 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3177 if(!pdcchCfg->controlResourceSetToAddModList)
3179 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3183 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3188 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3190 pdcchCfg->searchSpacesToAddModList = NULLP;
3191 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3192 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3193 if(!pdcchCfg->searchSpacesToAddModList)
3195 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3199 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3204 pdcchCfg->searchSpacesToReleaseList = NULLP;
3205 pdcchCfg->downlinkPreemption = NULLP;
3206 pdcchCfg->tpc_PUSCH = NULLP;
3207 pdcchCfg->tpc_PUCCH = NULLP;
3208 pdcchCfg->tpc_SRS = NULLP;
3213 /*******************************************************************
3215 * @brief Builds DMRS DL PDSCH Mapping type A
3219 * Function : BuildDMRSDLPdschMapTypeA
3221 * Functionality: Builds DMRS DL PDSCH Mapping type A
3224 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3225 * @return ROK - success
3228 * ****************************************************************/
3229 uint8_t BuildDMRSDLPdschMapTypeA
3231 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3234 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3235 dmrsDlCfg->choice.setup = NULLP;
3236 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3237 if(!dmrsDlCfg->choice.setup)
3239 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3243 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3244 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3245 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3246 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3248 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3251 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3253 dmrsDlCfg->choice.setup->maxLength = NULLP;
3254 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3255 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3256 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3261 /*******************************************************************
3263 * @brief Builds TCI states to add/modify list
3267 * Function : BuildTCIStatesToAddModList
3269 * Functionality:Builds TCI states to add/modify list
3272 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3274 * @return ROK - success
3277 * ****************************************************************/
3278 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3283 /*******************************************************************
3285 * @brief Builds PDSCH time domain allocation list
3289 * Function : BuildPdschTimeDomAllocList
3291 * Functionality: Builds PDSCH time domain allocation list
3294 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3296 * @return ROK - success
3299 * ****************************************************************/
3300 uint8_t BuildPdschTimeDomAllocList
3302 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3307 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3309 timeDomAllocList->present = \
3310 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3312 timeDomAllocList->choice.setup = NULLP;
3313 CU_ALLOC(timeDomAllocList->choice.setup, \
3314 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3315 if(!timeDomAllocList->choice.setup)
3317 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3322 timeDomAllocList->choice.setup->list.count = elementCnt;
3323 timeDomAllocList->choice.setup->list.size = \
3324 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3326 timeDomAllocList->choice.setup->list.array = NULLP;
3327 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3328 timeDomAllocList->choice.setup->list.size);
3329 if(!timeDomAllocList->choice.setup->list.array)
3331 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3335 for(idx = 0; idx < elementCnt; idx++)
3337 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3338 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3339 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3340 if(!timeDomAllocList->choice.setup->list.array[idx])
3342 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3348 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3349 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3350 if(!timeDomAlloc->k0)
3352 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3355 *(timeDomAlloc->k0) = 0;
3356 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3357 timeDomAlloc->startSymbolAndLength = 66;
3360 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3361 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3362 if(!timeDomAlloc->k0)
3364 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3367 *(timeDomAlloc->k0) = 1;
3368 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3369 timeDomAlloc->startSymbolAndLength = 66;
3374 /*******************************************************************
3376 * @brief Builds PDSCH PRB Bundling type
3380 * Function : BuildPdschPrbBundlingType
3382 * Functionality: Builds PDSCH PRB Bundling type
3385 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3387 * @return ROK - success
3390 * ****************************************************************/
3391 uint8_t BuildPdschPrbBundlingType
3393 struct PDSCH_Config__prb_BundlingType *prbBndlType
3396 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3398 prbBndlType->choice.staticBundling = NULLP;
3399 CU_ALLOC(prbBndlType->choice.staticBundling, \
3400 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3401 if(!prbBndlType->choice.staticBundling)
3403 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3406 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3411 /*******************************************************************
3413 * @brief Builds BWP DL dedicated PDSCH config
3417 * Function : BuildBWPDlDedPdschCfg
3419 * Functionality: Builds BWP DL dedicated PDSCH config
3421 * @params[in] struct PDSCH_Config *pdschCfg
3423 * @return ROK - success
3426 * ****************************************************************/
3427 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3429 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3431 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3432 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3433 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3434 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3436 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3440 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3445 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3446 pdschCfg->tci_StatesToAddModList = NULLP;
3447 pdschCfg->tci_StatesToReleaseList = NULLP;
3448 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3450 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3451 if(!pdschCfg->tci_StatesToAddModList)
3453 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3456 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3462 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3464 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3465 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3466 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3467 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3469 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3472 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3476 pdschCfg->pdsch_AggregationFactor = NULLP;
3477 pdschCfg->rateMatchPatternToAddModList = NULLP;
3478 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3479 pdschCfg->rateMatchPatternGroup1 = NULLP;
3480 pdschCfg->rateMatchPatternGroup2 = NULLP;
3481 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3482 pdschCfg->mcs_Table = NULLP;
3484 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3485 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3486 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3488 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3491 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3493 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3498 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3499 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3500 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3501 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3502 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3503 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3504 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3509 /*******************************************************************
3511 * @brief Builds intitial DL BWP
3514 * Function : BuildInitialDlBWP
3516 * Functionality: Builds intitial DL BWP in spCellCfgDed
3518 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3520 * @return ROK - success
3523 * ****************************************************************/
3524 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3526 dlBwp->pdcch_Config = NULLP;
3527 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3528 if(!dlBwp->pdcch_Config)
3530 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3533 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3535 dlBwp->pdcch_Config->choice.setup = NULLP;
3536 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3537 if(!dlBwp->pdcch_Config->choice.setup)
3539 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3542 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3547 dlBwp->pdsch_Config = NULLP;
3548 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3549 if(!dlBwp->pdsch_Config)
3551 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3554 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3556 dlBwp->pdsch_Config->choice.setup = NULLP;
3557 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3558 if(!dlBwp->pdsch_Config->choice.setup)
3560 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3564 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3569 dlBwp->sps_Config = NULLP;
3570 dlBwp->radioLinkMonitoringConfig = NULLP;
3574 /*******************************************************************
3576 * @brief Builds DMRS UL Pusch Mapping type A
3580 * Function : BuildDMRSULPuschMapTypeA
3582 * Functionality: Builds DMRS UL Pusch Mapping type A
3585 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3586 * @return ROK - success
3589 * ****************************************************************/
3590 uint8_t BuildDMRSULPuschMapTypeA
3592 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3595 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3596 dmrsUlCfg->choice.setup= NULLP;
3597 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3598 if(!dmrsUlCfg->choice.setup)
3600 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3604 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3605 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3606 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3607 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3609 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3612 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3614 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3615 dmrsUlCfg->choice.setup->maxLength = NULLP;
3616 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3617 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3618 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3619 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3621 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3625 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3626 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3628 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3630 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3633 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3635 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3636 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3640 /*******************************************************************
3642 * @brief Build PUSCH time domain allocation list
3646 * Function : BuildPuschTimeDomAllocList
3648 * Functionality: Build PUSCH time domain allocation list
3651 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3653 * @return ROK - success
3656 * ****************************************************************/
3657 uint8_t BuildPuschTimeDomAllocList
3659 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3664 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3666 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3667 timeDomAllocList->choice.setup = NULLP;
3668 CU_ALLOC(timeDomAllocList->choice.setup, \
3669 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3670 if(!timeDomAllocList->choice.setup)
3672 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3677 timeDomAllocList->choice.setup->list.count = elementCnt;
3678 timeDomAllocList->choice.setup->list.size = \
3679 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3680 timeDomAllocList->choice.setup->list.array = NULLP;
3681 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3682 timeDomAllocList->choice.setup->list.size);
3683 if(!timeDomAllocList->choice.setup->list.array)
3685 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3689 for(idx = 0; idx < elementCnt; idx++)
3691 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3692 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3693 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3694 if(!timeDomAllocList->choice.setup->list.array[idx])
3696 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3702 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3703 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3704 if(!timeDomAlloc->k2)
3706 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3709 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3710 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3711 timeDomAlloc->startSymbolAndLength = 66;
3714 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3715 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3716 if(!timeDomAlloc->k2)
3718 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3721 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3722 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3723 timeDomAlloc->startSymbolAndLength = 66;
3728 /*******************************************************************
3730 * @brief Builds BWP UL dedicated PUSCH Config
3734 * Function : BuildBWPUlDedPuschCfg
3737 * Builds BWP UL dedicated PUSCH Config
3739 * @params[in] : PUSCH_Config_t *puschCfg
3741 * @return ROK - success
3744 * ****************************************************************/
3745 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3747 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3748 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3749 if(!puschCfg->dataScramblingIdentityPUSCH)
3751 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3754 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3756 puschCfg->txConfig = NULLP;
3757 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3758 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3759 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3760 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3762 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3766 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3771 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3772 puschCfg->pusch_PowerControl = NULLP;
3773 puschCfg->frequencyHopping = NULLP;
3774 puschCfg->frequencyHoppingOffsetLists = NULLP;
3775 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3777 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3778 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3779 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3780 if(!puschCfg->pusch_TimeDomainAllocationList)
3782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3786 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3791 puschCfg->pusch_AggregationFactor = NULLP;
3792 puschCfg->mcs_Table = NULLP;
3793 puschCfg->mcs_TableTransformPrecoder = NULLP;
3794 puschCfg->transformPrecoder = NULLP;
3795 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3796 if(!puschCfg->transformPrecoder)
3798 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3801 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3803 puschCfg->codebookSubset = NULLP;
3804 puschCfg->maxRank = NULLP;
3805 puschCfg->rbg_Size = NULLP;
3806 puschCfg->uci_OnPUSCH = NULLP;
3807 puschCfg->tp_pi2BPSK = NULLP;
3812 /*******************************************************************
3814 * @brief Builds BWP UL dedicated PUCCH Config
3818 * Function : BuildBWPUlDedPucchCfg
3821 * Builds BWP UL dedicated PUCCH Config
3823 * @params[in] : PUCCH_Config_t *pucchCfg
3825 * @return ROK - success
3828 * ****************************************************************/
3829 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3831 uint8_t arrIdx, elementCnt;
3832 uint8_t rsrcIdx, rsrcSetIdx;
3833 PUCCH_ResourceSet_t *rsrcSet = NULLP;
3834 PUCCH_Resource_t *rsrc = NULLP;
3838 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
3839 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
3840 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
3841 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
3842 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
3844 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
3847 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
3848 rsrcSet->pucch_ResourceSetId = 1;
3850 rsrcSet->resourceList.list.count = elementCnt;
3851 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
3852 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
3853 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
3855 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
3858 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
3862 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
3863 pucchCfg->resourceToAddModList->list.count = elementCnt;
3864 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
3865 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
3866 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
3868 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
3871 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
3872 rsrc->pucch_ResourceId = 1;
3873 rsrc->startingPRB = 0;
3874 rsrc->format.present = PUCCH_Resource__format_PR_format1;
3875 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
3876 rsrc->format.choice.format1->initialCyclicShift = 0;
3877 rsrc->format.choice.format1->nrofSymbols = 4;
3878 rsrc->format.choice.format1->startingSymbolIndex = 0;
3879 rsrc->format.choice.format1->timeDomainOCC = 0;
3882 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
3883 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
3884 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
3885 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
3886 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
3889 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3890 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3892 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3897 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3898 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3899 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3900 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3902 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3906 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3908 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3909 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3911 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3917 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
3918 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
3923 /*******************************************************************
3925 * @brief Fills SRS resource to add/modify list
3929 * Function : BuildSrsRsrcAddModList
3931 * Functionality: Fills SRS resource to add/modify list
3934 * @return ROK - success
3937 * ****************************************************************/
3938 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3944 resourceList->list.count = elementCnt;
3945 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3946 resourceList->list.array = NULLP;
3947 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3948 if(!resourceList->list.array)
3950 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3954 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3956 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3957 if(!resourceList->list.array[rsrcIdx])
3959 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3965 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3966 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3967 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3969 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3970 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3971 sizeof(struct SRS_Resource__transmissionComb__n2));
3972 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3974 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3977 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3978 = SRS_COMB_OFFSET_N2;
3979 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3980 = SRS_CYCLIC_SHIFT_N2;
3982 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3984 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3985 SRS_Resource__resourceMapping__nrofSymbols_n1;
3986 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3987 SRS_Resource__resourceMapping__repetitionFactor_n1;
3989 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3990 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3991 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3992 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3993 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3994 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3995 SRS_Resource__groupOrSequenceHopping_neither;
3997 /* Setting resource type to aperiodic for intergration purposes */
3998 resourceList->list.array[rsrcIdx]->resourceType.present = \
3999 SRS_Resource__resourceType_PR_aperiodic;
4000 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4001 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4002 sizeof(struct SRS_Resource__resourceType__aperiodic));
4003 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4005 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4008 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4013 /*******************************************************************
4015 * @brief Build SRS resource set Add/mod list
4019 * Function : BuildSrsRsrcSetAddModList
4021 * Functionality: Build SRS resource set Add/mod list
4024 * @return ROK - success
4027 * ****************************************************************/
4028 uint8_t BuildSrsRsrcSetAddModList
4030 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4036 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4039 rsrcSetList->list.count = elementCnt;
4040 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4041 rsrcSetList->list.array = NULLP;
4042 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4043 if(!rsrcSetList->list.array)
4045 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4049 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4051 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4052 if(!rsrcSetList->list.array[rSetIdx])
4054 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4060 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4062 /* Fill Resource Id list in resource set */
4063 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4064 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4065 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4066 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4068 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4073 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4074 rsrcIdList->list.count = elementCnt;
4075 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4076 rsrcIdList->list.array = NULLP;
4077 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4078 if(!rsrcIdList->list.array)
4080 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4084 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4086 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4087 if(!rsrcIdList->list.array[rsrcIdx])
4089 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4095 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4097 /* Fill resource type */
4098 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4099 SRS_ResourceSet__resourceType_PR_aperiodic;
4101 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4102 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4103 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4104 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4106 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4109 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4110 = APERIODIC_SRS_RESRC_TRIGGER;
4112 /* TODO : Fill values for below IEs as expected by Viavi */
4113 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4114 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4117 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4118 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4119 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4120 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4121 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4126 /*******************************************************************
4128 * @brief Builds BWP UL dedicated SRS Config
4132 * Function : BuildBWPUlDedSrsCfg
4134 * Functionality: Builds BWP UL dedicated SRS Config
4136 * @params[in] SRS Config
4137 * @return ROK - success
4140 * ****************************************************************/
4141 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4143 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4144 srsCfg->srs_ResourceSetToAddModList = NULLP;
4145 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4146 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4147 if(!srsCfg->srs_ResourceSetToAddModList)
4149 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4152 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4157 srsCfg->srs_ResourceToReleaseList = NULLP;
4159 /* Resource to Add/Modify list */
4160 srsCfg->srs_ResourceToAddModList = NULLP;
4161 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4162 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4163 if(!srsCfg->srs_ResourceToAddModList)
4165 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4169 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4174 srsCfg->tpc_Accumulation = NULLP;
4179 /*******************************************************************
4181 * @brief Builds inital UL BWP
4185 * Function : BuildInitialUlBWP
4187 * Functionality: Builds initial UL BWP
4189 * @params[in] BWP_UplinkDedicated_t *ulBwp
4190 * @return ROK - success
4193 * ****************************************************************/
4194 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4196 ulBwp->pucch_Config = NULLP;
4197 ulBwp->pucch_Config = NULLP;
4198 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4199 if(!ulBwp->pucch_Config)
4201 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4205 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4206 ulBwp->pucch_Config->choice.setup = NULLP;
4207 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4208 if(!ulBwp->pucch_Config->choice.setup)
4210 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4214 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4219 /* Fill BWP UL dedicated PUSCH config */
4220 ulBwp->pusch_Config = NULLP;
4221 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4222 if(!ulBwp->pusch_Config)
4224 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4228 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4229 ulBwp->pusch_Config->choice.setup = NULLP;
4230 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4231 if(!ulBwp->pusch_Config->choice.setup)
4233 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4237 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4242 ulBwp->configuredGrantConfig = NULLP;
4244 /* Fill BPW UL dedicated SRS config */
4245 ulBwp->srs_Config = NULLP;
4246 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4247 if(!ulBwp->srs_Config)
4249 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4253 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4254 ulBwp->srs_Config->choice.setup = NULLP;
4255 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4256 if(!ulBwp->srs_Config->choice.setup)
4258 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4262 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4267 ulBwp->beamFailureRecoveryConfig = NULLP;
4272 /*******************************************************************
4274 * @brief Builds Pusch Serving cell Config
4278 * Function : BuildPuschSrvCellCfg
4280 * Functionality: Builds Pusch Serving cell Config
4282 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4284 * @return ROK - success
4287 * ****************************************************************/
4288 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4290 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4291 puschCfg->choice.setup = NULLP;
4292 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4293 if(!puschCfg->choice.setup)
4295 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4299 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4300 puschCfg->choice.setup->rateMatching = NULLP;
4301 puschCfg->choice.setup->xOverhead = NULLP;
4302 puschCfg->choice.setup->ext1 = NULLP;
4303 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4304 if(!puschCfg->choice.setup->ext1)
4306 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4310 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4311 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4312 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4317 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4319 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4320 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4321 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4323 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4326 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4330 /*******************************************************************
4332 * @brief Builds UL config
4335 * Function : BuildUlCfg
4337 * Functionality: Builds UL config in spCellCfgDed
4339 * @params[in] UplinkConfig_t *ulCfg
4341 * @return ROK - success
4344 * ****************************************************************/
4345 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4347 ulCfg->initialUplinkBWP = NULLP;
4348 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4349 if(!ulCfg->initialUplinkBWP)
4351 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4355 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4360 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4361 ulCfg->uplinkBWP_ToAddModList = NULLP;
4362 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4363 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4364 if(!ulCfg->firstActiveUplinkBWP_Id)
4366 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4369 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4371 ulCfg->pusch_ServingCellConfig = NULLP;
4372 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4373 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4374 if(!ulCfg->pusch_ServingCellConfig)
4376 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4380 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4385 ulCfg->carrierSwitching = NULLP;
4386 ulCfg->ext1 = NULLP;
4390 /*******************************************************************
4392 * @brief Builds PDSCH serving cell config
4395 * Function : BuildPdschSrvCellCfg
4397 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4399 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4401 * @return ROK - success
4404 * ****************************************************************/
4405 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4407 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4408 pdschCfg->choice.setup = NULLP;
4409 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4410 if(!pdschCfg->choice.setup)
4412 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4416 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4417 pdschCfg->choice.setup->xOverhead = NULLP;
4418 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4419 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4420 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4422 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4425 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4426 pdschCfg->choice.setup->pucch_Cell = NULLP;
4427 pdschCfg->choice.setup->ext1 = NULLP;
4432 /*******************************************************************
4434 * @brief Builds CSI Meas config
4437 * Function : BuildCsiMeasCfg
4439 * Functionality: Builds CSI Meas config in spCellCfgDed
4441 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4443 * @return ROK - success
4446 * ****************************************************************/
4447 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4453 /*******************************************************************
4455 * @brief Builds Spcell config dedicated
4458 * Function : BuildSpCellCfgDed
4460 * Functionality: Builds sp cell config dedicated in spCellCfg
4462 * @params[in] ServingCellConfig_t srvCellCfg
4464 * @return ROK - success
4467 * ****************************************************************/
4468 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4470 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4472 srvCellCfg->initialDownlinkBWP = NULLP;
4473 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4474 if(!srvCellCfg->initialDownlinkBWP)
4476 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4480 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4482 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4485 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4486 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4488 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4489 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4490 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4492 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4495 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4497 srvCellCfg->bwp_InactivityTimer = NULLP;
4499 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4500 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4501 if(!srvCellCfg->defaultDownlinkBWP_Id)
4503 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4506 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4508 srvCellCfg->uplinkConfig = NULLP;
4509 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4510 if(!srvCellCfg->uplinkConfig)
4512 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4516 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4518 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4521 srvCellCfg->supplementaryUplink = NULLP;
4522 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4524 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4525 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4526 if(!srvCellCfg->pdsch_ServingCellConfig)
4528 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4532 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4534 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4538 srvCellCfg->csi_MeasConfig = NULLP;
4540 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4541 if(!srvCellCfg->csi_MeasConfig)
4543 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4547 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4549 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4553 srvCellCfg->sCellDeactivationTimer = NULLP;
4554 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4555 srvCellCfg->tag_Id = TAG_ID;
4556 srvCellCfg->dummy = NULLP;
4557 srvCellCfg->pathlossReferenceLinking = NULLP;
4558 srvCellCfg->servingCellMO = NULLP;
4559 srvCellCfg->ext1 = NULLP;
4563 /*******************************************************************
4565 * @brief Builds Spcell config
4569 * Function : BuildSpCellCfg
4571 * Functionality: Builds sp cell config in DuToCuRrcContainer
4573 * @params[in] SpCellConfig_t spCellCfg
4575 * @return ROK - success
4578 * ****************************************************************/
4579 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4582 spCellCfg->servCellIndex = NULLP;
4583 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4584 if(!spCellCfg->servCellIndex)
4586 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4589 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4591 spCellCfg->reconfigurationWithSync = NULLP;
4592 spCellCfg->rlf_TimersAndConstants = NULLP;
4593 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4594 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4595 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4597 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4600 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4602 spCellCfg->spCellConfigDedicated = NULLP;
4603 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4604 if(!spCellCfg->spCellConfigDedicated)
4606 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4609 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4611 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4616 /*******************************************************************
4618 * @brief Builds Phy cell group config
4622 * Function : BuildPhyCellGrpCfg
4624 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4626 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4628 * @return ROK - success
4631 * ****************************************************************/
4632 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4634 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4635 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4637 phyCellGrpCfg->p_NR_FR1 = NULLP;
4638 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4639 if(!phyCellGrpCfg->p_NR_FR1)
4641 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4644 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4645 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4646 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4647 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4648 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4649 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4650 phyCellGrpCfg->cs_RNTI = NULLP;
4651 phyCellGrpCfg->ext1 = NULLP;
4652 phyCellGrpCfg->ext2 = NULLP;
4657 /*******************************************************************
4659 * @brief Builds tag config
4663 * Function : BuildTagConfig
4665 * Functionality: Builds tag config in MacCellGroupConfig
4667 * @params[in] TAG_Config *tag_Config
4669 * @return ROK - success
4672 * ****************************************************************/
4673 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4675 struct TAG_Config__tag_ToAddModList *tagList;
4676 uint8_t idx, elementCnt;
4678 tagConfig->tag_ToReleaseList = NULLP;
4679 tagConfig->tag_ToAddModList = NULLP;
4680 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4681 if(!tagConfig->tag_ToAddModList)
4683 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4687 elementCnt = 1; //ODU_VALUE_ONE;
4688 tagList = tagConfig->tag_ToAddModList;
4689 tagList->list.count = elementCnt;
4690 tagList->list.size = elementCnt * sizeof(struct TAG *);
4692 tagList->list.array = NULLP;
4693 CU_ALLOC(tagList->list.array, tagList->list.size);
4694 if(!tagList->list.array)
4696 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4700 for(idx=0; idx<tagList->list.count; idx++)
4702 tagList->list.array[idx] = NULLP;
4703 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4704 if(!tagList->list.array[idx])
4706 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4712 tagList->list.array[idx]->tag_Id = TAG_ID;
4713 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4718 /*******************************************************************
4720 * @brief Builds PHR Config
4724 * Function : BuildPhrConfig
4726 * Functionality: Builds phrConfig in MacCellGroupConfig
4728 * @params[in] PHR Config *
4730 * @return ROK - success
4733 * ****************************************************************/
4734 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4737 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4738 phrConfig->choice.setup = NULLP;
4739 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4740 if(!phrConfig->choice.setup)
4742 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4746 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4747 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4748 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4749 phrConfig->choice.setup->multiplePHR = false;
4750 phrConfig->choice.setup->dummy = false;
4751 phrConfig->choice.setup->phr_Type2OtherCell = false;
4752 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4757 /*******************************************************************
4759 * @brief Builds BSR Config
4763 * Function : BuildBsrConfig
4765 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4767 * @params[in] BSR_Config *bsrConfig
4769 * @return ROK - success
4772 * ****************************************************************/
4773 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4775 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4776 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4777 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4782 /*******************************************************************
4784 * @brief Builds scheduling request config
4788 * Function : BuildSchedulingReqConfig
4790 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4792 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4794 * @return ROK - success
4797 * ****************************************************************/
4798 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4800 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4801 uint8_t idx, elementCnt;
4803 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4804 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4805 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4806 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4808 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4812 elementCnt = 1; //ODU_VALUE_ONE;
4813 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4814 schReqList->list.count = elementCnt;
4815 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4817 schReqList->list.array = NULLP;
4818 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4819 if(!schReqList->list.array)
4821 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4825 for(idx=0;idx<schReqList->list.count; idx++)
4827 schReqList->list.array[idx] = NULLP;
4828 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4829 if(!schReqList->list.array[idx])
4831 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4837 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4839 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4840 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4841 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4843 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4846 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4847 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4848 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4852 /*******************************************************************
4854 * @brief Builds Mac cell group config
4858 * Function : BuildMacCellGrpCfg
4860 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4862 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4864 * @return ROK - success
4867 * ****************************************************************/
4868 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4870 macCellGrpCfg->drx_Config = NULLP;
4871 macCellGrpCfg->schedulingRequestConfig = NULLP;
4872 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4873 if(!macCellGrpCfg->schedulingRequestConfig)
4875 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4879 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4881 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4885 macCellGrpCfg->bsr_Config = NULLP;
4886 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4887 if(!macCellGrpCfg->bsr_Config)
4889 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4893 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4895 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4899 macCellGrpCfg->tag_Config = NULLP;
4900 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4901 if(!macCellGrpCfg->tag_Config)
4903 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4907 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4909 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4913 macCellGrpCfg->phr_Config = NULLP;
4914 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4915 if(!macCellGrpCfg->phr_Config)
4917 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4921 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4923 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4927 macCellGrpCfg->skipUplinkTxDynamic = false;
4928 macCellGrpCfg->ext1 = NULLP;
4932 /*******************************************************************
4934 * @brief Frees memeory allocated for SearchSpcToAddModList
4938 * Function : FreeSearchSpcToAddModList
4940 * Functionality: Deallocating memory of SearchSpcToAddModList
4942 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4946 4221 * ****************************************************************/
4947 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4951 struct SearchSpace *searchSpc=NULLP;
4953 if(searchSpcList->list.array)
4955 if(searchSpcList->list.array[idx2])
4957 searchSpc = searchSpcList->list.array[idx2];
4958 if(searchSpc->controlResourceSetId)
4960 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4962 if(searchSpc->monitoringSymbolsWithinSlot)
4964 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4966 if(searchSpc->nrofCandidates)
4968 if(searchSpc->searchSpaceType)
4970 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4971 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4972 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4973 SearchSpace__searchSpaceType));
4975 CU_FREE(searchSpc->nrofCandidates,
4976 sizeof(struct SearchSpace__nrofCandidates));
4978 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4979 searchSpc->monitoringSymbolsWithinSlot->size);
4981 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4982 sizeof(BIT_STRING_t));
4984 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4985 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4987 CU_FREE(searchSpc->controlResourceSetId,
4988 sizeof(ControlResourceSetId_t));
4991 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4993 CU_FREE(searchSpcList->list.array[idx1],
4994 sizeof(struct SearchSpace));
4996 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4999 /*******************************************************************
5001 * @brief Frees memory allocated for PdschTimeDomAllocList
5005 * Function : FreePdschTimeDomAllocList
5007 * Functionality: Deallocating memory of PdschTimeDomAllocList
5009 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5013 4221 * ****************************************************************/
5014 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5018 if(timeDomAllocList->choice.setup)
5020 if(timeDomAllocList->choice.setup->list.array)
5022 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5024 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5025 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5027 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5028 timeDomAllocList->choice.setup->list.size);
5030 CU_FREE(timeDomAllocList->choice.setup,\
5031 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5034 /*******************************************************************
5036 * @brief Frees memory allocated for PuschTimeDomAllocList
5040 * Function : FreePuschTimeDomAllocList
5042 * Functionality: Deallocating memory of PuschTimeDomAllocList
5044 * @params[in] PUSCH_Config_t *puschCfg
5048 ***********************************************************************/
5049 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5053 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5055 if(puschCfg->pusch_TimeDomainAllocationList)
5057 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5058 if(timeDomAllocList_t->choice.setup)
5060 if(timeDomAllocList_t->choice.setup->list.array)
5062 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5063 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5065 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5066 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5068 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5069 timeDomAllocList_t->choice.setup->list.size);
5071 CU_FREE(timeDomAllocList_t->choice.setup, \
5072 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5074 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5075 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5076 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5081 /*******************************************************************
5083 * @brief Frees memory allocated for Dedicated PUCCH config
5087 * Function : FreeBWPUlDedPucchCfg
5089 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5091 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5095 * ****************************************************************/
5096 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5098 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5099 PUCCH_Config_t *pucchCfg = NULLP;
5100 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5101 PUCCH_Resource_t *rsrc = NULLP;
5105 if(ulBwpPucchCfg->choice.setup)
5107 pucchCfg = ulBwpPucchCfg->choice.setup;
5109 //Free resource set list
5110 if(pucchCfg->resourceSetToAddModList)
5112 if(pucchCfg->resourceSetToAddModList->list.array)
5114 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5116 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5117 if(rsrcSet->resourceList.list.array)
5119 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5121 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5123 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5125 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5127 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5129 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5132 //Free resource list
5133 if(pucchCfg->resourceToAddModList)
5135 if(pucchCfg->resourceToAddModList->list.array)
5137 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5139 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5140 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5141 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5143 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5145 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5149 if(pucchCfg->format1)
5151 if(pucchCfg->format1->choice.setup)
5153 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5154 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5156 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5160 if(pucchCfg->dl_DataToUL_ACK)
5162 if(pucchCfg->dl_DataToUL_ACK->list.array)
5164 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5166 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5168 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5170 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5173 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5175 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5179 /*******************************************************************
5181 * @brief Frees memory allocated for InitialUlBWP
5185 * Function : FreeInitialUlBWP
5187 * Functionality: Deallocating memory of InitialUlBWP
5189 * @params[in] BWP_UplinkDedicated_t *ulBwp
5193 * ****************************************************************/
5194 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5196 uint8_t rSetIdx, rsrcIdx;
5197 SRS_Config_t *srsCfg = NULLP;
5198 PUSCH_Config_t *puschCfg = NULLP;
5199 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5200 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5201 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5202 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5204 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5206 if(ulBwp->pusch_Config)
5208 if(ulBwp->pusch_Config->choice.setup)
5210 puschCfg=ulBwp->pusch_Config->choice.setup;
5211 if(puschCfg->dataScramblingIdentityPUSCH)
5213 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5215 FreePuschTimeDomAllocList(puschCfg);
5216 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5217 if(dmrsUlCfg->choice.setup)
5219 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5221 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5223 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5225 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5226 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5228 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5231 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5233 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5234 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5236 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5238 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5240 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5242 /* Free SRS-Config */
5243 if(ulBwp->srs_Config)
5245 if(ulBwp->srs_Config->choice.setup)
5247 srsCfg = ulBwp->srs_Config->choice.setup;
5249 /* Free Resource Set to add/mod list */
5250 if(srsCfg->srs_ResourceSetToAddModList)
5252 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5253 if(rsrcSetList->list.array)
5257 /* Free SRS resource Id list in this SRS resource set */
5258 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5260 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5262 if(rsrcIdList->list.array)
5264 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5266 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5268 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5270 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5271 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5274 /* Free resource type info for this SRS resource set */
5275 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5276 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5278 /* Free memory for each resource set */
5279 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5281 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5283 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5285 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5286 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5289 /* Free resource to add/modd list */
5290 if(srsCfg->srs_ResourceToAddModList)
5292 resourceList = srsCfg->srs_ResourceToAddModList;
5293 if(resourceList->list.array)
5296 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5297 sizeof(struct SRS_Resource__transmissionComb__n2));
5298 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5299 sizeof(struct SRS_Resource__resourceType__aperiodic));
5301 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5303 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5305 CU_FREE(resourceList->list.array, resourceList->list.size);
5307 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5308 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5311 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5313 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5317 /*******************************************************************
5319 * @brief Frees memory allocated for initialUplinkBWP
5323 * Function : FreeinitialUplinkBWP
5325 * Functionality: Deallocating memory of initialUplinkBWP
5327 * @params[in] UplinkConfig_t *ulCfg
5332 * ****************************************************************/
5333 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5335 BWP_UplinkDedicated_t *ulBwp=NULLP;
5336 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5338 if(ulCfg->initialUplinkBWP)
5340 ulBwp=ulCfg->initialUplinkBWP;
5341 if(ulCfg->firstActiveUplinkBWP_Id)
5343 if(ulCfg->pusch_ServingCellConfig)
5345 puschCfg=ulCfg->pusch_ServingCellConfig;
5346 if(puschCfg->choice.setup)
5348 if(puschCfg->choice.setup->ext1)
5350 CU_FREE(puschCfg->choice.setup->ext1->\
5351 processingType2Enabled,sizeof(BOOLEAN_t));
5352 CU_FREE(puschCfg->choice.setup->ext1->\
5353 maxMIMO_Layers,sizeof(long));
5354 CU_FREE(puschCfg->choice.setup->ext1, \
5355 sizeof(struct PUSCH_ServingCellConfig__ext1));
5357 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5359 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5361 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5363 FreeInitialUlBWP(ulBwp);
5364 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5367 /*******************************************************************
5369 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5373 * Function : FreeBWPDlDedPdschCfg
5375 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5377 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5382 * ****************************************************************/
5383 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5385 struct PDSCH_Config *pdschCfg=NULLP;
5386 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5387 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5388 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5390 if(dlBwp->pdsch_Config->choice.setup)
5392 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5393 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5395 if(pdschCfg->pdsch_TimeDomainAllocationList)
5397 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5398 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5400 prbBndlType=&pdschCfg->prb_BundlingType;
5401 CU_FREE(prbBndlType->choice.staticBundling,\
5402 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5403 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5405 FreePdschTimeDomAllocList(timeDomAllocList);
5406 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5407 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5409 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5410 if(dmrsDlCfg->choice.setup)
5412 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5414 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5416 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5417 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5419 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5422 /*******************************************************************
5424 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5428 * Function : FreeBWPDlDedPdcchCfg
5430 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5432 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5437 * ****************************************************************/
5438 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5442 struct PDCCH_Config *pdcchCfg=NULLP;
5443 struct ControlResourceSet *controlRSet=NULLP;
5444 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5446 if(dlBwp->pdcch_Config->choice.setup)
5448 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5449 if(pdcchCfg->controlResourceSetToAddModList)
5451 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5452 if(controlRSetList->list.array)
5454 controlRSet = controlRSetList->list.array[idx2];
5457 if(controlRSet->frequencyDomainResources.buf)
5459 if(controlRSet->pdcch_DMRS_ScramblingID)
5461 if(pdcchCfg->searchSpacesToAddModList)
5463 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5464 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5465 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5467 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5469 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5470 controlRSet->frequencyDomainResources.size);
5473 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5475 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5477 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5479 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5480 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5482 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5485 /*******************************************************************
5487 * @brief Builds RLC Config
5491 * Function : BuildRlcConfig
5493 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5495 * @params[in] RLC_Config *rlcConfig
5497 * @return ROK - success
5500 * ****************************************************************/
5501 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5504 rlcConfig->present = RLC_Config_PR_am;
5506 rlcConfig->choice.am = NULLP;
5507 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5508 if(!rlcConfig->choice.am)
5510 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5515 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5516 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5517 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5519 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5522 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5523 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5524 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5525 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5526 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5529 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5530 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5531 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5533 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5536 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5537 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5538 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5543 /*******************************************************************
5545 * @brief Builds MAC LC Config
5549 * Function : BuildMacLCConfig
5551 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5553 * @params[in] struct LogicalChannelConfig macLcConfig
5555 * @return ROK - success
5558 * ****************************************************************/
5559 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5562 macLcConfig->ul_SpecificParameters = NULLP;
5563 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5564 if(!macLcConfig->ul_SpecificParameters)
5566 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5570 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5571 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5572 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5573 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5574 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5575 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5576 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5578 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5579 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5580 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5582 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5585 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5587 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5588 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5589 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5591 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5594 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5596 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5597 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5598 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5602 /*******************************************************************
5604 * @brief Builds RLC Bearer to Add/Mod list
5608 * Function :BuildRlcBearerToAddModList
5610 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5612 * @params[in] rlc_BearerToAddModList
5614 * @return ROK - success
5617 * ****************************************************************/
5618 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5620 uint8_t idx, elementCnt;
5623 rlcBearerList->list.count = elementCnt;
5624 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5626 rlcBearerList->list.array = NULLP;
5627 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5628 if(!rlcBearerList->list.array)
5630 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5634 for(idx=0; idx<rlcBearerList->list.count; idx++)
5636 rlcBearerList->list.array[idx] = NULLP;
5637 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5638 if(!rlcBearerList->list.array[idx])
5640 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5646 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5648 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5649 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5651 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5655 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5656 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5658 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5659 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5660 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5661 if(!rlcBearerList->list.array[idx]->rlc_Config)
5663 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5667 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5669 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5673 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5674 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5675 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5677 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5681 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5683 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5690 /*******************************************************************
5692 * @brief Free memory allocated for CellGroupConfig
5696 * Function : FreeMemCellGrpCfg
5698 * Functionality: Deallocating memory of CellGroupConfig
5700 * @params[in] pointer to CellGroupConfigRrc_t
5702 * @return ROK - success
5705 ******************************************************************/
5706 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5709 SpCellConfig_t *spCellCfg=NULLP;
5710 ServingCellConfig_t *srvCellCfg=NULLP;
5711 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5712 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5713 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5714 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5715 struct RLC_Config *rlcConfig=NULLP;
5716 struct LogicalChannelConfig *macLcConfig=NULLP;
5717 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5718 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5719 struct TAG_Config *tagConfig=NULLP;
5720 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5721 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5722 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5724 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5727 if(rlcBearerList->list.array)
5729 for(idx=0; idx<rlcBearerList->list.count; idx++)
5731 if(rlcBearerList->list.array[idx])
5733 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5734 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5737 if(rlcConfig->choice.am)
5739 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5740 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5741 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5743 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5745 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5748 if(macLcConfig->ul_SpecificParameters)
5750 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5751 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5752 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5754 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5756 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5759 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5761 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5764 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5767 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5768 if(schedulingRequestConfig)
5770 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5773 if(schReqList->list.array)
5775 for(idx=0;idx<schReqList->list.count; idx++)
5777 if(schReqList->list.array[idx])
5779 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5780 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5783 CU_FREE(schReqList->list.array, schReqList->list.size);
5785 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5786 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5787 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5789 if(macCellGrpCfg->bsr_Config)
5791 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5793 tagConfig = macCellGrpCfg->tag_Config;
5796 tagList = tagConfig->tag_ToAddModList;
5799 if(tagList->list.array)
5801 for(idx=0; idx<tagList->list.count; idx++)
5803 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5805 CU_FREE(tagList->list.array, tagList->list.size);
5807 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5809 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5812 phrConfig = macCellGrpCfg->phr_Config;
5815 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5816 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5819 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5822 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5825 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5826 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5829 spCellCfg = cellGrpCfg->spCellConfig;
5832 if(spCellCfg->servCellIndex)
5834 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5836 if(spCellCfg->spCellConfigDedicated)
5838 srvCellCfg = spCellCfg->spCellConfigDedicated;
5839 if(srvCellCfg->initialDownlinkBWP)
5841 dlBwp = srvCellCfg->initialDownlinkBWP;
5842 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5844 if(srvCellCfg->defaultDownlinkBWP_Id)
5846 if(srvCellCfg->uplinkConfig)
5848 if(srvCellCfg->pdsch_ServingCellConfig)
5850 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5851 if(pdschCfg->choice.setup)
5853 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5854 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5856 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5857 ServingCellConfig__pdsch_ServingCellConfig));
5859 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5860 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5862 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5864 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5866 if(dlBwp->pdcch_Config)
5868 if(dlBwp->pdsch_Config)
5870 FreeBWPDlDedPdschCfg(dlBwp);
5871 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5873 FreeBWPDlDedPdcchCfg(dlBwp);
5874 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5876 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5878 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5880 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5882 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5884 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5889 /*******************************************************************
5891 * @brief Fills CellGroupConfig
5895 * Function : fillCellGrpCfg
5897 * Functionality: Fills CellGroupConfig
5899 * @params[in] pointer to CellGroupConfigRrc_t
5901 * @return ROK - success
5904 ******************************************************************/
5906 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5908 uint8_t ret = RFAILED;
5909 CellGroupConfigRrc_t cellGrpCfg;
5910 asn_enc_rval_t encRetVal;
5914 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5916 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5917 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5918 if(!cellGrpCfg.rlc_BearerToAddModList)
5920 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5923 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5925 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5929 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5930 cellGrpCfg.mac_CellGroupConfig = NULLP;
5931 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5932 if(!cellGrpCfg.mac_CellGroupConfig)
5934 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5937 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5939 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5944 cellGrpCfg.physicalCellGroupConfig = NULLP;
5945 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5946 if(!cellGrpCfg.physicalCellGroupConfig)
5948 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5951 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5953 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5957 cellGrpCfg.spCellConfig = NULLP;
5958 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5959 if(!cellGrpCfg.spCellConfig)
5961 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5964 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5966 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5970 cellGrpCfg.sCellToAddModList = NULLP;
5971 cellGrpCfg.sCellToReleaseList = NULLP;
5972 cellGrpCfg.ext1 = NULLP;
5974 /* encode cellGrpCfg into duToCuRrcContainer */
5975 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5976 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5978 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5979 /* Encode results */
5980 if(encRetVal.encoded == ENCODE_FAIL)
5982 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5983 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5988 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5989 for(int i=0; i< encBufSize; i++)
5991 DU_LOG("%x",encBuf[i]);
5995 cellGrp->size = encBufSize;
5996 CU_ALLOC(cellGrp->buf, cellGrp->size);
5999 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6002 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6006 FreeMemCellGrpCfg(&cellGrpCfg);
6010 /*******************************************************************
6012 * @brief Free UE Capability RAT container
6016 * Function : freeUeCapRatCont
6019 * Free UE Capability RAT conatiner
6022 * @return ROK - success
6025 * ****************************************************************/
6026 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6029 FeatureSets_t *featureSets;
6031 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6033 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6035 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6036 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6038 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6041 if(ueNrCap->featureSets)
6043 featureSets = ueNrCap->featureSets;
6044 if(featureSets->featureSetsDownlinkPerCC)
6046 if(featureSets->featureSetsDownlinkPerCC->list.array)
6048 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6050 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6051 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6052 sizeof(ModulationOrder_t));
6053 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6055 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6057 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6060 if(featureSets->featureSetsUplinkPerCC)
6062 if(featureSets->featureSetsUplinkPerCC->list.array)
6064 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6066 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6068 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6069 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6070 sizeof(ModulationOrder_t));
6071 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6074 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6076 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6078 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6082 /*******************************************************************
6084 * @brief Free UE capability RAT container list
6088 * Function : freeUeCapRatContList
6090 * Functionality: Free UE capability RAT container list
6093 * @return ROK - success
6096 * ****************************************************************/
6097 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6100 if(ueCapablityList->list.array)
6102 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6104 if(ueCapablityList->list.array[idx])
6105 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6107 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6111 /*******************************************************************
6113 * @brief Fill feature sets
6117 * Function : fillFeatureSets
6119 * Functionality: Fill feature sets
6122 * @return ROK - success
6125 * ****************************************************************/
6126 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6128 uint8_t idx, elementCnt;
6130 featureSets->featureSetsDownlink = NULLP;
6131 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6132 if(!featureSets->featureSetsDownlinkPerCC)
6134 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6139 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6140 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6141 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6142 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6148 for(idx = 0; idx < elementCnt; idx++)
6150 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6151 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6153 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6159 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6160 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6161 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6162 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6163 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6165 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6166 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6168 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6171 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6173 featureSets->featureSetsUplink = NULLP;
6174 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6175 if(!featureSets->featureSetsUplinkPerCC)
6177 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6182 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6183 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6184 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6185 if(!featureSets->featureSetsUplinkPerCC->list.array)
6187 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6191 for(idx = 0; idx < elementCnt; idx++)
6193 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6194 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6196 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6202 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6203 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6204 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6205 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6206 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6207 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6209 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6210 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6212 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6215 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6220 /*******************************************************************
6222 * @brief Fill UE capability RAT container
6226 * Function : fillUeCapRatCont
6228 * Functionality: Fill UE capability RAT container
6230 * @params[in] UE Capability RAT container buffer
6231 * @return ROK - success
6234 * ****************************************************************/
6235 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6238 uint8_t idx, elementCnt;
6239 asn_enc_rval_t encRetVal;
6240 UE_NR_Capability_t ueNrCap;
6244 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6246 /* Filling PDCP parameters */
6247 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6248 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6249 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6250 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6251 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6252 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6253 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6254 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6255 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6256 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6257 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6258 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6259 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6260 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6261 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6262 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6263 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6265 ueNrCap.rlc_Parameters = NULLP;
6266 ueNrCap.mac_Parameters = NULLP;
6268 /* Filling PHY parameters */
6269 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6270 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6271 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6272 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6273 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6275 /* Filling RF parameters */
6277 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6278 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6279 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6280 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6282 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6287 for(idx = 0; idx < elementCnt; idx++)
6289 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6290 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6300 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6301 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6302 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6304 ueNrCap.measAndMobParameters = NULLP;
6305 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6306 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6307 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6308 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6309 ueNrCap.featureSets = NULLP;
6311 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6312 if(!ueNrCap.featureSets)
6314 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6319 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6321 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6326 ueNrCap.featureSetCombinations = NULLP;
6327 ueNrCap.lateNonCriticalExtension = NULLP;
6328 ueNrCap.nonCriticalExtension = NULLP;
6330 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6331 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6332 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6334 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6336 /* Encode results */
6337 if(encRetVal.encoded == ENCODE_FAIL)
6339 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6340 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6345 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6346 for(int i=0; i< encBufSize; i++)
6348 DU_LOG("%x",encBuf[i]);
6352 ueCapRatContBuf->size = encBufSize;
6353 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6354 if(!ueCapRatContBuf->buf)
6356 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6359 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6363 freeUeCapRatCont(&ueNrCap);
6367 /*******************************************************************
6369 * @brief Fill UE Capability RAT container list
6373 * Function : fillUeCapRatContList
6375 * Functionality: Fill UE Capability RAT container list
6378 * @params[in] UE capability RAT container list buffer
6379 * @return ROK - success
6382 * ****************************************************************/
6383 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6385 uint8_t ret = RFAILED;
6386 uint8_t idx, elementCnt;
6387 asn_enc_rval_t encRetVal;
6388 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6393 ueCapablityList.list.count = elementCnt;
6394 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6396 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6397 if(!ueCapablityList.list.array)
6399 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6404 for(idx=0; idx<elementCnt; idx++)
6406 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6407 if(ueCapablityList.list.array[idx] == NULLP)
6409 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6415 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6416 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6418 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6419 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6420 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6422 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6423 &ueCapablityList, PrepFinalEncBuf, encBuf);
6425 /* Encode results */
6426 if(encRetVal.encoded == ENCODE_FAIL)
6428 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6429 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6434 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6435 for(int i=0; i< encBufSize; i++)
6437 DU_LOG("%x",encBuf[i]);
6441 ueCapablityListBuf->size = encBufSize;
6442 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6443 if(!ueCapablityListBuf->buf)
6445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6448 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6452 freeUeCapRatContList(&ueCapablityList);
6456 /*******************************************************************
6458 * @brief Fills CuToDuContainer
6462 * Function : fillCuToDuContainer
6464 * Functionality: Fills CuToDuContainer
6466 * @params[in] pointer to CUtoDURRCInformation_t
6468 * @return ROK - success
6471 ******************************************************************/
6473 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6475 uint8_t elementCnt = 0;
6477 uint8_t idx, idx2, rrcBufLen;
6479 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6480 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6482 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6485 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6487 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6488 if(rrcMsg->iE_Extensions)
6491 rrcMsg->iE_Extensions->list.count = elementCnt;
6492 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6494 /* Initialize the CUtoDURRCInformation_ExtIEs */
6495 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6497 if(rrcMsg->iE_Extensions->list.array == NULLP)
6499 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6503 for(idx=0; idx<elementCnt; idx++)
6505 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6506 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6512 /* Filling CellGroupConfig_t IE */
6513 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6514 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6515 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6516 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6517 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6522 /*******************************************************************
6524 * @brief Free CuToDuContainer
6528 * Function : FreeCuToDuInfo
6530 * Functionality: Free CuToDuContainer
6532 * @params[in] pointer to CUtoDURRCInformation_t
6534 * @return ROK - success
6537 ******************************************************************/
6539 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6543 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6545 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6546 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6547 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6549 if(rrcMsg->iE_Extensions)
6551 if(rrcMsg->iE_Extensions->list.array)
6553 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6555 if(rrcMsg->iE_Extensions->list.array[idx])
6557 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6559 case ProtocolIE_ID_id_CellGroupConfig:
6560 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6562 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6563 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6568 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6569 rrcMsg->iE_Extensions->list.array[idx]->id);
6575 for(idx2 = 0; idx2 < idx; idx2++)
6577 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6579 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6583 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6586 /*******************************************************************
6588 * @brief Builds and sends the UE Setup Request
6592 * Function : BuildAndSendUeContextSetupReq
6594 * Functionality: Constructs the UE Setup Request and sends
6595 * it to the CU through SCTP.
6599 * @return ROK - success
6602 * ****************************************************************/
6603 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6604 uint16_t rrcContLen, uint8_t *rrcContainer)
6607 uint8_t SplCellListret;
6608 uint8_t SrbSetupret;
6610 uint8_t idx, bufLen;
6612 F1AP_PDU_t *f1apMsg = NULLP;
6613 UEContextSetupRequest_t *ueSetReq = NULLP;
6614 asn_enc_rval_t encRetVal; /* Encoder return value */
6615 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6616 uint8_t ret= RFAILED;
6620 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6622 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6623 if(f1apMsg == NULLP)
6625 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6629 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6630 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6631 if(f1apMsg->choice.initiatingMessage == NULLP)
6633 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6637 f1apMsg->choice.initiatingMessage->procedureCode = \
6638 ProcedureCode_id_UEContextSetup;
6639 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6640 f1apMsg->choice.initiatingMessage->value.present = \
6641 InitiatingMessage__value_PR_UEContextSetupRequest;
6643 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6646 ueSetReq->protocolIEs.list.count = elementCnt;
6647 ueSetReq->protocolIEs.list.size = \
6648 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6650 /* Initialize the UESetup members */
6651 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6653 if(ueSetReq->protocolIEs.list.array == NULLP)
6655 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6659 for(idx1=0; idx1<elementCnt; idx1++)
6661 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6662 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6670 /*GNB CU UE F1AP ID*/
6671 ueSetReq->protocolIEs.list.array[idx]->id = \
6672 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6673 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6674 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6675 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6676 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6678 /*GNB DU UE F1AP ID*/
6680 ueSetReq->protocolIEs.list.array[idx]->id = \
6681 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6682 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6683 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6684 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6685 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6689 ueSetReq->protocolIEs.list.array[idx]->id = \
6690 ProtocolIE_ID_id_SpCell_ID;
6691 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6692 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6693 UEContextSetupRequestIEs__value_PR_NRCGI;
6694 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6700 /*Served Cell Index*/
6702 ueSetReq->protocolIEs.list.array[idx]->id = \
6703 ProtocolIE_ID_id_ServCellIndex;
6704 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6705 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6706 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6707 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6710 /*CellULConfigured*/
6712 ueSetReq->protocolIEs.list.array[idx]->id = \
6713 ProtocolIE_ID_id_SpCellULConfigured;
6714 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6715 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6716 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6717 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6718 CellULConfigured_none;
6720 /*CUtoDURRCContainer*/
6722 ueSetReq->protocolIEs.list.array[idx]->id = \
6723 ProtocolIE_ID_id_CUtoDURRCInformation;
6724 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6725 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6726 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6727 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6732 /*Special Cells to be SetupList*/
6734 ueSetReq->protocolIEs.list.array[idx]->id = \
6735 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6736 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6737 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6738 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6739 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6740 if(SplCellListret != ROK)
6744 /*SRBs To Be Setup List*/
6746 ueSetReq->protocolIEs.list.array[idx]->id = \
6747 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6748 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6749 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6750 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6751 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6752 if(SrbSetupret != ROK)
6756 /*DRBs to Be Setup List*/
6758 ueSetReq->protocolIEs.list.array[idx]->id = \
6759 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6760 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6761 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6762 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6763 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6768 /* RRC Container for security mode */
6770 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6771 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6772 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6773 UEContextSetupRequestIEs__value_PR_RRCContainer;
6774 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6776 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6777 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6778 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6779 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6781 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6784 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6785 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6787 /* RRC delivery status request */
6789 ueSetReq->protocolIEs.list.array[idx]->id = \
6790 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6791 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6792 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6793 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6794 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6795 RRCDeliveryStatusRequest_true;
6797 /* Bit Rate hardcoded as in reference logs */
6799 ueSetReq->protocolIEs.list.array[idx]->id = \
6800 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6801 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6802 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6803 UEContextSetupRequestIEs__value_PR_BitRate;
6804 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6806 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6807 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6808 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6809 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6811 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6814 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6815 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6817 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6819 /* Encode the F1SetupRequest type as APER */
6820 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6822 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6824 /* Encode results */
6825 if(encRetVal.encoded == ENCODE_FAIL)
6827 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6828 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6833 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6834 for(int i=0; i< encBufSize; i++)
6836 DU_LOG("%x",encBuf[i]);
6841 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6843 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6849 FreeUeContextSetupReq(f1apMsg);
6852 }/* End of BuildAndSendUeContextSetupReq*/
6854 /**********************************************************************
6855 * @brief Function to extractTeId received in UE context setup Response
6859 * Function : extractTeId
6862 * - Function to extract TeId
6865 * @return ROK - success
6868 **********************************************************************/
6869 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6873 GTPTunnel_t *gtpDl = NULLP;
6875 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6877 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6879 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6881 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6882 if(gtpDl->gTP_TEID.size > 0)
6884 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6887 DU_LOG("\nERROR --> EGTP: No TeId received");
6895 /****************************************************************
6896 * @brief Function to add Drb tunnels
6900 * Function : addDrbTunnels
6903 * - Function to add Drb tunnels
6906 * @return ROK - success
6909 * ****************************************************************/
6910 uint8_t addDrbTunnels(uint8_t teId)
6915 if(teId > MAX_TEID || teId < MIN_TEID)
6917 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6919 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6920 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6921 tnlEvt.lclTeid = teId;
6922 tnlEvt.remTeid = teId;
6923 ret = cuEgtpTnlMgmtReq(tnlEvt);
6926 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6931 /****************************************************************
6932 * @brief Function to process Drb Setup List
6936 * Function : procDrbSetupList
6939 * - Function to process DRB Setup List
6942 * @return ROK - success
6945 * ****************************************************************/
6946 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
6950 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
6952 if(drbSetupList != NULLP)
6954 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
6956 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
6957 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
6959 /* extracting teId */
6960 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
6963 if(addDrbTunnels(teId)== ROK)
6965 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
6976 /****************************************************************
6977 * @brief Function to process Ue Context Setup Response
6981 * Function : procUeContextSetupResponse
6984 * - Function to process Ue Context Setup Response
6987 * @return ROK - success
6990 * ****************************************************************/
6991 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6993 uint8_t idx, duUeF1apId;
6994 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
6995 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
6997 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
6999 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
7001 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7003 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7006 case ProtocolIE_ID_id_DRBs_Setup_List:
7008 /* Adding Tunnels for successful DRB */
7009 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
7015 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7019 /****************************************************************
7020 * @brief Function to process Ul Rrc Msg received from DU
7024 * Function : procUlRrcMsg
7027 * - Function to process Ul Rrc Msg received from DU
7030 * @return ROK - success
7033 * ****************************************************************/
7035 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
7037 uint8_t idx, ret, srbId, rrcMsgType;
7038 uint8_t cuUeF1apId, duUeF1apId;
7039 uint8_t *rrcContainer = NULLP;
7040 uint16_t rrcContLen;
7041 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
7044 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
7046 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
7048 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
7050 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7052 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
7055 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7057 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7060 case ProtocolIE_ID_id_SRBID:
7061 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
7063 case ProtocolIE_ID_id_RRCContainer:
7065 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
7066 CU_ALLOC(rrcContainer, rrcContLen)
7069 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
7072 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
7078 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
7084 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7085 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7086 if(rrcMsgType == REGISTRATION_ACCEPT)
7088 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
7089 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7091 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
7093 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
7094 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
7095 rrcContLen, rrcContainer);
7097 if(rrcMsgType == SECURITY_MODE_COMPLETE)
7099 /* To trigger the DL RRC Msg for RRC Reconfig */
7100 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7101 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7102 if(rrcMsgType == RRC_RECONFIG)
7104 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
7105 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7108 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
7110 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
7111 BuildAndSendUeContextModificationReq(duUeF1apId);
7117 /****************************************************************
7118 * @brief Build And Send F1ResetAck
7122 * Function : FreeF1ResetAck
7125 * - Build And Send F1ResetRSP
7128 * @return ROK - success
7131 * ****************************************************************/
7132 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7135 ResetAcknowledge_t *f1ResetAck;
7139 if(f1apMsg->choice.successfulOutcome)
7141 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7143 if(f1ResetAck->protocolIEs.list.array)
7145 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7147 if(f1ResetAck->protocolIEs.list.array[idx])
7149 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7152 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7154 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7156 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7160 /****************************************************************
7161 * @brief Build And Send F1ResetAck
7165 * Function : BuildAndSendF1ResetAck
7168 * - Build And Send F1ResetRSP
7171 * @return ROK - success
7174 * ****************************************************************/
7176 uint8_t BuildAndSendF1ResetAck()
7179 uint8_t elementCnt = 0;
7180 uint8_t ret = RFAILED;
7181 F1AP_PDU_t *f1apMsg = NULL;
7182 ResetAcknowledge_t *f1ResetAck = NULLP;
7183 asn_enc_rval_t encRetVal;
7184 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
7187 /* Allocate the memory for F1ResetRequest_t */
7188 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7189 if(f1apMsg == NULLP)
7191 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7195 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7197 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7198 if(f1apMsg->choice.successfulOutcome == NULLP)
7200 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7204 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
7205 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7206 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7207 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7211 f1ResetAck->protocolIEs.list.count = elementCnt;
7212 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7214 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7215 if(f1ResetAck->protocolIEs.list.array == NULLP)
7217 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
7221 for(idx=0; idx<elementCnt; idx++)
7223 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7224 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7231 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7232 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7233 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7234 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7236 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7238 /* Encode the F1SetupRequest type as UPER */
7239 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7241 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7243 /* Check encode results */
7244 if(encRetVal.encoded == ENCODE_FAIL)
7246 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
7247 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7252 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
7253 for(int i=0; i< encBufSize; i++)
7255 DU_LOG("%x",encBuf[i]);
7259 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7261 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7269 FreeF1ResetAck(f1apMsg);
7272 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7276 if(ulInfo->list.array)
7278 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7280 if(ulInfo->list.array[arrIdx])
7282 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7284 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7286 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7288 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7289 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7290 gTPTunnel->gTP_TEID.size);
7292 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7293 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7294 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7296 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7297 sizeof(GTPTunnel_t));
7299 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7302 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7306 /*******************************************************************
7308 * @brief Deletes the EGTP tunnel
7312 * Function : deleteEgtpTunnel
7314 * Functionality: Deletes the EGTP tunnel
7316 * @params[in] uint8_t *buf
7318 * @return ROK - success
7321 * ****************************************************************/
7322 uint8_t deleteEgtpTunnel(uint8_t *buf)
7327 teIdStringToInt(buf, &teId);
7328 if(teId > MAX_TEID || teId < MIN_TEID)
7330 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7333 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7334 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7335 tnlEvt.lclTeid = teId;
7336 tnlEvt.remTeid = teId;
7337 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7339 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7344 /*******************************************************************
7346 * @brief Builds the Uplink Tunnel Info
7350 * Function : BuildUlTnlInfoforSetupMod
7352 * Functionality: Constructs the UL TnlInfo For DRB list
7354 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7356 * @return ROK - success
7359 * ****************************************************************/
7360 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7366 ulInfo->list.count = ulCnt;
7367 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7368 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7369 if(ulInfo->list.array == NULLP)
7371 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7374 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7376 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7377 if(ulInfo->list.array[arrIdx] == NULLP)
7379 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7385 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7386 UPTransportLayerInformation_PR_gTPTunnel;
7389 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7390 sizeof(GTPTunnel_t));
7391 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7396 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7397 transportLayerAddress.size = 4*sizeof(uint8_t);
7398 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7399 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7400 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7401 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7402 transportLayerAddress.buf == NULLP)
7404 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7408 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7409 transportLayerAddress.buf[0] = 192;
7410 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7411 transportLayerAddress.buf[1] = 168;
7412 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7413 transportLayerAddress.buf[2] = 130;
7414 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7415 transportLayerAddress.buf[3] = 82;
7416 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7417 transportLayerAddress.bits_unused = 0;
7420 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7421 = 4 * sizeof(uint8_t);
7422 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7423 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7424 gTPTunnel->gTP_TEID.size);
7425 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7428 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7431 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7432 gTP_TEID.buf[0] = 0;
7433 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7434 gTP_TEID.buf[1] = 0;
7435 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7436 gTP_TEID.buf[2] = 0;
7437 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7439 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7440 * fetched based on the Drb Id */
7443 /* Tunnel Id for DRB 2 of UE 1 is 2. Hence passing the same TeId */
7444 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 2;
7448 /* Tunnel Id for DRB 2 of UE 2 is 5. Hence passing the same TeId */
7449 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 5;
7453 /* Tunnel Id for DRB 2 of UE 3 is 8. Hence passing the same TeId */
7454 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 8;
7460 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7461 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
7464 }/*End of BuildULTnlInfo*/
7466 /*******************************************************************
7468 * @brief freeing the DRB item
7472 * Function : FreeDrbItem
7474 * Functionality: freeing the DRB item
7476 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7478 * @return ROK - success
7481 * ****************************************************************/
7483 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7486 SNSSAI_t *snssai =NULLP;
7487 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7489 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7490 switch(drbItem->qoSInformation.present)
7492 case QoSInformation_PR_NOTHING:
7494 case QoSInformation_PR_eUTRANQoS:
7496 if(drbItem->qoSInformation.choice.eUTRANQoS)
7498 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7502 case QoSInformation_PR_choice_extension:
7504 if(drbItem->qoSInformation.choice.choice_extension)
7506 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7508 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7511 CU_FREE(snssai->sST.buf,snssai->sST.size);
7517 CU_FREE(snssai->sD->buf,snssai->sD->size);
7519 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7522 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7523 if(flowMap->list.array)
7525 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7527 if(flowMap->list.array[arrIdx] )
7529 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7530 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7533 CU_FREE(flowMap->list.array,flowMap->list.size);
7536 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7542 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7543 if(drbItem->uLConfiguration)
7545 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7549 /*******************************************************************
7551 * @brief filling the DRB setup Mod item
7555 * Function : FillDrbItemToSetupMod
7557 * Functionality: filling the DRB setup Mod item
7560 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7562 * @return ROK - success
7565 * ****************************************************************/
7567 uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7572 drbItem->dRBID = arrIdx + DRB3;
7575 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7577 switch(drbItem->qoSInformation.present)
7579 case QoSInformation_PR_NOTHING:
7583 case QoSInformation_PR_eUTRANQoS:
7586 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7587 if(drbItem->qoSInformation.choice.eUTRANQoS)
7589 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7592 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7593 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7594 PriorityLevel_no_priority;
7596 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7597 Pre_emptionCapability_may_trigger_pre_emption;
7599 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7600 Pre_emptionVulnerability_pre_emptable;
7604 case QoSInformation_PR_choice_extension:
7606 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7607 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7609 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7613 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7614 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7615 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7616 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7617 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
7620 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7625 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7626 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[1]);
7629 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7633 /*Flows mapped to DRB List*/
7634 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7635 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7636 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7639 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7645 /*ULUPTNLInformation To Be Setup List*/
7646 ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
7647 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7650 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7655 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7659 /*******************************************************************
7661 * @brief Builds the DRB to be Setup Mod ItemIes
7665 * Function : FillDrbItemList
7667 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7669 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7671 * @return ROK - success
7674 * ****************************************************************/
7676 uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7678 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7679 drbItemIe->criticality = Criticality_reject;
7680 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7682 if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7684 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7689 /*******************************************************************
7691 * @brief free the DRB to be Setup Mod list
7695 * Function : FreeDrbToBeSetupModList
7697 * Functionality: free the DRB to be Setup Mod list
7699 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7701 * @return ROK - success
7704 * ****************************************************************/
7705 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7708 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7710 if(drbSet->list.array)
7712 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7714 if(drbSet->list.array[arrIdx] != NULLP)
7718 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7719 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7721 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7724 CU_FREE(drbSet->list.array, drbSet->list.size);
7729 /*******************************************************************
7731 * @brief Builds the DRB to be Setup Mod list
7735 * Function : BuildDrbToBeSetupList
7737 * Functionality: Constructs the DRB to be Setup Mod list
7739 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7741 * @return ROK - success
7744 * ****************************************************************/
7746 uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
7752 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7753 drbSet->list.count = drbCnt;
7754 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7755 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7756 if(drbSet->list.array == NULLP)
7758 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7762 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7764 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7765 if(drbSet->list.array[arrIdx] == NULLP)
7767 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7773 ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7776 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7782 /*******************************************************************
7784 * @brief Filling the DRB to be modified item
7788 * Function : FillDrbToBeModItem
7790 * Functionality: filling the DRB to be modified item
7792 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7794 * @return ROK - success
7797 * ****************************************************************/
7799 uint8_t FillDrbToBeModItem(uint8_t ueId, DRBs_ToBeModified_Item_t *drbItem)
7804 drbItem->dRBID = DRB2;
7807 drbItem->qoSInformation = NULLP;
7808 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7809 if(drbItem->qoSInformation != NULLP)
7811 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7813 switch(drbItem->qoSInformation->present)
7815 case QoSInformation_PR_NOTHING:
7819 case QoSInformation_PR_eUTRANQoS:
7822 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7823 if(drbItem->qoSInformation->choice.eUTRANQoS)
7825 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7828 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7829 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7830 PriorityLevel_no_priority;
7832 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7833 Pre_emptionCapability_may_trigger_pre_emption;
7835 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7836 Pre_emptionVulnerability_pre_emptable;
7840 case QoSInformation_PR_choice_extension:
7842 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7843 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7845 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7849 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7850 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7851 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7852 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7853 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
7856 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7861 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7862 choice_extension->value.choice.DRB_Information.sNSSAI,cuCfgParams.snssaiList[0]);
7865 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7869 /*Flows mapped to DRB List*/
7870 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7871 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7872 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7875 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7882 /*ULUPTNLInformation To Be Setup List*/
7883 ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
7884 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7887 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7893 /*******************************************************************
7895 * @brief Builds the DRB to be modified Item IE
7899 * Function : FillDrbToBeModItemList
7901 * Functionality: Constructs the DRB to be modified Mod Item Ies
7903 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7905 * @return ROK - success
7908 * ****************************************************************/
7910 uint8_t FillDrbToBeModItemList(uint8_t ueId, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7912 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7913 drbItemIe->criticality = Criticality_reject;
7914 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7915 if(FillDrbToBeModItem(ueId, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7917 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7924 /*******************************************************************
7926 * @brief Builds the DRB to be modified list
7930 * Function : BuildDrbToBeModList
7932 * Functionality: Constructs the DRB to be modified list
7934 * @params[in] DRBs_ToBeModified_List_t *drbSet
7936 * @return ROK - success
7939 * ****************************************************************/
7941 uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
7948 drbSet->list.count = drbCnt;
7949 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
7950 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7951 if(drbSet->list.array == NULLP)
7953 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
7956 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7958 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
7959 if(drbSet->list.array[arrIdx] == NULLP)
7961 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7967 ret = FillDrbToBeModItemList(ueId, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
7970 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
7976 /*******************************************************************
7978 * @brief freeing the DRB item
7982 * Function : FreeModifiedDrbItem
7984 * Functionality: freeing the DRB 2 item
7986 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7988 * @return ROK - success
7991 * ****************************************************************/
7993 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
7996 SNSSAI_t *snssai =NULLP;
7997 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7999 if(drbItem->qoSInformation != NULLP)
8001 switch(drbItem->qoSInformation->present)
8003 case QoSInformation_PR_NOTHING:
8005 case QoSInformation_PR_eUTRANQoS:
8007 if(drbItem->qoSInformation->choice.eUTRANQoS)
8009 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
8013 case QoSInformation_PR_choice_extension:
8015 if(drbItem->qoSInformation->choice.choice_extension)
8017 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
8019 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
8022 CU_FREE(snssai->sST.buf,snssai->sST.size);
8028 CU_FREE(snssai->sD->buf,snssai->sD->size);
8030 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
8033 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
8034 if(flowMap->list.array)
8036 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
8038 if(flowMap->list.array[arrIdx] )
8040 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
8041 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
8044 CU_FREE(flowMap->list.array,flowMap->list.size);
8047 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
8053 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
8054 if(drbItem->uLConfiguration)
8056 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
8060 /*******************************************************************
8062 * @brief free the DRB to be modfified list
8066 * Function : FreeDrbToBeModifiedList
8068 * Functionality: free the DRB to be Setup Mod list
8070 * @params[in] FreeDrbToBeModifiedList_t *drbSet
8072 * @return ROK - success
8075 * ****************************************************************/
8076 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
8079 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
8081 if(drbSet->list.array)
8083 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
8085 if(drbSet->list.array[arrIdx] != NULLP)
8087 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
8088 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
8089 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8092 CU_FREE(drbSet->list.array, drbSet->list.size);
8097 /*******************************************************************
8099 * @brief free the UeContextModification Request
8103 * Function : FreeUeContextModicationRequest
8105 * Functionality : deallocation of memory allocated in UeContextModiification
8108 * @params[in] F1AP_PDU_t *f1apMsg
8112 * ****************************************************************/
8113 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
8115 uint8_t arrIdx =0 , ieId=0;
8116 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
8120 if(f1apMsg->choice.initiatingMessage)
8122 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8123 if(UeContextModifyReq->protocolIEs.list.array)
8125 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
8127 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
8129 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
8132 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8134 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8136 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
8138 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8139 choice.DRBs_ToBeSetupMod_List);
8142 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
8144 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8145 choice.DRBs_ToBeSetupMod_List);
8150 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
8153 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
8155 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8157 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8160 /*******************************************************************
8162 * @brief Builds the Ue Context Modification Req
8166 * Function : BuildAndSendUeContextModificationReq
8168 * Functionality: Constructs the Ue Context Modification Req
8172 * @return ROK - success
8175 * ****************************************************************/
8176 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
8179 uint8_t elementCnt = 0;
8180 uint8_t ret = RFAILED;
8181 F1AP_PDU_t *f1apMsg = NULLP;
8182 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
8184 asn_enc_rval_t encRetVal;
8185 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
8189 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8190 if(f1apMsg == NULLP)
8192 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8196 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8198 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8199 if(f1apMsg->choice.initiatingMessage == NULLP)
8201 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8204 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
8205 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8206 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
8208 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8211 ueContextModifyReq->protocolIEs.list.count = elementCnt;
8212 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
8214 /* Initialize the UE context modification members */
8215 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
8216 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
8218 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8222 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8224 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
8225 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
8227 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8234 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8235 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8236 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8237 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8238 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
8241 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8242 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8243 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
8244 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8245 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
8247 /* DRB to be setup list */
8249 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
8250 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8251 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8252 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
8253 ret = BuildDrbToBeSetupList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8254 value.choice.DRBs_ToBeSetupMod_List));
8256 /* DRB to be modified list */
8258 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
8259 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8260 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8261 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
8262 ret = BuildDrbToBeModifiedList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8263 value.choice.DRBs_ToBeModified_List));
8265 /* TODO: DRB to be release list */
8271 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8273 /* Encode the F1SetupRequest type as APER */
8274 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8276 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8279 /* Encode results */
8280 if(encRetVal.encoded == ENCODE_FAIL)
8282 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8283 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8288 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8289 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8291 DU_LOG("%x",encBuf[ieIdx]);
8295 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8297 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8305 FreeUeContextModicationRequest(f1apMsg);
8308 /*****************************************************************i
8310 * @brief Free memory allocated for UE Context Release Command
8314 * Function : FreeUeContextReleaseCommand
8317 * - Free memory allocated for UE Context Release Command
8319 * @params[in] F1AP_PDU_t *f1apMsg
8322 * *************************************************************/
8323 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8326 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8330 if(f1apMsg->choice.initiatingMessage)
8332 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8333 if(ueReleaseCommand->protocolIEs.list.array)
8335 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8337 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8339 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8341 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8343 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8346 /*******************************************************************
8348 * @brief Builds the Ue Context Release Command
8352 * Function : BuildAndSendUeContextReleaseCommand
8354 * Functionality: Constructs the Ue Context Release Command
8358 * @return ROK - success
8361 * ****************************************************************/
8362 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
8364 bool memAllocFailed = false;
8365 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8366 F1AP_PDU_t *f1apMsg = NULLP;
8367 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8369 asn_enc_rval_t encRetVal;
8370 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8374 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8375 if(f1apMsg == NULLP)
8377 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8381 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8383 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8384 if(f1apMsg->choice.initiatingMessage == NULLP)
8386 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8389 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8390 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8391 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8393 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8396 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8397 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8399 /* Initialize the UE context modification members */
8400 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8401 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8403 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8407 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8409 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8410 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8412 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8413 memAllocFailed = true;
8418 if(memAllocFailed == true)
8423 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8424 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8425 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8426 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8427 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8430 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8431 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8432 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8433 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8434 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8437 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8438 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8439 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8440 UEContextReleaseCommandIEs__value_PR_Cause;
8441 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8442 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8443 CauseRadioNetwork_normal_release;
8445 /* RRC Container for RRC release */
8447 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8448 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8449 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8450 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8451 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8453 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8454 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8455 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8456 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8458 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8461 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8462 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8464 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8466 /* Encode the UE Context Release Command type as APER */
8467 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8469 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8472 /* Encode results */
8473 if(encRetVal.encoded == ENCODE_FAIL)
8475 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8476 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8481 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8482 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8484 DU_LOG("%x",encBuf[ieIdx]);
8488 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8490 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8498 FreeUeContextReleaseCommand(f1apMsg);
8501 /*******************************************************************
8503 * @brief process Ue context release request
8507 * Function : procUeContextReleaseReq
8510 * - process Ue context release request
8512 * @params[in] F1AP_PDU_t *f1apMsg
8513 * @return ROK - success
8516 * ****************************************************************/
8517 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
8519 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8521 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8522 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8524 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8526 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8528 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8530 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8533 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8535 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8542 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
8544 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8549 /*******************************************************************
8551 * @brief processing of Gnb-DU config update
8555 * Function : procGnbDuUpdate
8558 * - processing of Gnb-DU config update
8560 * @params[in] F1AP_PDU_t *f1apMsg
8561 * @return ROK - success
8564 * ****************************************************************/
8565 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
8567 bool cellToBeDelete = false;
8568 uint8_t ieIdx = 0, ueIdx = 0;
8569 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8571 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8572 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8574 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8576 case ProtocolIE_ID_id_TransactionID:
8578 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8580 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8582 cellToBeDelete = true;
8585 case ProtocolIE_ID_id_gNB_DU_ID:
8589 if(BuildAndSendDUUpdateAck() != ROK)
8591 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8595 if(cellToBeDelete == false)
8597 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8598 if(BuildAndSendF1ResetReq() != ROK)
8600 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8606 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
8608 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
8609 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
8616 /*******************************************************************
8618 * @brief storing slice list in CU database
8622 * Function : buildSliceList
8625 * - storing slice list in CU database
8627 * @params[in] SliceSupportList_t *sliceSupportList
8628 * @return ROK - success
8631 * ****************************************************************/
8632 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8634 uint8_t sliceListIdx = 0;
8636 if(sliceSupportList)
8638 if(sliceSupportList->list.array)
8640 cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
8641 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8643 if(sliceSupportList->list.array[sliceListIdx])
8645 CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai));
8646 if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
8648 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8651 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8653 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8654 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8656 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8658 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
8659 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8660 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8669 /****************************************************************
8670 * @brief Function to process Drb Setup Mod List
8674 * Function : procDrbSetupModList
8677 * - Function to process DRB Setup Mod List
8680 * @return ROK - success
8683 * ****************************************************************/
8684 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8688 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8690 if(drbSetupList != NULLP)
8692 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8694 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8695 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8697 /* extracting teId */
8698 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8701 if(addDrbTunnels(teId)== ROK)
8703 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8714 /*******************************************************************
8716 * @brief processing of GNB_DU_Served_Cells Plmn list information
8720 * Function : procServedCellPlmnList
8723 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8726 * @params[in] F1AP_PDU_t *f1apMsg
8727 * @return ROK - success
8730 * ****************************************************************/
8731 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8733 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8734 ProtocolExtensionContainer_4624P3_t **ieExtend;
8736 if(srvPlmn->list.array)
8738 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8740 if(srvPlmn->list.array[srvPlmnIdx])
8742 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8745 if((*ieExtend)->list.array)
8747 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8749 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8751 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8753 case ProtocolIE_ID_id_TAISliceSupportList:
8755 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8756 extensionValue.choice.SliceSupportList) != ROK)
8758 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8773 /****************************************************************
8774 * @brief Function to process Ue Context Modification Response
8778 * Function : procUeContextModificationResponse
8781 * - Function to process Ue Context Modification Response
8784 * @return ROK - success
8787 * ****************************************************************/
8788 uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
8790 uint8_t idx, duUeF1apId;
8791 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8792 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8794 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8796 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8798 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8800 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8803 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8805 /* Adding Tunnels for successful DRB */
8806 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8815 /*******************************************************************
8817 * @brief processing of F1 setup request
8821 * Function : procF1SetupReq
8824 * - processing of F1 setup request
8826 * @params[in] F1AP_PDU_t *f1apMsg
8827 * @return ROK - success
8830 * ****************************************************************/
8831 void procF1SetupReq(F1AP_PDU_t *f1apMsg)
8833 uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
8834 BIT_STRING_t nrcellIdentity;
8835 F1SetupRequest_t *f1SetupReq = NULLP;
8836 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8837 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8839 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8840 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8842 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8844 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8846 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8847 if(duServedCell->list.array)
8849 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8851 if(duServedCell->list.array[plmnidx])
8853 switch(duServedCell->list.array[plmnidx]->id)
8855 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8857 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8858 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8859 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
8870 BuildAndSendF1SetupRsp(&nrcellIdentity);
8874 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
8878 /*******************************************************************
8880 * @brief Handles received F1AP message and sends back response
8884 * Function : F1APMsgHdlr
8887 * - Decodes received F1AP control message
8888 * - Prepares response message, encodes and sends to SCTP
8891 * @return ROK - success
8894 * ****************************************************************/
8895 void F1APMsgHdlr(Buffer *mBuf)
8901 F1AP_PDU_t *f1apMsg = NULLP;
8902 asn_dec_rval_t rval; /* Decoder return value */
8903 F1AP_PDU_t f1apasnmsg ;
8905 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
8906 ODU_PRINT_MSG(mBuf, 0,0);
8908 /* Copy mBuf into char array to decode it */
8909 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8910 CU_ALLOC(recvBuf, (Size)recvBufLen);
8912 if(recvBuf == NULLP)
8914 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
8917 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8919 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
8923 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
8924 for(i=0; i< recvBufLen; i++)
8926 DU_LOG("%x",recvBuf[i]);
8929 /* Decoding flat buffer into F1AP messsage */
8930 f1apMsg = &f1apasnmsg;
8931 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8933 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8934 CU_FREE(recvBuf, (Size)recvBufLen);
8936 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8938 DU_LOG("\nERROR --> F1AP : ASN decode failed");
8942 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8944 switch(f1apMsg->present)
8946 case F1AP_PDU_PR_initiatingMessage:
8948 switch(f1apMsg->choice.initiatingMessage->value.present)
8950 case InitiatingMessage__value_PR_Reset:
8952 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
8953 BuildAndSendF1ResetAck();
8957 case InitiatingMessage__value_PR_F1SetupRequest:
8959 DU_LOG("\nINFO --> F1AP : F1 setup request received");
8960 procF1SetupReq(f1apMsg);
8964 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
8966 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
8967 procGnbDuUpdate(f1apMsg);
8970 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
8972 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
8973 procInitULRRCMsg(f1apMsg);
8976 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
8978 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
8979 procUlRrcMsg(f1apMsg);
8983 case InitiatingMessage__value_PR_RRCDeliveryReport:
8985 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
8988 case InitiatingMessage__value_PR_UEContextReleaseRequest:
8990 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
8991 procUeContextReleaseReq(f1apMsg);
8996 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
8997 f1apMsg->choice.initiatingMessage->value.present);
9000 }/* End of switch(initiatingMessage) */
9004 case F1AP_PDU_PR_successfulOutcome:
9006 switch(f1apMsg->choice.successfulOutcome->value.present)
9008 case SuccessfulOutcome__value_PR_ResetAcknowledge:
9010 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
9013 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
9015 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
9016 procUeContextSetupResponse(f1apMsg);
9019 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
9021 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
9022 procUeContextModificationResponse(f1apMsg);
9025 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
9027 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
9032 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
9033 f1apMsg->choice.successfulOutcome->value.present);
9036 }/* End of switch(successfulOutcome) */
9041 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
9044 }/* End of switch(f1apMsg->present) */
9046 } /* End of F1APMsgHdlr */
9048 /**********************************************************************
9050 **********************************************************************/