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 "BWP-UplinkDedicated.h"
78 #include "PUSCH-ServingCellConfig.h"
79 #include "UplinkConfig.h"
80 #include "PDSCH-ServingCellConfig.h"
81 #include "EUTRANQoS.h"
82 #include "GBR-QosInformation.h"
83 #include "DRBs-ToBeSetupMod-List.h"
84 #include "DRBs-ToBeSetupMod-Item.h"
85 #include "DRBs-Setup-Item.h"
86 #include "DLUPTNLInformation-ToBeSetup-List.h"
87 #include "DLUPTNLInformation-ToBeSetup-Item.h"
88 #include "UPTransportLayerInformation.h"
89 #include "GTPTunnel.h"
90 #include "QoSInformation.h"
92 /* MACRO for CUtoDURRCInformation */
94 #define FREQ_DOM_RSRC_SIZE 6
95 #define CORESET0_END_PRB 48
96 #define CORESET1_NUM_PRB 24
97 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
98 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
99 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
100 #define PDCCH_SRCH_SPC_TWO_ID 2
102 #define SCRAMBLING_ID NR_PCI
103 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
104 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
105 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
106 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
107 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
108 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
109 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
110 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
111 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
113 /* MACRO Ddefine for PDSCH Configuration */
115 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
116 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
117 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
118 #define PDSCH_NUM_HARQ_PROC 5
119 #define PDSCH_MAPPING_TYPE_A 0
120 #define PDSCH_MAPPING_TYPE_B 1
122 /* MACRO Define for PUSCH Configuration */
123 #define PUSCH_K2_CFG1 3
124 #define PUSCH_K2_CFG2 4
126 #define PUSCH_MSG3_DELTA_PREAMBLE 0
127 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
128 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
129 #define PUSCH_MAX_MIMO_LAYERS 1
130 #define PUSCH_PROCESS_TYPE2_ENABLED false
131 #define PUSCH_MAPPING_TYPE_A 0
132 #define PUSCH_MAPPING_TYPE_B 1
134 /* MACRO defines for SRC config */
135 #define SRS_RSRC_ID 1
136 #define SRS_RSET_ID 1
137 #define SRS_COMB_OFFSET_N2 0
138 #define SRS_CYCLIC_SHIFT_N2 0
139 #define SRS_FREQ_DOM_POS 0
140 #define SRS_FREQ_DOM_SHIFT 0
145 #define APERIODIC_SRS_RESRC_TRIGGER 1
147 /* Macro definitions for DUtoCuRrcContainer */
148 #define CELL_GRP_ID 1
150 #define SR_PROHIBIT_TMR 5
151 #define SR_TRANS_MAX 2
152 #define PERIODIC_BSR_TMR 2
153 #define RETX_BSR_TMR 5
154 #define SR_DELAY_TMR 6
156 #define TIME_ALIGNMENT_TMR 7
157 #define PHR_PERIODIC_TMR 7
158 #define PHR_PROHIBHIT_TMR 0
159 #define PHR_PWR_FACTOR_CHANGE 3
160 #define PHR_MODE_OTHER_CG 0
163 #define SN_FIELD_LEN 0
164 #define T_POLL_RETRANSMIT 8
167 #define MAX_RETX_THRESHOLD 5
168 #define T_REASSEMBLY 8
169 #define T_STATUS_PROHIBHIT 7
170 #define MAC_LC_PRIORITY 1
171 #define PRIORTISIED_BIT_RATE 15
172 #define BUCKET_SIZE_DURATION 5
175 #define PDSCH_HARQ_ACK_CODEBOOK 1
176 #define SERV_CELL_IDX 0
177 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
178 #define ACTIVE_DL_BWP_ID 0
179 #define ACTIVE_UL_BWP_ID 0
180 #define SCRAMBLING_ID NR_PCI
181 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
182 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
183 #define FIVE_QI_VALUE9 9 /*spec 23.501, Table 5.7.4-1*/
184 #define FIVE_QI_VALUE8 8 /*spec 23.501, Table 5.7.4-1*/
186 /*******************************************************************
188 * @brief Sends F1 msg over SCTP
192 * Function : SendF1APMsg
194 * Functionality: Sends F1 msg over SCTP
196 * @params[in] Region region
198 * @return ROK - success
201 * ****************************************************************/
202 S16 SendF1APMsg(Region region, Pool pool)
204 Buffer *mBuf = NULLP;
206 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
208 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
210 ODU_PRINT_MSG(mBuf, 0,0);
212 if(sctpSend(mBuf) != ROK)
214 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
215 ODU_PUT_MSG_BUF(mBuf);
221 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
222 ODU_PUT_MSG_BUF(mBuf);
225 ODU_PUT_MSG_BUF(mBuf);
229 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
236 /*******************************************************************
238 * @brief Builds NRCell ID
242 * Function : BuildNrCellId
244 * Functionality: Building the NR Cell ID
246 * @params[in] BIT_STRING_t *nrcell
247 * @return ROK - success
250 * ****************************************************************/
252 S16 BuildNrCellId(BIT_STRING_t *nrcell)
254 memset(nrcell->buf, 0, nrcell->size);
256 nrcell->bits_unused = 4;
257 nrcell->size = 5 * sizeof(uint8_t);
261 /********************************************************************
263 * @brief Builds and sends the F1SetupResponse
267 * Function : BuildAndSendF1SetupRsp
269 * Functionality: Constructs the F1SetupResponse message and sends
270 * it back to the DU through SCTP.
272 * @params[in] void **buf,Buffer to which encoded pattern is written into
273 * @params[in] int *size,size of buffer
275 * @return ROK - success
278 * ****************************************************************/
279 S16 BuildAndSendF1SetupRsp()
282 uint8_t elementCnt,cellCnt;
283 F1AP_PDU_t *f1apMsg = NULL;
284 F1SetupResponse_t *f1SetupRsp;
285 GNB_CU_Name_t *cuName;
286 Cells_to_be_Activated_List_t *cellToActivate;
287 RRC_Version_t *rrcVer;
288 asn_enc_rval_t encRetVal;
289 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
291 /* Allocate the memory for F1SetupRequest_t */
292 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
295 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
298 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
300 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
301 if(f1apMsg->choice.successfulOutcome == NULLP)
303 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
304 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
308 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
309 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
310 f1apMsg->choice.successfulOutcome->value.present = \
311 SuccessfulOutcome__value_PR_F1SetupResponse;
312 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
315 f1SetupRsp->protocolIEs.list.count = elementCnt;
316 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
318 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
319 elementCnt * sizeof(F1SetupResponseIEs_t *));
320 if(f1SetupRsp->protocolIEs.list.array == NULLP)
322 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
323 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
324 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
328 for(idx=0; idx<elementCnt; idx++)
330 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
331 sizeof(F1SetupResponseIEs_t));
332 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
334 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
335 elementCnt * sizeof(F1SetupResponseIEs_t *));
336 CU_FREE(f1apMsg->choice.successfulOutcome, \
337 sizeof(SuccessfulOutcome_t));
338 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
345 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
346 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
347 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
348 F1SetupResponseIEs__value_PR_TransactionID;
349 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
354 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
355 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
356 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
357 F1SetupResponseIEs__value_PR_GNB_CU_Name;
358 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
359 cuName->size = sizeof(cuCfgParams.cuName);
361 CU_ALLOC(cuName->buf, sizeof(cuName->size));
362 if(cuName->buf == NULLP)
364 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
366 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
367 sizeof(F1SetupResponseIEs_t));
369 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
370 elementCnt * sizeof(F1SetupResponseIEs_t *));
371 CU_FREE(f1apMsg->choice.successfulOutcome,\
372 sizeof(SuccessfulOutcome_t));
373 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
376 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
378 /*Cells to be activated list*/
380 f1SetupRsp->protocolIEs.list.array[idx]->id = \
381 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
382 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
383 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
384 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
385 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
386 Cells_to_be_Activated_List;
388 cellToActivate->list.count = cellCnt;
389 cellToActivate->list.size = \
390 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
391 CU_ALLOC(cellToActivate->list.array,\
392 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
393 if(cellToActivate->list.array == NULLP)
395 CU_FREE(cuName->buf, sizeof(cuName->size));
396 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
398 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
399 sizeof(F1SetupResponseIEs_t));
401 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
402 elementCnt * sizeof(F1SetupResponseIEs_t *));
403 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
404 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
407 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
409 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
410 if(cellToActivate->list.array[ieIdx] == NULLP)
412 CU_FREE(cellToActivate->list.array,\
413 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
414 CU_FREE(cuName->buf, sizeof(cuName->size));
415 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
417 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
418 sizeof(F1SetupResponseIEs_t));
420 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
421 elementCnt * sizeof(F1SetupResponseIEs_t *));
422 CU_FREE(f1apMsg->choice.successfulOutcome, \
423 sizeof(SuccessfulOutcome_t));
424 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
428 cellToActivate->list.array[0]->id = \
429 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
430 cellToActivate->list.array[0]->criticality = Criticality_ignore;
431 cellToActivate->list.array[0]->value.present = \
432 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
433 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
434 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
435 CU_ALLOC(cellToActivate->list.array[0]->\
436 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
438 if(cellToActivate->list.array[0]->value.choice.\
439 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
442 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
444 CU_FREE(cellToActivate->list.array[ieIdx],\
445 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
448 CU_FREE(cellToActivate->list.array,\
449 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
450 CU_FREE(cuName->buf, sizeof(cuName->size));
451 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
453 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
454 sizeof(F1SetupResponseIEs_t));
456 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
457 elementCnt * sizeof(F1SetupResponseIEs_t *));
458 CU_FREE(f1apMsg->choice.successfulOutcome, \
459 sizeof(SuccessfulOutcome_t));
460 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
463 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
464 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
465 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
466 nRCGI.nRCellIdentity.size = 5;
467 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
468 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
470 if(cellToActivate->list.array[0]->value.choice.\
471 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
473 CU_FREE(cellToActivate->list.array[0]->\
474 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
476 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
478 CU_FREE(cellToActivate->list.array[ieIdx],\
479 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
482 CU_FREE(cellToActivate->list.array,\
483 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
484 CU_FREE(cuName->buf, sizeof(cuName->size));
485 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
487 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
488 sizeof(F1SetupResponseIEs_t));
490 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
491 elementCnt * sizeof(F1SetupResponseIEs_t *));
492 CU_FREE(f1apMsg->choice.successfulOutcome, \
493 sizeof(SuccessfulOutcome_t));
494 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
497 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
500 f1SetupRsp->protocolIEs.list.array[idx]->id = \
501 ProtocolIE_ID_id_GNB_CU_RRC_Version;
502 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
503 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
504 F1SetupResponseIEs__value_PR_RRC_Version;
505 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
506 rrcVer->latest_RRC_Version.size = RRC_SIZE;
508 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
509 if(rrcVer->latest_RRC_Version.buf == NULLP)
511 CU_FREE(cuName->buf, sizeof(cuName->size));
512 for(ieIdx=0; ieIdx<elementCnt; idx++)
514 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
515 sizeof(F1SetupResponseIEs_t));
517 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
518 elementCnt * sizeof(F1SetupResponseIEs_t *));
519 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
520 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
524 /* Need to check RRC Version */
525 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
526 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
527 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
528 if(rrcVer->iE_Extensions == NULLP)
530 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
531 CU_FREE(cuName->buf, sizeof(cuName->size));
532 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
534 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
535 sizeof(F1SetupResponseIEs_t));
537 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
538 elementCnt * sizeof(F1SetupResponseIEs_t *));
539 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
540 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
543 rrcVer->iE_Extensions->list.count = 1;
544 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
545 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
546 sizeof(struct RRC_Version_ExtIEs *));
547 if(rrcVer->iE_Extensions->list.array == NULLP)
549 CU_FREE(rrcVer->iE_Extensions,\
550 sizeof(ProtocolExtensionContainer_4624P81_t));
551 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
552 CU_FREE(cuName->buf, sizeof(cuName->size));
553 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
555 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
556 sizeof(F1SetupResponseIEs_t));
558 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
559 elementCnt * sizeof(F1SetupResponseIEs_t *));
560 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
561 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
564 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
565 sizeof(struct RRC_Version_ExtIEs));
566 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
568 CU_FREE(rrcVer->iE_Extensions->list.array,\
569 sizeof(struct RRC_Version_ExtIEs *));
570 CU_FREE(rrcVer->iE_Extensions,\
571 sizeof(ProtocolExtensionContainer_4624P81_t));
572 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
573 CU_FREE(cuName->buf, sizeof(cuName->size));
574 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
576 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
577 sizeof(F1SetupResponseIEs_t));
579 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
580 elementCnt * sizeof(F1SetupResponseIEs_t *));
581 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
582 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
585 rrcVer->iE_Extensions->list.array[0]->id = \
586 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
587 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
588 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
589 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
590 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
591 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
592 CU_ALLOC(rrcVer->iE_Extensions->list.\
593 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
595 if(rrcVer->iE_Extensions->list.\
596 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
598 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
599 sizeof(struct RRC_Version_ExtIEs));
600 CU_FREE(rrcVer->iE_Extensions->list.array,\
601 sizeof(struct RRC_Version_ExtIEs *));
602 CU_FREE(rrcVer->iE_Extensions,\
603 sizeof(ProtocolExtensionContainer_4624P81_t));
604 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
605 CU_FREE(cuName->buf, sizeof(cuName->size));
606 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
608 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
609 sizeof(F1SetupResponseIEs_t));
611 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
612 elementCnt * sizeof(F1SetupResponseIEs_t *));
613 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
614 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
617 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
618 Latest_RRC_Version_Enhanced.buf[0] = 0;
619 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
620 Latest_RRC_Version_Enhanced.buf[1] = 5;
621 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
622 Latest_RRC_Version_Enhanced.buf[2] = 15;
624 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
626 /* Encode the F1SetupRequest type as UPER */
627 memset(encBuf, 0, ENC_BUF_MAX_LEN);
629 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
632 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
633 CU_FREE(cuName->buf, sizeof(cuName->size));
634 for(idx=0; idx<elementCnt; idx++)
636 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
638 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
639 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
640 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
642 /* Check encode results */
643 if(encRetVal.encoded == ENCODE_FAIL)
645 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
646 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
651 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
652 for(int i=0; i< encBufSize; i++)
654 DU_LOG("%x",encBuf[i]);
659 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
661 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
666 }/* End of BuildAndSendF1SetupRsp */
668 /*******************************************************************
670 * @brief Builds and sends the DUUpdateAcknowledge
674 * Function : BuildAndSendDUUpdateAck
676 * Functionality: Constructs the DU Update Acknowledge message and sends
677 * it to the DU through SCTP.
681 * @return ROK - success
684 * ****************************************************************/
686 S16 BuildAndSendDUUpdateAck()
690 F1AP_PDU_t *f1apMsg = NULL;
691 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
692 asn_enc_rval_t enRetVal; /* Encoder return value */
694 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
696 /* Allocate the memory for F1SetupRequest_t */
697 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
700 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
704 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
706 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
707 if(f1apMsg->choice.successfulOutcome == NULLP)
709 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
710 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
714 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
715 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
716 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
717 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
720 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
721 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
723 /* Initialize the F1Setup members */
724 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
725 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
727 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
728 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
729 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
733 for(idx=0; idx<elementCnt; idx++)
735 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
736 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
738 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
739 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
740 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
747 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
748 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
749 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
750 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
751 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
753 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
755 /* Encode the F1SetupRequest type as UPER */
756 memset(encBuf, 0, ENC_BUF_MAX_LEN);
758 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
761 for(idx=0; idx<elementCnt; idx++)
763 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
765 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
766 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
767 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
769 /* Checking encode results */
770 if(enRetVal.encoded == ENCODE_FAIL)
772 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
773 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
778 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
779 for(int i=0; i< encBufSize; i++)
781 DU_LOG("%x",encBuf[i]);
786 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
788 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
794 }/* End of BuildAndSendDUUpdateAck*/
795 /*******************************************************************
797 * @brief deallocating the memory of F1reset msg
801 * Function : FreeF1ResetReq
804 * - freeing memory of F1reset request msg
810 * ****************************************************************/
811 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
814 Reset_t *f1ResetMsg = NULLP;
818 if(f1apMsg->choice.initiatingMessage)
820 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
821 if(f1ResetMsg->protocolIEs.list.array)
823 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
825 if(f1ResetMsg->protocolIEs.list.array[idx])
827 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
830 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
832 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
834 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
837 /*******************************************************************
839 * @brief build ansld ans send f1reset msg
843 * Function : BuildAndSendF1ResetReq
845 * Functionality: build and send f1reset msg
847 * @return ROK - success
850 * ****************************************************************/
851 uint8_t BuildAndSendF1ResetReq()
853 uint8_t elementCnt=0;
855 uint8_t ret= RFAILED;
856 Reset_t *f1ResetMsg = NULLP;
857 F1AP_PDU_t *f1apMsg = NULLP;
858 asn_enc_rval_t encRetVal;
859 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
862 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
865 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
868 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
869 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
870 if(f1apMsg->choice.initiatingMessage == NULLP)
872 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
875 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
876 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
877 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
879 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
882 f1ResetMsg->protocolIEs.list.count = elementCnt;
883 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
885 /* Initialize the F1Reset members */
886 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
887 if(f1ResetMsg->protocolIEs.list.array == NULLP)
889 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
892 for(idx=0; idx<elementCnt; idx++)
894 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
895 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
897 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
904 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
905 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
906 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
907 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
911 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
912 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
913 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
914 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
915 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
919 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
920 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
921 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
922 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
923 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
925 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
927 /* Encode the F1SetupRequest type as APER */
928 memset(encBuf, 0, ENC_BUF_MAX_LEN);
930 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
934 if(encRetVal.encoded == ENCODE_FAIL)
936 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
937 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
942 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
943 for(idx=0; idx< encBufSize; idx++)
945 DU_LOG("%x",encBuf[idx]);
949 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
951 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
959 FreeF1ResetReq(f1apMsg);
963 /*******************************************************************
965 * @brief Fills Radio Bearer Config
969 * Function : fillSrbCfg
971 * Functionality: Fills Radio Bearer Config
973 * @params[in] SRB_ToAddModList *
975 * @return ROK - success
978 * ****************************************************************/
979 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
983 if(bearerCfg != NULLP)
986 bearerCfg->list.count = elementCnt;
987 bearerCfg->list.size =\
988 elementCnt * sizeof(SRB_ToAddMod_t *);
989 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
990 if(bearerCfg->list.array != NULLP)
992 for(idx = 0; idx < elementCnt; idx++)
994 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
995 if(bearerCfg->list.array[idx] == NULLP)
997 for(ieId = 0; ieId < idx; ieId++)
999 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
1001 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1011 bearerCfg->list.array[idx]->srb_Identity = srbId;
1016 /*******************************************************************
1018 * @brief Fills Master CellGroup Info
1022 * Function : fillMasterCellGroup
1024 * Functionality: Fills Master Cell Group IE
1026 * @params[in] RRCSetup_IEs_t *
1028 * @return ROK - success
1031 * ****************************************************************/
1033 uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
1036 masterCellGroup->buf = NULLP;
1037 if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
1039 masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
1040 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1041 if(masterCellGroup->buf != NULLP)
1043 memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
1044 masterCellGroup->size);
1058 /*******************************************************************
1060 * @brief Fills RRC setup IE
1064 * Function : fillRRCSetupIE
1066 * Functionality: Fills RRC Setup IE
1068 * @params[in] RRCSetup_IEs_t *
1070 * @return ROK - success
1073 * ****************************************************************/
1075 uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
1080 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1081 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1083 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1087 ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
1091 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1097 /*******************************************************************
1099 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1103 * Function : fillDlCcchRrcMsg
1105 * Functionality: Fills DL DCCCH Message required for
1106 * DLRRCMessageTransfer
1108 * @params[in] RRCContainer_t *rrcContainer
1110 * @return ROK - success
1113 * ****************************************************************/
1115 uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
1119 DL_CCCH_Message_t dl_CCCH_Msg;
1120 asn_enc_rval_t encRetVal;
1122 if(rrcContainer != NULLP)
1124 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1126 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1127 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1129 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1130 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1131 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1133 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1134 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1135 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1136 /* Fill RRC Setup IE */
1137 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1138 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1139 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1140 criticalExtensions.choice.rrcSetup != NULLP)
1142 ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1143 criticalExtensions.choice.rrcSetup);
1147 /* encode DL-CCCH message into RRC Container */
1148 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1149 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1151 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1152 /* Encode results */
1153 if(encRetVal.encoded == ENCODE_FAIL)
1155 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1156 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1161 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1162 for(int i = 0; i< encBufSize; i++)
1164 DU_LOG("%x",encBuf[i]);
1166 rrcContainer->size = encBufSize;
1167 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1168 if(rrcContainer->buf != NULLP)
1170 memset(rrcContainer->buf, 0, encBufSize);
1171 for(idx2 = 0; idx2 < encBufSize; idx2++)
1173 rrcContainer->buf[idx2] = encBuf[idx2];
1185 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1191 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1197 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1203 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1208 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1210 uint8_t idx, ied, elementCnt;
1213 qosFlow->list.count = elementCnt;
1214 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1215 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1216 if(qosFlow->list.array != NULLP)
1218 for(idx = 0; idx < elementCnt; idx++)
1220 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1221 if(qosFlow->list.array[idx] == NULLP)
1223 for(ied = 0; ied < idx; ied++)
1225 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1227 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1233 *qosFlow->list.array[idx] = 9;
1237 /*******************************************************************
1239 * @brief Fills CN Assoc for Drb to Add/Mod List
1243 * Function : fillCnAssoc
1245 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1247 * @params[in] struct DRB_ToAddMod__cnAssociation *
1249 * @return ROK - success
1252 * ****************************************************************/
1254 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1258 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1259 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1261 cnAssoc->choice.eps_BearerIdentity = 5;
1263 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1265 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1266 if(cnAssoc->choice.sdap_Config)
1268 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1269 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1270 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1271 cnAssoc->choice.sdap_Config->defaultDRB = true;
1272 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1273 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1274 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1275 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1276 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1278 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1282 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1283 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1289 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1296 /*******************************************************************
1298 * @brief Fills Radio Bearer Config for Drb
1302 * Function : fillDrbCfg
1304 * Functionality: Fills Radio Bearer Config for Drb
1306 * @params[in] drbId, DRB_ToAddModList *
1308 * @return ROK - success
1311 * ****************************************************************/
1312 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1314 uint8_t idx, ied, ret, elementCnt;
1320 drbCfg->list.count = elementCnt;
1321 drbCfg->list.size =\
1322 elementCnt * sizeof(DRB_ToAddMod_t *);
1323 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1324 if(drbCfg->list.array != NULLP)
1326 for(idx = 0; idx < elementCnt; idx++)
1328 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1329 if(drbCfg->list.array[idx] == NULLP)
1331 for(ied = 0; ied < idx; ied++)
1333 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1335 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1345 /* CN ASSOCIATION */
1346 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1347 if(drbCfg->list.array[idx]->cnAssociation)
1349 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1352 drbCfg->list.array[idx]->drb_Identity = drbId;
1357 /*******************************************************************
1359 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1363 * Function : fillRrcReconfigIE
1365 * Functionality: Fills RRC Reconfig Message required for
1366 * DLRRCMessageTransfer
1368 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1370 * @return ROK - success
1373 * ****************************************************************/
1375 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1378 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1379 if(rrcReconfigMsg->radioBearerConfig)
1381 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1382 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1384 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1389 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1390 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1392 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1395 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1396 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1397 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1403 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1404 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1410 /*******************************************************************
1412 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1416 * Function : fillDlDcchRrcMsg
1418 * Functionality: Fills DL DCCH Message required for
1419 * DLRRCMessageTransfer
1421 * @params[in] RRCContainer_t *rrcContainer
1423 * @return ROK - success
1426 * ****************************************************************/
1428 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1432 DL_DCCH_Message_t dl_DCCH_Msg;
1433 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1434 asn_enc_rval_t encRetVal;
1436 if(rrcContainer != NULLP)
1438 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1440 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1441 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1443 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1444 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1445 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1447 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1448 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1449 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1450 /* Fill RRC Reconfig IE */
1451 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1452 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1453 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1454 criticalExtensions.choice.rrcReconfiguration != NULLP)
1456 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1457 criticalExtensions.choice.rrcReconfiguration);
1461 /* encode DL-DCCH message into RRC Container */
1462 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1463 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1465 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1466 /* Encode results */
1467 if(encRetVal.encoded == ENCODE_FAIL)
1469 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1470 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1475 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1476 for(int i = 0; i< encBufSize; i++)
1478 DU_LOG("%x",encBuf[i]);
1480 rrcContainer->size = encBufSize;
1481 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1482 if(rrcContainer->buf != NULLP)
1484 memset(rrcContainer->buf, 0, encBufSize);
1485 for(idx2 = 0; idx2 < encBufSize; idx2++)
1487 rrcContainer->buf[idx2] = encBuf[idx2];
1494 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1499 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1505 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1511 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1517 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1523 /*******************************************************************
1525 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1529 * Function : BuildDLRRCContainer
1531 * Functionality: Builds RRC Container IE required for
1532 * DLRRCMessageTransfer
1536 * @return ROK - success
1539 * ****************************************************************/
1541 uint8_t BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1543 uint8_t ret, bufLen;
1546 if(rrcMsgType == RRC_SETUP)
1548 ret = fillDlCcchRrcMsg(ueId, rrcContainer);
1550 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1552 else if(rrcMsgType == REGISTRATION_ACCEPT)
1554 /*Hardcoded RRC Container from reference logs*/
1555 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1557 rrcContainer->size = bufLen;
1558 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1559 if(rrcContainer->buf != NULLP)
1561 memset(rrcContainer->buf, 0, bufLen);
1562 memcpy(rrcContainer->buf, buf, bufLen);
1565 else if(rrcMsgType == RRC_RECONFIG)
1567 /*Hardcoded RRC Container from reference logs*/
1569 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1570 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1571 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1572 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1573 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1574 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1575 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1576 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1577 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1578 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1579 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1580 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1581 0x00, 0x00, 0x00, 0x00};
1583 rrcContainer->size = bufLen;
1584 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1585 if(rrcContainer->buf != NULLP)
1587 memset(rrcContainer->buf, 0, bufLen);
1588 memcpy(rrcContainer->buf, buf, bufLen);
1595 /*******************************************************************
1597 * @brief Builds and sends the DLRRCMessageTransfer
1601 * Function : BuildAndSendDLRRCMessageTransfer
1603 * Functionality: Constructs the DL RRC Message Transfer and sends
1604 * it to the CU through SCTP.
1608 * @return ROK - success
1611 * ****************************************************************/
1612 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
1614 uint8_t elementCnt = 0;
1617 F1AP_PDU_t *f1apMsg = NULLP;
1618 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1619 asn_enc_rval_t encRetVal; /* Encoder return value */
1621 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1623 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1624 if(f1apMsg == NULLP)
1626 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1630 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1631 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1632 sizeof(InitiatingMessage_t));
1633 if(f1apMsg->choice.initiatingMessage == NULLP)
1635 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1636 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1640 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1641 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1642 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1643 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1646 dlRRCMsg->protocolIEs.list.count = elementCnt;
1647 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1649 /* Initialize the F1Setup members */
1650 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1651 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1653 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1654 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1655 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1659 for(idx=0; idx<elementCnt; idx++)
1661 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1662 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1664 for(ieId=0; ieId<idx; ieId++)
1666 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1667 sizeof(DLRRCMessageTransferIEs_t));
1669 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1670 dlRRCMsg->protocolIEs.list.size);
1671 CU_FREE(f1apMsg->choice.initiatingMessage,\
1672 sizeof(InitiatingMessage_t));
1673 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1678 /* GNB CU UE F1AP ID */
1680 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1681 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1683 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1684 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
1686 /* GNB DU UE F1AP ID */
1688 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1689 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1690 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1691 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1692 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1693 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
1697 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1698 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1699 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1700 DLRRCMessageTransferIEs__value_PR_SRBID;
1701 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1705 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1706 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1707 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1708 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1709 BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1711 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1713 /* Encode the F1SetupRequest type as APER */
1714 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1716 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1718 /* Encode results */
1719 if(encRetVal.encoded == ENCODE_FAIL)
1721 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1722 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1727 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1728 for(int i=0; i< encBufSize; i++)
1730 DU_LOG("%x",encBuf[i]);
1735 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1737 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1742 }/* End of BuildAndSendDLRRCMessageTransfer */
1744 /*******************************************************************
1746 * @brief Function to set the Dl RRC Msg Type
1750 * Function : setDlRRCMsgType
1752 * Functionality: Constructs the UE Setup Response and sends
1753 * it to the DU through SCTP.
1757 * @return ROK - success
1760 * ****************************************************************/
1762 uint8_t setDlRRCMsgType(uint8_t ueId)
1764 uint8_t rrcMsgType = 0;
1765 switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
1768 rrcMsgType = RRC_SETUP;
1770 case REGISTRATION_ACCEPT:
1771 rrcMsgType = REGISTRATION_ACCEPT;
1773 case UE_CONTEXT_SETUP_REQ:
1774 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1776 case SECURITY_MODE_COMPLETE:
1777 rrcMsgType = SECURITY_MODE_COMPLETE;
1780 rrcMsgType = RRC_RECONFIG;
1782 case UE_CONTEXT_MOD_REQ:
1783 rrcMsgType = UE_CONTEXT_MOD_REQ;
1791 /*******************************************************************
1793 * @brief Function to build Initial UL RRC Message
1797 * Function : procInitULRRCMsg
1799 * Functionality: Function to build Initial UL RRC Message
1803 * @return ROK - success
1806 * ****************************************************************/
1808 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1810 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1812 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1813 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1815 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1817 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1819 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1821 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1822 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1824 case ProtocolIE_ID_id_NRCGI:
1826 case ProtocolIE_ID_id_C_RNTI:
1828 case ProtocolIE_ID_id_RRCContainer:
1830 case ProtocolIE_ID_id_DUtoCURRCContainer:
1832 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1833 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1834 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1836 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1837 ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
1838 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1839 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1840 CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
1841 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
1842 if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
1844 memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1845 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
1846 .duToCuContainer.size);
1851 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1857 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1863 ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
1864 rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
1865 ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
1870 /*******************************************************************
1872 * @brief Builds Nrcgi
1876 * Function : BuildNrcgi
1878 * Functionality: Building the PLMN ID and NR Cell id
1880 * @params[in] NRCGI_t *nrcgi
1881 * @return ROK - success
1884 * ****************************************************************/
1885 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1888 uint8_t unused_bits = 4;
1889 uint8_t byteSize = 5;
1891 /* Allocate Buffer Memory */
1892 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1893 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1894 if(nrcgi->pLMN_Identity.buf == NULLP)
1898 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1904 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1905 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1906 if(nrcgi->nRCellIdentity.buf == NULLP)
1911 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1917 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1918 nrcgi->nRCellIdentity.buf[0] |= val;
1919 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1923 /*******************************************************************
1925 * @brief Builds Special cell list for UE Setup Request
1929 * Function : BuildSplCellList
1931 * Functionality: Constructs the Special Cell list for UESetReq
1933 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1935 * @return ROK - success
1938 * ****************************************************************/
1939 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1945 spCellLst->list.count = cellCnt;
1946 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1947 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1948 if(spCellLst->list.array == NULLP)
1952 for(idx=0; idx<cellCnt; idx++)
1954 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1955 if(spCellLst->list.array[idx] == NULLP)
1961 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1962 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1963 spCellLst->list.array[idx]->value.present =\
1964 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1965 /* Special Cell ID -NRCGI */
1966 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1971 /*Special Cell Index*/
1972 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1974 }/* End of BuildSplCellList*/
1976 /*******************************************************************
1978 * @brief Builds SRBS to be setup
1982 * Function : BuildSRBSetup
1984 * Functionality: Constructs the SRB's for UESetReq
1986 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1988 * @return ROK - success
1991 * ****************************************************************/
1992 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1997 srbSet->list.count = srbCnt;
1998 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1999 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2000 if(srbSet->list.array == NULLP)
2004 for(idx=0; idx<srbCnt; idx++)
2006 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2007 if(srbSet->list.array[idx] == NULLP)
2013 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2014 srbSet->list.array[idx]->criticality = Criticality_ignore;
2015 srbSet->list.array[idx]->value.present = \
2016 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2017 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2019 }/* End of BuildSRBSetup*/
2021 /*******************************************************************
2023 * @brief Builds QOS Info for DRB Setum Item
2027 * Function : BuildQOSInfo
2029 * Functionality: Constructs the QOS Info for DRB Setup Item
2031 * @params[in] QoSInformation_t *qosinfo
2033 * @return ROK - success
2036 * ****************************************************************/
2037 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType)
2039 /* NonDynamic5QIDescriptor */
2040 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2041 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2042 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2047 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2048 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2050 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2053 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2054 sizeof(AveragingWindow_t));
2055 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2060 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2061 /*MaxDataBurstVolume*/
2062 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2063 sizeof(MaxDataBurstVolume_t));
2064 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2069 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2071 /*nRGRAN Allocation Retention Priority*/
2072 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2073 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2074 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2077 }/*End of BuildQOSInfo*/
2079 /*******************************************************************
2081 * @brief Builds SNSSAI
2085 * Function : BuildSNSSAI
2087 * Functionality: Constructs the SNSSAI For DRB list
2089 * @params[in] SNSSAI_t *snssai
2091 * @return ROK - success
2094 * ****************************************************************/
2095 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2099 snssai->sST.size = sizeof(uint8_t);
2100 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2101 if(snssai->sST.buf == NULLP)
2105 snssai->sST.buf[0] = 3;
2107 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2108 if(snssai->sD == NULLP)
2112 snssai->sD->size = 3*sizeof(uint8_t);
2113 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2114 if(snssai->sD->buf == NULLP)
2118 snssai->sD->buf[0] = 3;
2119 snssai->sD->buf[1] = 6;
2120 snssai->sD->buf[2] = 9;
2122 }/*End of BuildSNSSAI*/
2124 /*******************************************************************
2126 * @brief Builds the flow map.
2130 * Function : BuildFlowsMap
2132 * Functionality: Constructs the flowmap For DRB list
2134 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2136 * @return ROK - success
2139 * ****************************************************************/
2140 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2142 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2145 flowMap->list.count = flowCnt;
2146 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2147 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2148 if(flowMap->list.array == NULLP)
2150 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2153 for(idx=0; idx<flowCnt; idx++)
2155 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2156 if(flowMap->list.array[idx] == NULLP)
2158 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2163 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2164 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2168 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2172 }/*End of BuildFlowsMap*/
2174 /*******************************************************************
2176 * @brief Builds the Uplink Tunnel Info
2180 * Function : BuildULTnlInfo
2182 * Functionality: Constructs the UL TnlInfo For DRB list
2184 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2186 * @return ROK - success
2189 * ****************************************************************/
2190 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2195 ulInfo->list.count = ulCnt;
2196 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2197 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2198 if(ulInfo->list.array == NULLP)
2200 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2203 for(idx=0; idx<ulCnt; idx++)
2205 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2206 if(ulInfo->list.array[idx] == NULLP)
2208 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2213 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2214 UPTransportLayerInformation_PR_gTPTunnel;
2216 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2217 sizeof(GTPTunnel_t));
2218 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2220 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2223 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2224 transportLayerAddress.size = 4*sizeof(uint8_t);
2225 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2226 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2227 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2228 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2229 transportLayerAddress.buf == NULLP)
2231 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2234 /* NOTE: Below IP address must be changed if running on different IP configuration */
2235 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2236 transportLayerAddress.buf[0] = 192;
2237 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2238 transportLayerAddress.buf[1] = 168;
2239 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2240 transportLayerAddress.buf[2] = 130;
2241 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2242 transportLayerAddress.buf[3] = 82;
2243 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2244 transportLayerAddress.bits_unused = 0;
2246 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2247 = 4 * sizeof(uint8_t);
2248 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2249 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2250 gTPTunnel->gTP_TEID.size);
2251 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2254 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2257 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2258 gTP_TEID.buf[0] = 0;
2259 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2260 gTP_TEID.buf[1] = 0;
2261 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2262 gTP_TEID.buf[2] = 0;
2263 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2264 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2267 }/*End of BuildULTnlInfo*/
2269 /*******************************************************************
2271 * @brief Builds DRBS to be setup
2275 * Function : BuildDRBSetup
2277 * Functionality: Constructs the DRB's for UESetReq
2279 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2281 * @return ROK - success
2284 * ****************************************************************/
2285 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2287 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2288 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2289 DRBs_ToBeSetup_Item_t *drbSetItem;
2291 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2292 drbSet->list.count = drbCnt;
2293 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2294 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2295 if(drbSet->list.array == NULLP)
2297 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2300 for(idx=0; idx<drbCnt; idx++)
2302 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2303 if(drbSet->list.array[idx] == NULLP)
2305 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2309 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2310 drbSet->list.array[idx]->criticality = Criticality_ignore;
2311 drbSet->list.array[idx]->value.present = \
2312 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2313 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2315 drbSetItem->dRBID = idx + 1;
2317 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2318 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2319 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2321 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2324 drbSetItem->qoSInformation.choice.choice_extension->id = \
2325 ProtocolIE_ID_id_DRB_Information;
2326 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2328 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2329 QoSInformation_ExtIEs__value_PR_DRB_Information;
2330 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2331 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2332 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2333 if(BuildQOSInforet != ROK)
2335 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2339 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2340 choice_extension->value.choice.DRB_Information.sNSSAI);
2341 if(BuildSNSSAIret != ROK)
2343 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2346 /*Flows mapped to DRB List*/
2347 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2348 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2349 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2350 if(BuildFlowsMapret != ROK)
2352 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2355 /*ULUPTNLInformation To Be Setup List*/
2356 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2357 if(BuildULTnlInforet != ROK)
2359 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2363 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2366 }/* End of BuildDRBSetup*/
2368 /*******************************************************************
2370 * @brief Deallocating memory of function BuildAndSendUESetReq
2374 * Function : FreeNrcgi
2376 * Functionality: Deallocating memory for function BuildNrcgi
2378 * @params[in] NRCGI_t *nrcgi
2382 *******************************************************************/
2383 void FreeNrcgi(NRCGI_t *nrcgi)
2385 if(nrcgi->pLMN_Identity.buf != NULLP)
2387 if(nrcgi->nRCellIdentity.buf != NULLP)
2389 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2391 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2394 /*******************************************************************
2396 * @brief Deallocating memory of function BuildAndSendUESetReq
2400 * Function : FreeSplCellList
2402 * Functionality: Deallocating memory for function BuildSplCellList
2404 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2409 * *****************************************************************/
2410 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2413 if(spCellLst->list.array != NULLP)
2415 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2417 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2419 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2421 if(spCellLst->list.array[cellidx]!=NULLP)
2423 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2426 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2429 /*******************************************************************
2431 * @brief Deallocating memory of function BuildAndSendUESetReq
2435 * Function : FreeSRBSetup
2437 * Functionality: Deallocating memory for function BuildSRBSetup
2439 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2444 * ******************************************************************/
2445 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2448 if(srbSet->list.array != NULLP)
2450 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2452 if(srbSet->list.array[srbidx]!=NULLP)
2454 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2457 CU_FREE(srbSet->list.array,srbSet->list.size);
2460 /*******************************************************************
2462 * @brief Deallocating memory of function BuildAndSendUESetReq
2466 * Function : FreeQOSInfo
2468 * Functionality: Deallocating memory for function BuildQOSInfo
2470 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2474 * ****************************************************************/
2475 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2477 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2479 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2481 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2483 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2484 sizeof(MaxDataBurstVolume_t));
2486 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2487 sizeof(AveragingWindow_t));
2489 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2490 sizeof(NonDynamic5QIDescriptor_t));
2493 /*******************************************************************
2495 * @brief Deallocating memory of function BuildAndSendUESetReq
2499 * Function : FreeULTnlInfo
2501 * Functionality: Deallocating memory for function BuildULTnlInfo
2503 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2508 * ****************************************************************/
2509 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2512 if(ulInfo->list.array != NULLP)
2514 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2516 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2518 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2520 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2521 transportLayerAddress.buf != NULLP)
2523 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2526 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2527 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2528 gTPTunnel->gTP_TEID.size);
2530 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2531 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2532 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2534 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2535 sizeof(GTPTunnel_t));
2538 if(ulInfo->list.array[ulidx]!=NULLP)
2540 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2543 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2546 /*******************************************************************
2548 * @brief Deallocating memory for BuildAndSendUESetReq
2552 * Function : FreeDRBSetup
2554 * Functionality: Deallocating memory for BuildDRBSetup
2556 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2560 * ****************************************************************/
2561 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2563 DRBs_ToBeSetup_Item_t *drbSetItem;
2566 if(drbSet->list.array == NULLP)
2568 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2570 if(drbSet->list.array[drbidx] != NULLP)
2572 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2573 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2575 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2576 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2578 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2579 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2581 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2582 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2584 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2586 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2588 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2590 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2591 flows_Mapped_To_DRB_List.list.array != NULLP)
2593 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2594 flows_Mapped_To_DRB_List.list.count; flowidx++)
2596 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2597 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2599 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2600 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2601 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2603 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2604 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2605 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2607 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2608 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2609 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2611 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2612 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2614 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2615 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2616 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2617 sizeof(MaxDataBurstVolume_t));
2619 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2620 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2621 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2623 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2624 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2625 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2628 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2629 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2631 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2632 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2635 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2636 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2637 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2639 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2640 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2642 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2643 sizeof(OCTET_STRING_t));
2645 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2646 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2648 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2649 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2651 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2652 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2654 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2655 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2657 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2659 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2662 CU_FREE(drbSet->list.array,drbSet->list.size);
2667 /*******************************************************************
2669 * @brief Free the UE Setup Request
2673 * Function : FreeUeContextSetupReq
2675 * Functionality: Deallocate the memory of BuildUESetReq
2677 * @params[in] F1AP_PDU_t *f1apMsg
2682 * ****************************************************************/
2683 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2686 UEContextSetupRequest_t *ueSetReq = NULLP;
2688 if(f1apMsg != NULLP)
2690 if(f1apMsg->choice.initiatingMessage != NULLP)
2692 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2693 if(ueSetReq->protocolIEs.list.array != NULLP)
2695 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2697 if(ueSetReq->protocolIEs.list.array[idx])
2699 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2701 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2703 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2705 case ProtocolIE_ID_id_SpCell_ID:
2706 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2708 case ProtocolIE_ID_id_ServCellIndex:
2710 case ProtocolIE_ID_id_SpCellULConfigured:
2712 case ProtocolIE_ID_id_CUtoDURRCInformation:
2713 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2715 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2716 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2718 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2719 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2721 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2722 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2724 case ProtocolIE_ID_id_RRCContainer:
2725 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2727 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2728 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2732 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2737 for(ieId=0; ieId<idx; ieId++)
2739 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2741 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2744 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2746 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2748 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2752 /**Filling cell group info **/
2753 /*******************************************************************
2755 * @brief Build Control resource set to add/modify list
2759 * Function : BuildControlRSetToAddModList
2761 * Functionality: Build Control resource set to add/modify list
2764 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2766 * @return ROK - success
2769 * ****************************************************************/
2770 uint8_t BuildControlRSetToAddModList
2772 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2777 uint8_t numBytes, bitsUnused;
2778 struct ControlResourceSet *controlRSet;
2779 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2780 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2783 controlRSetList->list.count = elementCnt;
2784 controlRSetList->list.size = \
2785 elementCnt * sizeof(struct ControlResourceSet *);
2787 controlRSetList->list.array = NULLP;
2788 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2789 if(!controlRSetList->list.array)
2791 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2795 for(idx = 0; idx < elementCnt; idx++)
2797 controlRSetList->list.array[idx] = NULLP;
2798 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2799 if(!controlRSetList->list.array[idx])
2801 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2807 controlRSet = controlRSetList->list.array[idx];
2808 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2810 /* Values harcoded according to our design:
2813 * Bit string stored ff0000000000
2817 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2818 controlRSet->frequencyDomainResources.buf = NULLP;
2819 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2820 controlRSet->frequencyDomainResources.size);
2821 if(!controlRSet->frequencyDomainResources.buf)
2823 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2827 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2828 coreset0EndPrb = CORESET0_END_PRB;
2829 coreset1StartPrb = coreset0EndPrb + 6;
2830 coreset1NumPrb = CORESET1_NUM_PRB;
2831 /* calculate the PRBs */
2832 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2833 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2834 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2836 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2837 controlRSet->cce_REG_MappingType.present = \
2838 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2840 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2841 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2842 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2843 controlRSet->tci_PresentInDCI = NULLP;
2845 uint8_t tciStateIdx;
2847 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2848 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2849 if(!controlRset->tci_StatesPDCCH_ToAddList)
2851 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2856 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2857 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2858 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2859 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2860 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2862 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2866 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2868 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2869 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2871 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2878 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2880 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2881 if(!controlRset->tci_PresentInDCI)
2883 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2887 *(controlRset->tci_PresentInDCI);
2890 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2891 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2892 if(!controlRSet->pdcch_DMRS_ScramblingID)
2894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2897 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2900 } /* End BuildControlRSetToAddModList */
2902 /*******************************************************************
2904 * @brief Build search space to add/modify list
2908 * Function : BuildSearchSpcToAddModList
2910 * Functionality: Build search space to add/modify list
2913 * @return ROK - success
2916 * ****************************************************************/
2917 uint8_t BuildSearchSpcToAddModList
2919 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2927 struct SearchSpace *searchSpc;
2930 searchSpcList->list.count = elementCnt;
2931 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2933 searchSpcList->list.array = NULLP;
2934 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2935 if(!searchSpcList->list.array)
2937 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2941 for(idx = 0; idx < elementCnt; idx++)
2943 searchSpcList->list.array[idx] = NULLP;
2944 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2945 if(!searchSpcList->list.array[idx])
2947 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2953 searchSpc = searchSpcList->list.array[idx];
2955 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2957 searchSpc->controlResourceSetId = NULLP;
2958 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2959 if(!searchSpc->controlResourceSetId)
2961 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2964 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2966 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2967 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2968 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2969 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2971 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2974 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2975 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2977 searchSpc->duration = NULLP;
2978 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2979 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2980 if(!searchSpc->monitoringSymbolsWithinSlot)
2982 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2986 /* Values taken from reference logs :
2989 * Bit string stores 8000
2994 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2995 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2996 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2997 searchSpc->monitoringSymbolsWithinSlot->size);
2998 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3000 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3005 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3006 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3007 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3008 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3010 searchSpc->nrofCandidates = NULLP;
3011 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3012 if(!searchSpc->nrofCandidates)
3014 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3018 searchSpc->nrofCandidates->aggregationLevel1 = \
3019 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3020 searchSpc->nrofCandidates->aggregationLevel2 = \
3021 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3022 searchSpc->nrofCandidates->aggregationLevel4 = \
3023 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3024 searchSpc->nrofCandidates->aggregationLevel8 = \
3025 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3026 searchSpc->nrofCandidates->aggregationLevel16 = \
3027 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3029 searchSpc->searchSpaceType = NULLP;
3030 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3031 if(!searchSpc->searchSpaceType)
3033 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3037 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3039 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3040 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3041 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3042 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3044 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3047 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3048 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3051 }/* End BuildSearchSpcToAddModList */
3053 /*******************************************************************
3055 * @brief Builds BWP DL dedicated PDCCH config
3059 * Function : BuildBWPDlDedPdcchCfg
3061 * Functionality: Builds BWP DL dedicated PDCCH config
3063 * @params[in] struct PDCCH_Config *pdcchCfg
3065 * @return ROK - success
3068 * ****************************************************************/
3069 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3071 pdcchCfg->controlResourceSetToAddModList = NULLP;
3072 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3073 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3074 if(!pdcchCfg->controlResourceSetToAddModList)
3076 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3080 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3085 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3087 pdcchCfg->searchSpacesToAddModList = NULLP;
3088 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3089 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3090 if(!pdcchCfg->searchSpacesToAddModList)
3092 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3096 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3101 pdcchCfg->searchSpacesToReleaseList = NULLP;
3102 pdcchCfg->downlinkPreemption = NULLP;
3103 pdcchCfg->tpc_PUSCH = NULLP;
3104 pdcchCfg->tpc_PUCCH = NULLP;
3105 pdcchCfg->tpc_SRS = NULLP;
3110 /*******************************************************************
3112 * @brief Builds DMRS DL PDSCH Mapping type A
3116 * Function : BuildDMRSDLPdschMapTypeA
3118 * Functionality: Builds DMRS DL PDSCH Mapping type A
3121 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3122 * @return ROK - success
3125 * ****************************************************************/
3126 uint8_t BuildDMRSDLPdschMapTypeA
3128 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3131 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3132 dmrsDlCfg->choice.setup = NULLP;
3133 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3134 if(!dmrsDlCfg->choice.setup)
3136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3140 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3141 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3142 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3143 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3145 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3148 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3150 dmrsDlCfg->choice.setup->maxLength = NULLP;
3151 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3152 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3153 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3158 /*******************************************************************
3160 * @brief Builds TCI states to add/modify list
3164 * Function : BuildTCIStatesToAddModList
3166 * Functionality:Builds TCI states to add/modify list
3169 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3171 * @return ROK - success
3174 * ****************************************************************/
3175 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3180 /*******************************************************************
3182 * @brief Builds PDSCH time domain allocation list
3186 * Function : BuildPdschTimeDomAllocList
3188 * Functionality: Builds PDSCH time domain allocation list
3191 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3193 * @return ROK - success
3196 * ****************************************************************/
3197 uint8_t BuildPdschTimeDomAllocList
3199 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3204 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3206 timeDomAllocList->present = \
3207 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3209 timeDomAllocList->choice.setup = NULLP;
3210 CU_ALLOC(timeDomAllocList->choice.setup, \
3211 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3212 if(!timeDomAllocList->choice.setup)
3214 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3219 timeDomAllocList->choice.setup->list.count = elementCnt;
3220 timeDomAllocList->choice.setup->list.size = \
3221 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3223 timeDomAllocList->choice.setup->list.array = NULLP;
3224 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3225 timeDomAllocList->choice.setup->list.size);
3226 if(!timeDomAllocList->choice.setup->list.array)
3228 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3232 for(idx = 0; idx < elementCnt; idx++)
3234 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3235 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3236 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3237 if(!timeDomAllocList->choice.setup->list.array[idx])
3239 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3245 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3246 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3247 if(!timeDomAlloc->k0)
3249 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3252 *(timeDomAlloc->k0) = 0;
3253 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3254 timeDomAlloc->startSymbolAndLength = 66;
3257 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3258 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3259 if(!timeDomAlloc->k0)
3261 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3264 *(timeDomAlloc->k0) = 1;
3265 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3266 timeDomAlloc->startSymbolAndLength = 66;
3271 /*******************************************************************
3273 * @brief Builds PDSCH PRB Bundling type
3277 * Function : BuildPdschPrbBundlingType
3279 * Functionality: Builds PDSCH PRB Bundling type
3282 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3284 * @return ROK - success
3287 * ****************************************************************/
3288 uint8_t BuildPdschPrbBundlingType
3290 struct PDSCH_Config__prb_BundlingType *prbBndlType
3293 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3295 prbBndlType->choice.staticBundling = NULLP;
3296 CU_ALLOC(prbBndlType->choice.staticBundling, \
3297 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3298 if(!prbBndlType->choice.staticBundling)
3300 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3303 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3308 /*******************************************************************
3310 * @brief Builds BWP DL dedicated PDSCH config
3314 * Function : BuildBWPDlDedPdschCfg
3316 * Functionality: Builds BWP DL dedicated PDSCH config
3318 * @params[in] struct PDSCH_Config *pdschCfg
3320 * @return ROK - success
3323 * ****************************************************************/
3324 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3326 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3328 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3329 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3330 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3331 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3333 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3337 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3342 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3343 pdschCfg->tci_StatesToAddModList = NULLP;
3344 pdschCfg->tci_StatesToReleaseList = NULLP;
3345 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3347 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3348 if(!pdschCfg->tci_StatesToAddModList)
3350 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3353 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3359 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3361 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3362 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3363 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3364 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3366 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3369 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3373 pdschCfg->pdsch_AggregationFactor = NULLP;
3374 pdschCfg->rateMatchPatternToAddModList = NULLP;
3375 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3376 pdschCfg->rateMatchPatternGroup1 = NULLP;
3377 pdschCfg->rateMatchPatternGroup2 = NULLP;
3378 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3379 pdschCfg->mcs_Table = NULLP;
3381 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3382 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3383 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3385 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3388 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3390 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3395 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3396 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3397 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3398 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3399 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3400 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3401 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3406 /*******************************************************************
3408 * @brief Builds intitial DL BWP
3411 * Function : BuildInitialDlBWP
3413 * Functionality: Builds intitial DL BWP in spCellCfgDed
3415 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3417 * @return ROK - success
3420 * ****************************************************************/
3421 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3423 dlBwp->pdcch_Config = NULLP;
3424 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3425 if(!dlBwp->pdcch_Config)
3427 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3430 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3432 dlBwp->pdcch_Config->choice.setup = NULLP;
3433 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3434 if(!dlBwp->pdcch_Config->choice.setup)
3436 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3439 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3444 dlBwp->pdsch_Config = NULLP;
3445 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3446 if(!dlBwp->pdsch_Config)
3448 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3451 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3453 dlBwp->pdsch_Config->choice.setup = NULLP;
3454 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3455 if(!dlBwp->pdsch_Config->choice.setup)
3457 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3461 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3466 dlBwp->sps_Config = NULLP;
3467 dlBwp->radioLinkMonitoringConfig = NULLP;
3471 /*******************************************************************
3473 * @brief Builds DMRS UL Pusch Mapping type A
3477 * Function : BuildDMRSULPuschMapTypeA
3479 * Functionality: Builds DMRS UL Pusch Mapping type A
3482 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3483 * @return ROK - success
3486 * ****************************************************************/
3487 uint8_t BuildDMRSULPuschMapTypeA
3489 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3492 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3493 dmrsUlCfg->choice.setup= NULLP;
3494 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3495 if(!dmrsUlCfg->choice.setup)
3497 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3501 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3502 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3503 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3504 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3506 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3509 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3511 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3512 dmrsUlCfg->choice.setup->maxLength = NULLP;
3513 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3514 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3515 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3516 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3518 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3522 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3523 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3525 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3527 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3530 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3532 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3533 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3537 /*******************************************************************
3539 * @brief Build PUSCH time domain allocation list
3543 * Function : BuildPuschTimeDomAllocList
3545 * Functionality: Build PUSCH time domain allocation list
3548 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3550 * @return ROK - success
3553 * ****************************************************************/
3554 uint8_t BuildPuschTimeDomAllocList
3556 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3561 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3563 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3564 timeDomAllocList->choice.setup = NULLP;
3565 CU_ALLOC(timeDomAllocList->choice.setup, \
3566 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3567 if(!timeDomAllocList->choice.setup)
3569 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3574 timeDomAllocList->choice.setup->list.count = elementCnt;
3575 timeDomAllocList->choice.setup->list.size = \
3576 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3577 timeDomAllocList->choice.setup->list.array = NULLP;
3578 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3579 timeDomAllocList->choice.setup->list.size);
3580 if(!timeDomAllocList->choice.setup->list.array)
3582 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3586 for(idx = 0; idx < elementCnt; idx++)
3588 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3589 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3590 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3591 if(!timeDomAllocList->choice.setup->list.array[idx])
3593 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3599 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3600 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3601 if(!timeDomAlloc->k2)
3603 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3606 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3607 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3608 timeDomAlloc->startSymbolAndLength = 66;
3611 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3612 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3613 if(!timeDomAlloc->k2)
3615 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3618 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3619 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3620 timeDomAlloc->startSymbolAndLength = 66;
3625 /*******************************************************************
3627 * @brief Builds BWP UL dedicated PUSCH Config
3631 * Function : BuildBWPUlDedPuschCfg
3634 * Builds BWP UL dedicated PUSCH Config
3636 * @params[in] : PUSCH_Config_t *puschCfg
3638 * @return ROK - success
3641 * ****************************************************************/
3642 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3644 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3645 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3646 if(!puschCfg->dataScramblingIdentityPUSCH)
3648 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3651 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3653 puschCfg->txConfig = NULLP;
3654 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3655 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3656 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3657 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3659 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3663 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3668 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3669 puschCfg->pusch_PowerControl = NULLP;
3670 puschCfg->frequencyHopping = NULLP;
3671 puschCfg->frequencyHoppingOffsetLists = NULLP;
3672 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3674 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3675 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3676 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3677 if(!puschCfg->pusch_TimeDomainAllocationList)
3679 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3683 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3688 puschCfg->pusch_AggregationFactor = NULLP;
3689 puschCfg->mcs_Table = NULLP;
3690 puschCfg->mcs_TableTransformPrecoder = NULLP;
3691 puschCfg->transformPrecoder = NULLP;
3692 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3693 if(!puschCfg->transformPrecoder)
3695 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3698 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3700 puschCfg->codebookSubset = NULLP;
3701 puschCfg->maxRank = NULLP;
3702 puschCfg->rbg_Size = NULLP;
3703 puschCfg->uci_OnPUSCH = NULLP;
3704 puschCfg->tp_pi2BPSK = NULLP;
3709 /*******************************************************************
3711 * @brief Builds BWP UL dedicated PUCCH Config
3715 * Function : BuildBWPUlDedPucchCfg
3718 * Builds BWP UL dedicated PUCCH Config
3720 * @params[in] : PUCCH_Config_t *pucchCfg
3722 * @return ROK - success
3725 * ****************************************************************/
3726 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3728 uint8_t arrIdx, elementCnt;
3730 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3731 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3733 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3738 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3739 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3740 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3741 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3743 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3747 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3749 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3750 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3752 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3758 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
3759 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
3764 /*******************************************************************
3766 * @brief Fills SRS resource to add/modify list
3770 * Function : BuildSrsRsrcAddModList
3772 * Functionality: Fills SRS resource to add/modify list
3775 * @return ROK - success
3778 * ****************************************************************/
3779 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3785 resourceList->list.count = elementCnt;
3786 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3787 resourceList->list.array = NULLP;
3788 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3789 if(!resourceList->list.array)
3791 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3795 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3797 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3798 if(!resourceList->list.array[rsrcIdx])
3800 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3806 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3807 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3808 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3810 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3811 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3812 sizeof(struct SRS_Resource__transmissionComb__n2));
3813 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3815 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3818 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3819 = SRS_COMB_OFFSET_N2;
3820 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3821 = SRS_CYCLIC_SHIFT_N2;
3823 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3825 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3826 SRS_Resource__resourceMapping__nrofSymbols_n1;
3827 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3828 SRS_Resource__resourceMapping__repetitionFactor_n1;
3830 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3831 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3832 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3833 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3834 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3835 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3836 SRS_Resource__groupOrSequenceHopping_neither;
3838 /* Setting resource type to aperiodic for intergration purposes */
3839 resourceList->list.array[rsrcIdx]->resourceType.present = \
3840 SRS_Resource__resourceType_PR_aperiodic;
3841 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3842 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3843 sizeof(struct SRS_Resource__resourceType__aperiodic));
3844 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3846 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3849 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3854 /*******************************************************************
3856 * @brief Build SRS resource set Add/mod list
3860 * Function : BuildSrsRsrcSetAddModList
3862 * Functionality: Build SRS resource set Add/mod list
3865 * @return ROK - success
3868 * ****************************************************************/
3869 uint8_t BuildSrsRsrcSetAddModList
3871 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3877 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3880 rsrcSetList->list.count = elementCnt;
3881 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3882 rsrcSetList->list.array = NULLP;
3883 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3884 if(!rsrcSetList->list.array)
3886 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3890 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3892 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3893 if(!rsrcSetList->list.array[rSetIdx])
3895 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3901 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3903 /* Fill Resource Id list in resource set */
3904 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3905 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3906 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3907 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3909 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3914 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3915 rsrcIdList->list.count = elementCnt;
3916 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3917 rsrcIdList->list.array = NULLP;
3918 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3919 if(!rsrcIdList->list.array)
3921 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3925 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3927 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3928 if(!rsrcIdList->list.array[rsrcIdx])
3930 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3936 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3938 /* Fill resource type */
3939 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3940 SRS_ResourceSet__resourceType_PR_aperiodic;
3942 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3943 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3944 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3945 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3947 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3950 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3951 = APERIODIC_SRS_RESRC_TRIGGER;
3953 /* TODO : Fill values for below IEs as expected by Viavi */
3954 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3955 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3958 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3959 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3960 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3961 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3962 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3967 /*******************************************************************
3969 * @brief Builds BWP UL dedicated SRS Config
3973 * Function : BuildBWPUlDedSrsCfg
3975 * Functionality: Builds BWP UL dedicated SRS Config
3977 * @params[in] SRS Config
3978 * @return ROK - success
3981 * ****************************************************************/
3982 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3984 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3985 srsCfg->srs_ResourceSetToAddModList = NULLP;
3986 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3987 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3988 if(!srsCfg->srs_ResourceSetToAddModList)
3990 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3993 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3998 srsCfg->srs_ResourceToReleaseList = NULLP;
4000 /* Resource to Add/Modify list */
4001 srsCfg->srs_ResourceToAddModList = NULLP;
4002 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4003 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4004 if(!srsCfg->srs_ResourceToAddModList)
4006 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4010 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4015 srsCfg->tpc_Accumulation = NULLP;
4020 /*******************************************************************
4022 * @brief Builds inital UL BWP
4026 * Function : BuildInitialUlBWP
4028 * Functionality: Builds initial UL BWP
4030 * @params[in] BWP_UplinkDedicated_t *ulBwp
4031 * @return ROK - success
4034 * ****************************************************************/
4035 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4037 ulBwp->pucch_Config = NULLP;
4038 ulBwp->pucch_Config = NULLP;
4039 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4040 if(!ulBwp->pucch_Config)
4042 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4046 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4047 ulBwp->pucch_Config->choice.setup = NULLP;
4048 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4049 if(!ulBwp->pucch_Config->choice.setup)
4051 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4055 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4060 /* Fill BWP UL dedicated PUSCH config */
4061 ulBwp->pusch_Config = NULLP;
4062 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4063 if(!ulBwp->pusch_Config)
4065 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4069 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4070 ulBwp->pusch_Config->choice.setup = NULLP;
4071 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4072 if(!ulBwp->pusch_Config->choice.setup)
4074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4078 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4083 ulBwp->configuredGrantConfig = NULLP;
4085 /* Fill BPW UL dedicated SRS config */
4086 ulBwp->srs_Config = NULLP;
4087 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4088 if(!ulBwp->srs_Config)
4090 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4094 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4095 ulBwp->srs_Config->choice.setup = NULLP;
4096 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4097 if(!ulBwp->srs_Config->choice.setup)
4099 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4103 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4108 ulBwp->beamFailureRecoveryConfig = NULLP;
4113 /*******************************************************************
4115 * @brief Builds Pusch Serving cell Config
4119 * Function : BuildPuschSrvCellCfg
4121 * Functionality: Builds Pusch Serving cell Config
4123 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4125 * @return ROK - success
4128 * ****************************************************************/
4129 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4131 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4132 puschCfg->choice.setup = NULLP;
4133 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4134 if(!puschCfg->choice.setup)
4136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4140 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4141 puschCfg->choice.setup->rateMatching = NULLP;
4142 puschCfg->choice.setup->xOverhead = NULLP;
4143 puschCfg->choice.setup->ext1 = NULLP;
4144 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4145 if(!puschCfg->choice.setup->ext1)
4147 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4151 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4152 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4153 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4158 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4160 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4161 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4162 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4164 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4167 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4171 /*******************************************************************
4173 * @brief Builds UL config
4176 * Function : BuildUlCfg
4178 * Functionality: Builds UL config in spCellCfgDed
4180 * @params[in] UplinkConfig_t *ulCfg
4182 * @return ROK - success
4185 * ****************************************************************/
4186 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4188 ulCfg->initialUplinkBWP = NULLP;
4189 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4190 if(!ulCfg->initialUplinkBWP)
4192 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4196 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4201 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4202 ulCfg->uplinkBWP_ToAddModList = NULLP;
4203 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4204 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4205 if(!ulCfg->firstActiveUplinkBWP_Id)
4207 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4210 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4212 ulCfg->pusch_ServingCellConfig = NULLP;
4213 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4214 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4215 if(!ulCfg->pusch_ServingCellConfig)
4217 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4221 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4226 ulCfg->carrierSwitching = NULLP;
4227 ulCfg->ext1 = NULLP;
4231 /*******************************************************************
4233 * @brief Builds PDSCH serving cell config
4236 * Function : BuildPdschSrvCellCfg
4238 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4240 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4242 * @return ROK - success
4245 * ****************************************************************/
4246 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4248 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4249 pdschCfg->choice.setup = NULLP;
4250 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4251 if(!pdschCfg->choice.setup)
4253 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4257 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4258 pdschCfg->choice.setup->xOverhead = NULLP;
4259 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4260 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4261 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4263 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4266 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4267 pdschCfg->choice.setup->pucch_Cell = NULLP;
4268 pdschCfg->choice.setup->ext1 = NULLP;
4273 /*******************************************************************
4275 * @brief Builds CSI Meas config
4278 * Function : BuildCsiMeasCfg
4280 * Functionality: Builds CSI Meas config in spCellCfgDed
4282 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4284 * @return ROK - success
4287 * ****************************************************************/
4288 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4294 /*******************************************************************
4296 * @brief Builds Spcell config dedicated
4299 * Function : BuildSpCellCfgDed
4301 * Functionality: Builds sp cell config dedicated in spCellCfg
4303 * @params[in] ServingCellConfig_t srvCellCfg
4305 * @return ROK - success
4308 * ****************************************************************/
4309 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4311 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4313 srvCellCfg->initialDownlinkBWP = NULLP;
4314 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4315 if(!srvCellCfg->initialDownlinkBWP)
4317 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4321 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4323 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4326 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4327 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4329 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4330 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4331 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4333 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4336 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4338 srvCellCfg->bwp_InactivityTimer = NULLP;
4340 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4341 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4342 if(!srvCellCfg->defaultDownlinkBWP_Id)
4344 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4347 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4349 srvCellCfg->uplinkConfig = NULLP;
4350 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4351 if(!srvCellCfg->uplinkConfig)
4353 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4357 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4359 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4362 srvCellCfg->supplementaryUplink = NULLP;
4363 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4365 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4366 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4367 if(!srvCellCfg->pdsch_ServingCellConfig)
4369 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4373 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4375 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4379 srvCellCfg->csi_MeasConfig = NULLP;
4381 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4382 if(!srvCellCfg->csi_MeasConfig)
4384 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4388 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4390 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4394 srvCellCfg->sCellDeactivationTimer = NULLP;
4395 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4396 srvCellCfg->tag_Id = TAG_ID;
4397 srvCellCfg->dummy = NULLP;
4398 srvCellCfg->pathlossReferenceLinking = NULLP;
4399 srvCellCfg->servingCellMO = NULLP;
4400 srvCellCfg->ext1 = NULLP;
4404 /*******************************************************************
4406 * @brief Builds Spcell config
4410 * Function : BuildSpCellCfg
4412 * Functionality: Builds sp cell config in DuToCuRrcContainer
4414 * @params[in] SpCellConfig_t spCellCfg
4416 * @return ROK - success
4419 * ****************************************************************/
4420 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4423 spCellCfg->servCellIndex = NULLP;
4424 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4425 if(!spCellCfg->servCellIndex)
4427 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4430 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4432 spCellCfg->reconfigurationWithSync = NULLP;
4433 spCellCfg->rlf_TimersAndConstants = NULLP;
4434 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4435 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4436 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4438 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4441 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4443 spCellCfg->spCellConfigDedicated = NULLP;
4444 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4445 if(!spCellCfg->spCellConfigDedicated)
4447 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4450 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4452 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4457 /*******************************************************************
4459 * @brief Builds Phy cell group config
4463 * Function : BuildPhyCellGrpCfg
4465 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4467 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4469 * @return ROK - success
4472 * ****************************************************************/
4473 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4475 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4476 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4478 phyCellGrpCfg->p_NR_FR1 = NULLP;
4479 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4480 if(!phyCellGrpCfg->p_NR_FR1)
4482 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4485 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4486 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4487 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4488 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4489 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4490 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4491 phyCellGrpCfg->cs_RNTI = NULLP;
4492 phyCellGrpCfg->ext1 = NULLP;
4493 phyCellGrpCfg->ext2 = NULLP;
4498 /*******************************************************************
4500 * @brief Builds tag config
4504 * Function : BuildTagConfig
4506 * Functionality: Builds tag config in MacCellGroupConfig
4508 * @params[in] TAG_Config *tag_Config
4510 * @return ROK - success
4513 * ****************************************************************/
4514 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4516 struct TAG_Config__tag_ToAddModList *tagList;
4517 uint8_t idx, elementCnt;
4519 tagConfig->tag_ToReleaseList = NULLP;
4520 tagConfig->tag_ToAddModList = NULLP;
4521 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4522 if(!tagConfig->tag_ToAddModList)
4524 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4528 elementCnt = 1; //ODU_VALUE_ONE;
4529 tagList = tagConfig->tag_ToAddModList;
4530 tagList->list.count = elementCnt;
4531 tagList->list.size = elementCnt * sizeof(struct TAG *);
4533 tagList->list.array = NULLP;
4534 CU_ALLOC(tagList->list.array, tagList->list.size);
4535 if(!tagList->list.array)
4537 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4541 for(idx=0; idx<tagList->list.count; idx++)
4543 tagList->list.array[idx] = NULLP;
4544 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4545 if(!tagList->list.array[idx])
4547 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4553 tagList->list.array[idx]->tag_Id = TAG_ID;
4554 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4559 /*******************************************************************
4561 * @brief Builds PHR Config
4565 * Function : BuildPhrConfig
4567 * Functionality: Builds phrConfig in MacCellGroupConfig
4569 * @params[in] PHR Config *
4571 * @return ROK - success
4574 * ****************************************************************/
4575 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4578 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4579 phrConfig->choice.setup = NULLP;
4580 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4581 if(!phrConfig->choice.setup)
4583 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4587 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4588 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4589 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4590 phrConfig->choice.setup->multiplePHR = false;
4591 phrConfig->choice.setup->dummy = false;
4592 phrConfig->choice.setup->phr_Type2OtherCell = false;
4593 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4598 /*******************************************************************
4600 * @brief Builds BSR Config
4604 * Function : BuildBsrConfig
4606 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4608 * @params[in] BSR_Config *bsrConfig
4610 * @return ROK - success
4613 * ****************************************************************/
4614 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4616 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4617 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4618 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4623 /*******************************************************************
4625 * @brief Builds scheduling request config
4629 * Function : BuildSchedulingReqConfig
4631 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4633 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4635 * @return ROK - success
4638 * ****************************************************************/
4639 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4641 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4642 uint8_t idx, elementCnt;
4644 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4645 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4646 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4647 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4649 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4653 elementCnt = 1; //ODU_VALUE_ONE;
4654 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4655 schReqList->list.count = elementCnt;
4656 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4658 schReqList->list.array = NULLP;
4659 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4660 if(!schReqList->list.array)
4662 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4666 for(idx=0;idx<schReqList->list.count; idx++)
4668 schReqList->list.array[idx] = NULLP;
4669 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4670 if(!schReqList->list.array[idx])
4672 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4678 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4680 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4681 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4682 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4684 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4687 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4688 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4689 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4693 /*******************************************************************
4695 * @brief Builds Mac cell group config
4699 * Function : BuildMacCellGrpCfg
4701 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4703 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4705 * @return ROK - success
4708 * ****************************************************************/
4709 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4711 macCellGrpCfg->drx_Config = NULLP;
4712 macCellGrpCfg->schedulingRequestConfig = NULLP;
4713 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4714 if(!macCellGrpCfg->schedulingRequestConfig)
4716 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4720 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4722 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4726 macCellGrpCfg->bsr_Config = NULLP;
4727 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4728 if(!macCellGrpCfg->bsr_Config)
4730 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4734 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4736 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4740 macCellGrpCfg->tag_Config = NULLP;
4741 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4742 if(!macCellGrpCfg->tag_Config)
4744 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4748 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4750 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4754 macCellGrpCfg->phr_Config = NULLP;
4755 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4756 if(!macCellGrpCfg->phr_Config)
4758 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4762 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4764 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4768 macCellGrpCfg->skipUplinkTxDynamic = false;
4769 macCellGrpCfg->ext1 = NULLP;
4773 /*******************************************************************
4775 * @brief Frees memeory allocated for SearchSpcToAddModList
4779 * Function : FreeSearchSpcToAddModList
4781 * Functionality: Deallocating memory of SearchSpcToAddModList
4783 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4787 4221 * ****************************************************************/
4788 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4792 struct SearchSpace *searchSpc=NULLP;
4794 if(searchSpcList->list.array)
4796 if(searchSpcList->list.array[idx2])
4798 searchSpc = searchSpcList->list.array[idx2];
4799 if(searchSpc->controlResourceSetId)
4801 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4803 if(searchSpc->monitoringSymbolsWithinSlot)
4805 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4807 if(searchSpc->nrofCandidates)
4809 if(searchSpc->searchSpaceType)
4811 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4812 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4813 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4814 SearchSpace__searchSpaceType));
4816 CU_FREE(searchSpc->nrofCandidates,
4817 sizeof(struct SearchSpace__nrofCandidates));
4819 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4820 searchSpc->monitoringSymbolsWithinSlot->size);
4822 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4823 sizeof(BIT_STRING_t));
4825 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4826 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4828 CU_FREE(searchSpc->controlResourceSetId,
4829 sizeof(ControlResourceSetId_t));
4832 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4834 CU_FREE(searchSpcList->list.array[idx1],
4835 sizeof(struct SearchSpace));
4837 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4840 /*******************************************************************
4842 * @brief Frees memory allocated for PdschTimeDomAllocList
4846 * Function : FreePdschTimeDomAllocList
4848 * Functionality: Deallocating memory of PdschTimeDomAllocList
4850 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4854 4221 * ****************************************************************/
4855 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4859 if(timeDomAllocList->choice.setup)
4861 if(timeDomAllocList->choice.setup->list.array)
4863 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4865 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4866 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4868 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4869 timeDomAllocList->choice.setup->list.size);
4871 CU_FREE(timeDomAllocList->choice.setup,\
4872 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4875 /*******************************************************************
4877 * @brief Frees memory allocated for PuschTimeDomAllocList
4881 * Function : FreePuschTimeDomAllocList
4883 * Functionality: Deallocating memory of PuschTimeDomAllocList
4885 * @params[in] PUSCH_Config_t *puschCfg
4889 ***********************************************************************/
4890 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4894 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4896 if(puschCfg->pusch_TimeDomainAllocationList)
4898 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4899 if(timeDomAllocList_t->choice.setup)
4901 if(timeDomAllocList_t->choice.setup->list.array)
4903 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4904 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4906 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4907 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4909 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4910 timeDomAllocList_t->choice.setup->list.size);
4912 CU_FREE(timeDomAllocList_t->choice.setup, \
4913 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4915 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4916 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4917 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4921 /*******************************************************************
4923 * @brief Frees memory allocated for InitialUlBWP
4927 * Function : FreeInitialUlBWP
4929 * Functionality: Deallocating memory of InitialUlBWP
4931 * @params[in] BWP_UplinkDedicated_t *ulBwp
4935 * ****************************************************************/
4936 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4938 uint8_t rSetIdx, rsrcIdx;
4939 SRS_Config_t *srsCfg = NULLP;
4940 PUSCH_Config_t *puschCfg = NULLP;
4941 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4942 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4943 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4944 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4946 if(ulBwp->pusch_Config)
4948 if(ulBwp->pusch_Config->choice.setup)
4950 puschCfg=ulBwp->pusch_Config->choice.setup;
4951 if(puschCfg->dataScramblingIdentityPUSCH)
4953 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4955 FreePuschTimeDomAllocList(puschCfg);
4956 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4957 if(dmrsUlCfg->choice.setup)
4959 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4961 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4963 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4965 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4966 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4968 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4971 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4973 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4974 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4976 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4978 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4980 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4982 /* Free SRS-Config */
4983 if(ulBwp->srs_Config)
4985 if(ulBwp->srs_Config->choice.setup)
4987 srsCfg = ulBwp->srs_Config->choice.setup;
4989 /* Free Resource Set to add/mod list */
4990 if(srsCfg->srs_ResourceSetToAddModList)
4992 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4993 if(rsrcSetList->list.array)
4997 /* Free SRS resource Id list in this SRS resource set */
4998 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5000 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5002 if(rsrcIdList->list.array)
5004 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5006 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5008 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5010 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5011 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5014 /* Free resource type info for this SRS resource set */
5015 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5016 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5018 /* Free memory for each resource set */
5019 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5021 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5023 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5025 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5026 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5029 /* Free resource to add/modd list */
5030 if(srsCfg->srs_ResourceToAddModList)
5032 resourceList = srsCfg->srs_ResourceToAddModList;
5033 if(resourceList->list.array)
5036 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5037 sizeof(struct SRS_Resource__transmissionComb__n2));
5038 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5039 sizeof(struct SRS_Resource__resourceType__aperiodic));
5041 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5043 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5045 CU_FREE(resourceList->list.array, resourceList->list.size);
5047 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5048 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5051 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5053 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5057 /*******************************************************************
5059 * @brief Frees memory allocated for initialUplinkBWP
5063 * Function : FreeinitialUplinkBWP
5065 * Functionality: Deallocating memory of initialUplinkBWP
5067 * @params[in] UplinkConfig_t *ulCfg
5072 * ****************************************************************/
5073 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5075 BWP_UplinkDedicated_t *ulBwp=NULLP;
5076 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5078 if(ulCfg->initialUplinkBWP)
5080 ulBwp=ulCfg->initialUplinkBWP;
5081 if(ulCfg->firstActiveUplinkBWP_Id)
5083 if(ulCfg->pusch_ServingCellConfig)
5085 puschCfg=ulCfg->pusch_ServingCellConfig;
5086 if(puschCfg->choice.setup)
5088 if(puschCfg->choice.setup->ext1)
5090 CU_FREE(puschCfg->choice.setup->ext1->\
5091 processingType2Enabled,sizeof(BOOLEAN_t));
5092 CU_FREE(puschCfg->choice.setup->ext1->\
5093 maxMIMO_Layers,sizeof(long));
5094 CU_FREE(puschCfg->choice.setup->ext1, \
5095 sizeof(struct PUSCH_ServingCellConfig__ext1));
5097 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5099 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5101 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5103 FreeInitialUlBWP(ulBwp);
5104 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5107 /*******************************************************************
5109 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5113 * Function : FreeBWPDlDedPdschCfg
5115 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5117 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5122 * ****************************************************************/
5123 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5125 struct PDSCH_Config *pdschCfg=NULLP;
5126 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5127 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5128 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5130 if(dlBwp->pdsch_Config->choice.setup)
5132 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5133 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5135 if(pdschCfg->pdsch_TimeDomainAllocationList)
5137 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5138 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5140 prbBndlType=&pdschCfg->prb_BundlingType;
5141 CU_FREE(prbBndlType->choice.staticBundling,\
5142 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5143 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5145 FreePdschTimeDomAllocList(timeDomAllocList);
5146 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5147 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5149 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5150 if(dmrsDlCfg->choice.setup)
5152 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5154 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5156 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5157 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5159 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5162 /*******************************************************************
5164 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5168 * Function : FreeBWPDlDedPdcchCfg
5170 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5172 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5177 * ****************************************************************/
5178 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5182 struct PDCCH_Config *pdcchCfg=NULLP;
5183 struct ControlResourceSet *controlRSet=NULLP;
5184 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5186 if(dlBwp->pdcch_Config->choice.setup)
5188 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5189 if(pdcchCfg->controlResourceSetToAddModList)
5191 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5192 if(controlRSetList->list.array)
5194 controlRSet = controlRSetList->list.array[idx2];
5197 if(controlRSet->frequencyDomainResources.buf)
5199 if(controlRSet->pdcch_DMRS_ScramblingID)
5201 if(pdcchCfg->searchSpacesToAddModList)
5203 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5204 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5205 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5207 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5209 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5210 controlRSet->frequencyDomainResources.size);
5213 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5215 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5217 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5219 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5220 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5222 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5225 /*******************************************************************
5227 * @brief Builds RLC Config
5231 * Function : BuildRlcConfig
5233 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5235 * @params[in] RLC_Config *rlcConfig
5237 * @return ROK - success
5240 * ****************************************************************/
5241 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5244 rlcConfig->present = RLC_Config_PR_am;
5246 rlcConfig->choice.am = NULLP;
5247 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5248 if(!rlcConfig->choice.am)
5250 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5255 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5256 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5257 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5259 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5262 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5263 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5264 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5265 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5266 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5269 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5270 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5271 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5273 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5276 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5277 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5278 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5283 /*******************************************************************
5285 * @brief Builds MAC LC Config
5289 * Function : BuildMacLCConfig
5291 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5293 * @params[in] struct LogicalChannelConfig macLcConfig
5295 * @return ROK - success
5298 * ****************************************************************/
5299 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5302 macLcConfig->ul_SpecificParameters = NULLP;
5303 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5304 if(!macLcConfig->ul_SpecificParameters)
5306 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5310 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5311 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5312 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5313 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5314 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5315 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5316 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5318 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5319 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5320 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5322 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5325 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5327 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5328 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5329 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5331 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5334 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5336 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5337 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5338 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5342 /*******************************************************************
5344 * @brief Builds RLC Bearer to Add/Mod list
5348 * Function :BuildRlcBearerToAddModList
5350 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5352 * @params[in] rlc_BearerToAddModList
5354 * @return ROK - success
5357 * ****************************************************************/
5358 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5360 uint8_t idx, elementCnt;
5363 rlcBearerList->list.count = elementCnt;
5364 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5366 rlcBearerList->list.array = NULLP;
5367 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5368 if(!rlcBearerList->list.array)
5370 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5374 for(idx=0; idx<rlcBearerList->list.count; idx++)
5376 rlcBearerList->list.array[idx] = NULLP;
5377 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5378 if(!rlcBearerList->list.array[idx])
5380 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5386 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5388 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5389 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5391 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5395 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5396 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5398 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5399 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5400 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5401 if(!rlcBearerList->list.array[idx]->rlc_Config)
5403 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5407 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5409 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5413 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5414 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5415 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5417 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5421 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5423 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5430 /*******************************************************************
5432 * @brief Free memory allocated for CellGroupConfig
5436 * Function : FreeMemCellGrpCfg
5438 * Functionality: Deallocating memory of CellGroupConfig
5440 * @params[in] pointer to CellGroupConfigRrc_t
5442 * @return ROK - success
5445 ******************************************************************/
5446 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5449 SpCellConfig_t *spCellCfg=NULLP;
5450 ServingCellConfig_t *srvCellCfg=NULLP;
5451 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5452 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5453 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5454 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5455 struct RLC_Config *rlcConfig=NULLP;
5456 struct LogicalChannelConfig *macLcConfig=NULLP;
5457 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5458 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5459 struct TAG_Config *tagConfig=NULLP;
5460 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5461 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5462 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5464 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5467 if(rlcBearerList->list.array)
5469 for(idx=0; idx<rlcBearerList->list.count; idx++)
5471 if(rlcBearerList->list.array[idx])
5473 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5474 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5477 if(rlcConfig->choice.am)
5479 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5480 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5481 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5483 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5485 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5488 if(macLcConfig->ul_SpecificParameters)
5490 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5491 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5492 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5494 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5496 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5499 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5501 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5504 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5507 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5508 if(schedulingRequestConfig)
5510 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5513 if(schReqList->list.array)
5515 for(idx=0;idx<schReqList->list.count; idx++)
5517 if(schReqList->list.array[idx])
5519 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5520 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5523 CU_FREE(schReqList->list.array, schReqList->list.size);
5525 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5526 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5527 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5529 if(macCellGrpCfg->bsr_Config)
5531 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5533 tagConfig = macCellGrpCfg->tag_Config;
5536 tagList = tagConfig->tag_ToAddModList;
5539 if(tagList->list.array)
5541 for(idx=0; idx<tagList->list.count; idx++)
5543 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5545 CU_FREE(tagList->list.array, tagList->list.size);
5547 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5549 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5552 phrConfig = macCellGrpCfg->phr_Config;
5555 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5556 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5559 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5562 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5565 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5566 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5569 spCellCfg = cellGrpCfg->spCellConfig;
5572 if(spCellCfg->servCellIndex)
5574 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5576 if(spCellCfg->spCellConfigDedicated)
5578 srvCellCfg = spCellCfg->spCellConfigDedicated;
5579 if(srvCellCfg->initialDownlinkBWP)
5581 dlBwp = srvCellCfg->initialDownlinkBWP;
5582 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5584 if(srvCellCfg->defaultDownlinkBWP_Id)
5586 if(srvCellCfg->uplinkConfig)
5588 if(srvCellCfg->pdsch_ServingCellConfig)
5590 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5591 if(pdschCfg->choice.setup)
5593 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5594 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5596 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5597 ServingCellConfig__pdsch_ServingCellConfig));
5599 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5600 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5602 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5604 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5606 if(dlBwp->pdcch_Config)
5608 if(dlBwp->pdsch_Config)
5610 FreeBWPDlDedPdschCfg(dlBwp);
5611 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5613 FreeBWPDlDedPdcchCfg(dlBwp);
5614 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5616 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5618 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5620 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5622 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5624 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5629 /*******************************************************************
5631 * @brief Fills CellGroupConfig
5635 * Function : fillCellGrpCfg
5637 * Functionality: Fills CellGroupConfig
5639 * @params[in] pointer to CellGroupConfigRrc_t
5641 * @return ROK - success
5644 ******************************************************************/
5646 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5648 uint8_t ret = RFAILED;
5649 CellGroupConfigRrc_t cellGrpCfg;
5650 asn_enc_rval_t encRetVal;
5654 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5656 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5657 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5658 if(!cellGrpCfg.rlc_BearerToAddModList)
5660 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5663 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5665 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5669 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5670 cellGrpCfg.mac_CellGroupConfig = NULLP;
5671 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5672 if(!cellGrpCfg.mac_CellGroupConfig)
5674 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5677 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5679 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5684 cellGrpCfg.physicalCellGroupConfig = NULLP;
5685 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5686 if(!cellGrpCfg.physicalCellGroupConfig)
5688 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5691 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5693 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5697 cellGrpCfg.spCellConfig = NULLP;
5698 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5699 if(!cellGrpCfg.spCellConfig)
5701 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5704 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5706 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5710 cellGrpCfg.sCellToAddModList = NULLP;
5711 cellGrpCfg.sCellToReleaseList = NULLP;
5712 cellGrpCfg.ext1 = NULLP;
5714 /* encode cellGrpCfg into duToCuRrcContainer */
5715 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5716 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5718 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5719 /* Encode results */
5720 if(encRetVal.encoded == ENCODE_FAIL)
5722 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5723 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5728 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5729 for(int i=0; i< encBufSize; i++)
5731 DU_LOG("%x",encBuf[i]);
5735 cellGrp->size = encBufSize;
5736 CU_ALLOC(cellGrp->buf, cellGrp->size);
5739 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5742 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5746 FreeMemCellGrpCfg(&cellGrpCfg);
5750 /*******************************************************************
5752 * @brief Free UE Capability RAT container
5756 * Function : freeUeCapRatCont
5759 * Free UE Capability RAT conatiner
5762 * @return ROK - success
5765 * ****************************************************************/
5766 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5769 FeatureSets_t *featureSets;
5771 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5773 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5775 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5776 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5778 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5781 if(ueNrCap->featureSets)
5783 featureSets = ueNrCap->featureSets;
5784 if(featureSets->featureSetsDownlinkPerCC)
5786 if(featureSets->featureSetsDownlinkPerCC->list.array)
5788 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5790 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5791 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5792 sizeof(ModulationOrder_t));
5793 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5795 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5797 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5800 if(featureSets->featureSetsUplinkPerCC)
5802 if(featureSets->featureSetsUplinkPerCC->list.array)
5804 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5806 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5808 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5809 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5810 sizeof(ModulationOrder_t));
5811 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5814 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5816 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5818 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5822 /*******************************************************************
5824 * @brief Free UE capability RAT container list
5828 * Function : freeUeCapRatContList
5830 * Functionality: Free UE capability RAT container list
5833 * @return ROK - success
5836 * ****************************************************************/
5837 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5840 if(ueCapablityList->list.array)
5842 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5844 if(ueCapablityList->list.array[idx])
5845 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5847 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5851 /*******************************************************************
5853 * @brief Fill feature sets
5857 * Function : fillFeatureSets
5859 * Functionality: Fill feature sets
5862 * @return ROK - success
5865 * ****************************************************************/
5866 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5868 uint8_t idx, elementCnt;
5870 featureSets->featureSetsDownlink = NULLP;
5871 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5872 if(!featureSets->featureSetsDownlinkPerCC)
5874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5879 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5880 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5881 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5882 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5884 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5888 for(idx = 0; idx < elementCnt; idx++)
5890 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5891 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5893 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5899 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5900 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5901 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5902 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5903 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5905 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5906 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5908 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5911 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5913 featureSets->featureSetsUplink = NULLP;
5914 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5915 if(!featureSets->featureSetsUplinkPerCC)
5917 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5922 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5923 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5924 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5925 if(!featureSets->featureSetsUplinkPerCC->list.array)
5927 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5931 for(idx = 0; idx < elementCnt; idx++)
5933 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5934 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5936 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5942 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5943 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5944 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5945 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5946 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5947 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5949 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5950 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5952 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5955 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5960 /*******************************************************************
5962 * @brief Fill UE capability RAT container
5966 * Function : fillUeCapRatCont
5968 * Functionality: Fill UE capability RAT container
5970 * @params[in] UE Capability RAT container buffer
5971 * @return ROK - success
5974 * ****************************************************************/
5975 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5978 uint8_t idx, elementCnt;
5979 asn_enc_rval_t encRetVal;
5980 UE_NR_Capability_t ueNrCap;
5984 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5986 /* Filling PDCP parameters */
5987 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5988 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5989 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5990 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5991 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5992 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5993 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5994 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5995 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5996 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5997 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5998 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5999 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6000 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6001 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6002 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6003 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6005 ueNrCap.rlc_Parameters = NULLP;
6006 ueNrCap.mac_Parameters = NULLP;
6008 /* Filling PHY parameters */
6009 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6010 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6011 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6012 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6013 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6015 /* Filling RF parameters */
6017 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6018 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6019 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6020 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6022 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6027 for(idx = 0; idx < elementCnt; idx++)
6029 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6030 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6040 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6041 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6042 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6044 ueNrCap.measAndMobParameters = NULLP;
6045 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6046 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6047 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6048 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6049 ueNrCap.featureSets = NULLP;
6051 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6052 if(!ueNrCap.featureSets)
6054 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6059 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6061 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6066 ueNrCap.featureSetCombinations = NULLP;
6067 ueNrCap.lateNonCriticalExtension = NULLP;
6068 ueNrCap.nonCriticalExtension = NULLP;
6070 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6071 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6072 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6074 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6076 /* Encode results */
6077 if(encRetVal.encoded == ENCODE_FAIL)
6079 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6080 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6085 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6086 for(int i=0; i< encBufSize; i++)
6088 DU_LOG("%x",encBuf[i]);
6092 ueCapRatContBuf->size = encBufSize;
6093 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6094 if(!ueCapRatContBuf->buf)
6096 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6099 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6103 freeUeCapRatCont(&ueNrCap);
6107 /*******************************************************************
6109 * @brief Fill UE Capability RAT container list
6113 * Function : fillUeCapRatContList
6115 * Functionality: Fill UE Capability RAT container list
6118 * @params[in] UE capability RAT container list buffer
6119 * @return ROK - success
6122 * ****************************************************************/
6123 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6125 uint8_t ret = RFAILED;
6126 uint8_t idx, elementCnt;
6127 asn_enc_rval_t encRetVal;
6128 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6133 ueCapablityList.list.count = elementCnt;
6134 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6136 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6137 if(!ueCapablityList.list.array)
6139 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6144 for(idx=0; idx<elementCnt; idx++)
6146 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6147 if(ueCapablityList.list.array[idx] == NULLP)
6149 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6155 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6156 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6158 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6159 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6160 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6162 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6163 &ueCapablityList, PrepFinalEncBuf, encBuf);
6165 /* Encode results */
6166 if(encRetVal.encoded == ENCODE_FAIL)
6168 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6169 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6174 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6175 for(int i=0; i< encBufSize; i++)
6177 DU_LOG("%x",encBuf[i]);
6181 ueCapablityListBuf->size = encBufSize;
6182 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6183 if(!ueCapablityListBuf->buf)
6185 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6188 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6192 freeUeCapRatContList(&ueCapablityList);
6196 /*******************************************************************
6198 * @brief Fills CuToDuContainer
6202 * Function : fillCuToDuContainer
6204 * Functionality: Fills CuToDuContainer
6206 * @params[in] pointer to CUtoDURRCInformation_t
6208 * @return ROK - success
6211 ******************************************************************/
6213 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6215 uint8_t elementCnt = 0;
6217 uint8_t idx, idx2, rrcBufLen;
6219 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6220 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6222 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6225 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6227 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6228 if(rrcMsg->iE_Extensions)
6231 rrcMsg->iE_Extensions->list.count = elementCnt;
6232 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6234 /* Initialize the CUtoDURRCInformation_ExtIEs */
6235 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6237 if(rrcMsg->iE_Extensions->list.array == NULLP)
6239 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6243 for(idx=0; idx<elementCnt; idx++)
6245 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6246 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6252 /* Filling CellGroupConfig_t IE */
6253 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6254 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6255 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6256 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6257 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6262 /*******************************************************************
6264 * @brief Free CuToDuContainer
6268 * Function : FreeCuToDuInfo
6270 * Functionality: Free CuToDuContainer
6272 * @params[in] pointer to CUtoDURRCInformation_t
6274 * @return ROK - success
6277 ******************************************************************/
6279 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6283 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6285 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6286 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6287 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6289 if(rrcMsg->iE_Extensions)
6291 if(rrcMsg->iE_Extensions->list.array)
6293 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6295 if(rrcMsg->iE_Extensions->list.array[idx])
6297 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6299 case ProtocolIE_ID_id_CellGroupConfig:
6300 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6302 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6303 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6308 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6309 rrcMsg->iE_Extensions->list.array[idx]->id);
6315 for(idx2 = 0; idx2 < idx; idx2++)
6317 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6319 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6323 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6326 /*******************************************************************
6328 * @brief Builds and sends the UE Setup Request
6332 * Function : BuildAndSendUeContextSetupReq
6334 * Functionality: Constructs the UE Setup Request and sends
6335 * it to the CU through SCTP.
6339 * @return ROK - success
6342 * ****************************************************************/
6343 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6344 uint16_t rrcContLen, uint8_t *rrcContainer)
6347 uint8_t SplCellListret;
6348 uint8_t SrbSetupret;
6350 uint8_t idx, bufLen;
6352 F1AP_PDU_t *f1apMsg = NULLP;
6353 UEContextSetupRequest_t *ueSetReq = NULLP;
6354 asn_enc_rval_t encRetVal; /* Encoder return value */
6355 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6356 uint8_t ret= RFAILED;
6360 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6362 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6363 if(f1apMsg == NULLP)
6365 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6369 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6370 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6371 if(f1apMsg->choice.initiatingMessage == NULLP)
6373 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6377 f1apMsg->choice.initiatingMessage->procedureCode = \
6378 ProcedureCode_id_UEContextSetup;
6379 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6380 f1apMsg->choice.initiatingMessage->value.present = \
6381 InitiatingMessage__value_PR_UEContextSetupRequest;
6383 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6386 ueSetReq->protocolIEs.list.count = elementCnt;
6387 ueSetReq->protocolIEs.list.size = \
6388 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6390 /* Initialize the UESetup members */
6391 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6393 if(ueSetReq->protocolIEs.list.array == NULLP)
6395 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6399 for(idx1=0; idx1<elementCnt; idx1++)
6401 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6402 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6410 /*GNB CU UE F1AP ID*/
6411 ueSetReq->protocolIEs.list.array[idx]->id = \
6412 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6413 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6414 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6415 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6416 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6418 /*GNB DU UE F1AP ID*/
6420 ueSetReq->protocolIEs.list.array[idx]->id = \
6421 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6422 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6423 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6424 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6425 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6429 ueSetReq->protocolIEs.list.array[idx]->id = \
6430 ProtocolIE_ID_id_SpCell_ID;
6431 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6432 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6433 UEContextSetupRequestIEs__value_PR_NRCGI;
6434 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6440 /*Served Cell Index*/
6442 ueSetReq->protocolIEs.list.array[idx]->id = \
6443 ProtocolIE_ID_id_ServCellIndex;
6444 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6445 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6446 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6447 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6450 /*CellULConfigured*/
6452 ueSetReq->protocolIEs.list.array[idx]->id = \
6453 ProtocolIE_ID_id_SpCellULConfigured;
6454 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6455 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6456 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6457 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6458 CellULConfigured_none;
6460 /*CUtoDURRCContainer*/
6462 ueSetReq->protocolIEs.list.array[idx]->id = \
6463 ProtocolIE_ID_id_CUtoDURRCInformation;
6464 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6465 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6466 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6467 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6472 /*Special Cells to be SetupList*/
6474 ueSetReq->protocolIEs.list.array[idx]->id = \
6475 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6476 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6477 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6478 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6479 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6480 if(SplCellListret != ROK)
6484 /*SRBs To Be Setup List*/
6486 ueSetReq->protocolIEs.list.array[idx]->id = \
6487 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6488 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6489 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6490 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6491 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6492 if(SrbSetupret != ROK)
6496 /*DRBs to Be Setup List*/
6498 ueSetReq->protocolIEs.list.array[idx]->id = \
6499 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6500 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6501 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6502 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6503 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6508 /* RRC Container for security mode */
6510 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6511 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6512 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6513 UEContextSetupRequestIEs__value_PR_RRCContainer;
6514 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6516 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6517 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6518 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6519 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6521 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6524 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6525 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6527 /* RRC delivery status request */
6529 ueSetReq->protocolIEs.list.array[idx]->id = \
6530 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6531 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6532 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6533 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6534 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6535 RRCDeliveryStatusRequest_true;
6537 /* Bit Rate hardcoded as in reference logs */
6539 ueSetReq->protocolIEs.list.array[idx]->id = \
6540 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6541 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6542 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6543 UEContextSetupRequestIEs__value_PR_BitRate;
6544 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6546 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6547 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6548 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6549 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6551 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6554 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6555 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6557 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6559 /* Encode the F1SetupRequest type as APER */
6560 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6562 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6564 /* Encode results */
6565 if(encRetVal.encoded == ENCODE_FAIL)
6567 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6568 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6573 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6574 for(int i=0; i< encBufSize; i++)
6576 DU_LOG("%x",encBuf[i]);
6581 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6583 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6589 FreeUeContextSetupReq(f1apMsg);
6592 }/* End of BuildAndSendUeContextSetupReq*/
6594 /**********************************************************************
6595 * @brief Function to extractTeId received in UE context setup Response
6599 * Function : extractTeId
6602 * - Function to extract TeId
6605 * @return ROK - success
6608 **********************************************************************/
6609 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6613 GTPTunnel_t *gtpDl = NULLP;
6615 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6617 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6619 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6621 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6622 if(gtpDl->gTP_TEID.size > 0)
6624 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6627 DU_LOG("\nERROR --> EGTP: No TeId received");
6635 /****************************************************************
6636 * @brief Function to add Drb tunnels
6640 * Function : addDrbTunnels
6643 * - Function to add Drb tunnels
6646 * @return ROK - success
6649 * ****************************************************************/
6650 uint8_t addDrbTunnels(uint8_t teId)
6655 if(teId > MAX_TEID || teId < MIN_TEID)
6657 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6659 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6660 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6661 tnlEvt.lclTeid = teId;
6662 tnlEvt.remTeid = teId;
6663 ret = cuEgtpTnlMgmtReq(tnlEvt);
6666 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6671 /****************************************************************
6672 * @brief Function to process Drb Setup List
6676 * Function : procDrbSetupList
6679 * - Function to process DRB Setup List
6682 * @return ROK - success
6685 * ****************************************************************/
6686 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
6690 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
6692 if(drbSetupList != NULLP)
6694 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
6696 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
6697 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
6699 /* extracting teId */
6700 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
6703 if(addDrbTunnels(teId)== ROK)
6705 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
6716 /****************************************************************
6717 * @brief Function to process Ue Context Setup Response
6721 * Function : procUeContextSetupResponse
6724 * - Function to process Ue Context Setup Response
6727 * @return ROK - success
6730 * ****************************************************************/
6731 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6733 uint8_t idx, duUeF1apId;
6734 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
6735 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
6737 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
6739 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
6741 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6743 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6746 case ProtocolIE_ID_id_DRBs_Setup_List:
6748 /* Adding Tunnels for successful DRB */
6749 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
6755 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
6759 /****************************************************************
6760 * @brief Function to process Ul Rrc Msg received from DU
6764 * Function : procUlRrcMsg
6767 * - Function to process Ul Rrc Msg received from DU
6770 * @return ROK - success
6773 * ****************************************************************/
6775 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6777 uint8_t idx, ret, srbId, rrcMsgType;
6778 uint8_t cuUeF1apId, duUeF1apId;
6779 uint8_t *rrcContainer = NULLP;
6780 uint16_t rrcContLen;
6781 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6784 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6786 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6788 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6790 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6792 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6795 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6797 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6800 case ProtocolIE_ID_id_SRBID:
6801 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6803 case ProtocolIE_ID_id_RRCContainer:
6805 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6806 CU_ALLOC(rrcContainer, rrcContLen)
6809 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6812 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6818 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6824 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6825 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6826 if(rrcMsgType == REGISTRATION_ACCEPT)
6828 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6829 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6831 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6833 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6834 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6835 rrcContLen, rrcContainer);
6837 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6839 /* To trigger the DL RRC Msg for RRC Reconfig */
6840 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
6841 rrcMsgType = setDlRRCMsgType(duUeF1apId);
6842 if(rrcMsgType == RRC_RECONFIG)
6844 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6845 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
6848 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6850 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6851 BuildAndSendUeContextModificationReq(duUeF1apId);
6857 /****************************************************************
6858 * @brief Build And Send F1ResetAck
6862 * Function : FreeF1ResetAck
6865 * - Build And Send F1ResetRSP
6868 * @return ROK - success
6871 * ****************************************************************/
6872 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6875 ResetAcknowledge_t *f1ResetAck;
6879 if(f1apMsg->choice.successfulOutcome)
6881 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6883 if(f1ResetAck->protocolIEs.list.array)
6885 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6887 if(f1ResetAck->protocolIEs.list.array[idx])
6889 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6892 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6894 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6896 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6900 /****************************************************************
6901 * @brief Build And Send F1ResetAck
6905 * Function : BuildAndSendF1ResetAck
6908 * - Build And Send F1ResetRSP
6911 * @return ROK - success
6914 * ****************************************************************/
6916 uint8_t BuildAndSendF1ResetAck()
6919 uint8_t elementCnt = 0;
6920 uint8_t ret = RFAILED;
6921 F1AP_PDU_t *f1apMsg = NULL;
6922 ResetAcknowledge_t *f1ResetAck = NULLP;
6923 asn_enc_rval_t encRetVal;
6924 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6927 /* Allocate the memory for F1ResetRequest_t */
6928 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6929 if(f1apMsg == NULLP)
6931 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6935 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6937 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6938 if(f1apMsg->choice.successfulOutcome == NULLP)
6940 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6944 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6945 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6946 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6947 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6951 f1ResetAck->protocolIEs.list.count = elementCnt;
6952 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6954 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6955 if(f1ResetAck->protocolIEs.list.array == NULLP)
6957 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6961 for(idx=0; idx<elementCnt; idx++)
6963 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6964 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6971 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6972 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6973 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6974 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6976 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6978 /* Encode the F1SetupRequest type as UPER */
6979 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6981 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6983 /* Check encode results */
6984 if(encRetVal.encoded == ENCODE_FAIL)
6986 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6987 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6992 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6993 for(int i=0; i< encBufSize; i++)
6995 DU_LOG("%x",encBuf[i]);
6999 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7001 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7009 FreeF1ResetAck(f1apMsg);
7012 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7016 if(ulInfo->list.array)
7018 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7020 if(ulInfo->list.array[arrIdx])
7022 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7024 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7026 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7028 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7029 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7030 gTPTunnel->gTP_TEID.size);
7032 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7033 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7034 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7036 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7037 sizeof(GTPTunnel_t));
7039 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7042 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7046 /*******************************************************************
7048 * @brief Deletes the EGTP tunnel
7052 * Function : deleteEgtpTunnel
7054 * Functionality: Deletes the EGTP tunnel
7056 * @params[in] uint8_t *buf
7058 * @return ROK - success
7061 * ****************************************************************/
7062 uint8_t deleteEgtpTunnel(uint8_t *buf)
7067 teIdStringToInt(buf, &teId);
7068 if(teId > MAX_TEID || teId < MIN_TEID)
7070 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7073 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7074 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7075 tnlEvt.lclTeid = teId;
7076 tnlEvt.remTeid = teId;
7077 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7079 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7084 /*******************************************************************
7086 * @brief Builds the Uplink Tunnel Info
7090 * Function : BuildUlTnlInfoforSetupMod
7092 * Functionality: Constructs the UL TnlInfo For DRB list
7094 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7096 * @return ROK - success
7099 * ****************************************************************/
7100 uint8_t BuildUlTnlInfoforSetupMod(ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7106 ulInfo->list.count = ulCnt;
7107 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7108 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7109 if(ulInfo->list.array == NULLP)
7111 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7114 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7116 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7117 if(ulInfo->list.array[arrIdx] == NULLP)
7119 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7125 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7126 UPTransportLayerInformation_PR_gTPTunnel;
7129 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7130 sizeof(GTPTunnel_t));
7131 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7133 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7136 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7137 transportLayerAddress.size = 4*sizeof(uint8_t);
7138 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7139 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7140 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7141 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7142 transportLayerAddress.buf == NULLP)
7144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7148 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7149 transportLayerAddress.buf[0] = 192;
7150 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7151 transportLayerAddress.buf[1] = 168;
7152 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7153 transportLayerAddress.buf[2] = 130;
7154 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7155 transportLayerAddress.buf[3] = 82;
7156 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7157 transportLayerAddress.bits_unused = 0;
7160 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7161 = 4 * sizeof(uint8_t);
7162 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7163 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7164 gTPTunnel->gTP_TEID.size);
7165 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7168 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7171 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7172 gTP_TEID.buf[0] = 0;
7173 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7174 gTP_TEID.buf[1] = 0;
7175 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7176 gTP_TEID.buf[2] = 0;
7177 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7179 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7180 * fetched based on the Drb Id */
7181 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7182 gTP_TEID.buf[3] = 2; /* Tunnel Id for Drb is 2. Hence passing the same TeId */
7187 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7188 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
7191 }/*End of BuildULTnlInfo*/
7193 /*******************************************************************
7195 * @brief freeing the DRB item
7199 * Function : FreeDrbItem
7201 * Functionality: freeing the DRB item
7203 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7205 * @return ROK - success
7208 * ****************************************************************/
7210 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7213 SNSSAI_t *snssai =NULLP;
7214 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7216 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7217 switch(drbItem->qoSInformation.present)
7219 case QoSInformation_PR_NOTHING:
7221 case QoSInformation_PR_eUTRANQoS:
7223 if(drbItem->qoSInformation.choice.eUTRANQoS)
7225 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7229 case QoSInformation_PR_choice_extension:
7231 if(drbItem->qoSInformation.choice.choice_extension)
7233 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7235 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7238 CU_FREE(snssai->sST.buf,snssai->sST.size);
7244 CU_FREE(snssai->sD->buf,snssai->sD->size);
7246 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7249 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7250 if(flowMap->list.array)
7252 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7254 if(flowMap->list.array[arrIdx] )
7256 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7257 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7260 CU_FREE(flowMap->list.array,flowMap->list.size);
7263 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7269 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7270 if(drbItem->uLConfiguration)
7272 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7276 /*******************************************************************
7278 * @brief filling the DRB setup Mod item
7282 * Function : FillDrbItemToSetupMod
7284 * Functionality: filling the DRB setup Mod item
7287 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7289 * @return ROK - success
7292 * ****************************************************************/
7294 uint8_t FillDrbItemToSetupMod(uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7299 drbItem->dRBID = arrIdx + DRB3;
7302 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7304 switch(drbItem->qoSInformation.present)
7306 case QoSInformation_PR_NOTHING:
7310 case QoSInformation_PR_eUTRANQoS:
7313 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7314 if(drbItem->qoSInformation.choice.eUTRANQoS)
7316 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7319 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7320 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7321 PriorityLevel_no_priority;
7323 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7324 Pre_emptionCapability_may_trigger_pre_emption;
7326 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7327 Pre_emptionVulnerability_pre_emptable;
7331 case QoSInformation_PR_choice_extension:
7333 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7334 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7336 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7340 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7341 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7342 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7343 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7344 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7347 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7352 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7353 choice_extension->value.choice.DRB_Information.sNSSAI);
7356 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7360 /*Flows mapped to DRB List*/
7361 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7362 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7363 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7366 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7372 /*ULUPTNLInformation To Be Setup List*/
7373 ret = BuildUlTnlInfoforSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7376 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7381 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7385 /*******************************************************************
7387 * @brief Builds the DRB to be Setup Mod ItemIes
7391 * Function : FillDrbItemList
7393 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7395 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7397 * @return ROK - success
7400 * ****************************************************************/
7402 uint8_t FillDrbItemList(uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7404 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7405 drbItemIe->criticality = Criticality_reject;
7406 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7408 if(FillDrbItemToSetupMod(arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7410 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7415 /*******************************************************************
7417 * @brief free the DRB to be Setup Mod list
7421 * Function : FreeDrbToBeSetupModList
7423 * Functionality: free the DRB to be Setup Mod list
7425 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7427 * @return ROK - success
7430 * ****************************************************************/
7431 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7434 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7436 if(drbSet->list.array)
7438 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7440 if(drbSet->list.array[arrIdx] != NULLP)
7444 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7445 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7447 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7450 CU_FREE(drbSet->list.array, drbSet->list.size);
7455 /*******************************************************************
7457 * @brief Builds the DRB to be Setup Mod list
7461 * Function : BuildDrbToBeSetupList
7463 * Functionality: Constructs the DRB to be Setup Mod list
7465 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7467 * @return ROK - success
7470 * ****************************************************************/
7472 uint8_t BuildDrbToBeSetupList(DRBs_ToBeSetupMod_List_t *drbSet)
7478 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7479 drbSet->list.count = drbCnt;
7480 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7481 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7482 if(drbSet->list.array == NULLP)
7484 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7488 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7490 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7491 if(drbSet->list.array[arrIdx] == NULLP)
7493 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7499 ret = FillDrbItemList(arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7502 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7508 /*******************************************************************
7510 * @brief Filling the DRB to be modified item
7514 * Function : FillDrbToBeModItem
7516 * Functionality: filling the DRB to be modified item
7518 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7520 * @return ROK - success
7523 * ****************************************************************/
7525 uint8_t FillDrbToBeModItem(DRBs_ToBeModified_Item_t *drbItem)
7530 drbItem->dRBID = DRB2;
7533 drbItem->qoSInformation = NULLP;
7534 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7535 if(drbItem->qoSInformation != NULLP)
7537 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7539 switch(drbItem->qoSInformation->present)
7541 case QoSInformation_PR_NOTHING:
7545 case QoSInformation_PR_eUTRANQoS:
7548 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7549 if(drbItem->qoSInformation->choice.eUTRANQoS)
7551 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7554 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7555 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7556 PriorityLevel_no_priority;
7558 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7559 Pre_emptionCapability_may_trigger_pre_emption;
7561 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7562 Pre_emptionVulnerability_pre_emptable;
7566 case QoSInformation_PR_choice_extension:
7568 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7569 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7571 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7575 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7576 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7577 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7578 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7579 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7582 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7587 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7588 choice_extension->value.choice.DRB_Information.sNSSAI);
7591 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7595 /*Flows mapped to DRB List*/
7596 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7597 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7598 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7601 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7608 /*ULUPTNLInformation To Be Setup List*/
7609 ret = BuildUlTnlInfoforSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List,\
7610 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7613 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7619 /*******************************************************************
7621 * @brief Builds the DRB to be modified Item IE
7625 * Function : FillDrbToBeModItemList
7627 * Functionality: Constructs the DRB to be modified Mod Item Ies
7629 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7631 * @return ROK - success
7634 * ****************************************************************/
7636 uint8_t FillDrbToBeModItemList(struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7638 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7639 drbItemIe->criticality = Criticality_reject;
7640 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7641 if(FillDrbToBeModItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7643 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7650 /*******************************************************************
7652 * @brief Builds the DRB to be modified list
7656 * Function : BuildDrbToBeModList
7658 * Functionality: Constructs the DRB to be modified list
7660 * @params[in] DRBs_ToBeModified_List_t *drbSet
7662 * @return ROK - success
7665 * ****************************************************************/
7667 uint8_t BuildDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
7674 drbSet->list.count = drbCnt;
7675 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
7676 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7677 if(drbSet->list.array == NULLP)
7679 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
7682 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7684 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
7685 if(drbSet->list.array[arrIdx] == NULLP)
7687 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7693 ret = FillDrbToBeModItemList((DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
7696 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
7702 /*******************************************************************
7704 * @brief freeing the DRB item
7708 * Function : FreeModifiedDrbItem
7710 * Functionality: freeing the DRB 2 item
7712 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7714 * @return ROK - success
7717 * ****************************************************************/
7719 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
7722 SNSSAI_t *snssai =NULLP;
7723 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7725 if(drbItem->qoSInformation != NULLP)
7727 switch(drbItem->qoSInformation->present)
7729 case QoSInformation_PR_NOTHING:
7731 case QoSInformation_PR_eUTRANQoS:
7733 if(drbItem->qoSInformation->choice.eUTRANQoS)
7735 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7739 case QoSInformation_PR_choice_extension:
7741 if(drbItem->qoSInformation->choice.choice_extension)
7743 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7745 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7748 CU_FREE(snssai->sST.buf,snssai->sST.size);
7754 CU_FREE(snssai->sD->buf,snssai->sD->size);
7756 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7759 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7760 if(flowMap->list.array)
7762 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7764 if(flowMap->list.array[arrIdx] )
7766 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7767 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7770 CU_FREE(flowMap->list.array,flowMap->list.size);
7773 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7779 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7780 if(drbItem->uLConfiguration)
7782 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7786 /*******************************************************************
7788 * @brief free the DRB to be modfified list
7792 * Function : FreeDrbToBeModifiedList
7794 * Functionality: free the DRB to be Setup Mod list
7796 * @params[in] FreeDrbToBeModifiedList_t *drbSet
7798 * @return ROK - success
7801 * ****************************************************************/
7802 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
7805 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
7807 if(drbSet->list.array)
7809 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7811 if(drbSet->list.array[arrIdx] != NULLP)
7813 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
7814 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
7815 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
7818 CU_FREE(drbSet->list.array, drbSet->list.size);
7823 /*******************************************************************
7825 * @brief free the UeContextModification Request
7829 * Function : FreeUeContextModicationRequest
7831 * Functionality : deallocation of memory allocated in UeContextModiification
7834 * @params[in] F1AP_PDU_t *f1apMsg
7838 * ****************************************************************/
7839 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7841 uint8_t arrIdx =0 , ieId=0;
7842 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7846 if(f1apMsg->choice.initiatingMessage)
7848 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7849 if(UeContextModifyReq->protocolIEs.list.array)
7851 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7853 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7855 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7858 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7860 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7862 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7864 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7865 choice.DRBs_ToBeSetupMod_List);
7868 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
7870 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7871 choice.DRBs_ToBeSetupMod_List);
7876 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7879 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7881 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7883 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7886 /*******************************************************************
7888 * @brief Builds the Ue Context Modification Req
7892 * Function : BuildAndSendUeContextModificationReq
7894 * Functionality: Constructs the Ue Context Modification Req
7898 * @return ROK - success
7901 * ****************************************************************/
7902 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
7905 uint8_t elementCnt = 0;
7906 uint8_t ret = RFAILED;
7907 F1AP_PDU_t *f1apMsg = NULLP;
7908 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7910 asn_enc_rval_t encRetVal;
7911 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7915 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7916 if(f1apMsg == NULLP)
7918 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7922 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7924 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7925 if(f1apMsg->choice.initiatingMessage == NULLP)
7927 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7930 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7931 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7932 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7934 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7937 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7938 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7940 /* Initialize the UE context modification members */
7941 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7942 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7944 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7948 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7950 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7951 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7953 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7960 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7961 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7962 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7963 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7964 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
7967 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7968 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7969 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7970 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7971 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
7973 /* DRB to be setup list */
7975 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7976 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7977 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7978 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7979 ret = BuildDrbToBeSetupList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7980 value.choice.DRBs_ToBeSetupMod_List));
7982 /* DRB to be modified list */
7984 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
7985 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7986 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7987 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
7988 ret = BuildDrbToBeModifiedList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7989 value.choice.DRBs_ToBeModified_List));
7991 /* TODO: DRB to be release list */
7997 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7999 /* Encode the F1SetupRequest type as APER */
8000 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8002 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8005 /* Encode results */
8006 if(encRetVal.encoded == ENCODE_FAIL)
8008 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8009 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8014 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8015 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8017 DU_LOG("%x",encBuf[ieIdx]);
8021 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8023 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8031 FreeUeContextModicationRequest(f1apMsg);
8034 /*****************************************************************i
8036 * @brief Free memory allocated for UE Context Release Command
8040 * Function : FreeUeContextReleaseCommand
8043 * - Free memory allocated for UE Context Release Command
8045 * @params[in] F1AP_PDU_t *f1apMsg
8048 * *************************************************************/
8049 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8052 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8056 if(f1apMsg->choice.initiatingMessage)
8058 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8059 if(ueReleaseCommand->protocolIEs.list.array)
8061 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8063 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8065 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8067 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8069 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8072 /*******************************************************************
8074 * @brief Builds the Ue Context Release Command
8078 * Function : BuildAndSendUeContextReleaseCommand
8080 * Functionality: Constructs the Ue Context Release Command
8084 * @return ROK - success
8087 * ****************************************************************/
8088 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
8090 bool memAllocFailed = false;
8091 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8092 F1AP_PDU_t *f1apMsg = NULLP;
8093 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8095 asn_enc_rval_t encRetVal;
8096 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8100 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8101 if(f1apMsg == NULLP)
8103 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8107 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8109 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8110 if(f1apMsg->choice.initiatingMessage == NULLP)
8112 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8115 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8116 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8117 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8119 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8122 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8123 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8125 /* Initialize the UE context modification members */
8126 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8127 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8129 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8133 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8135 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8136 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8138 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8139 memAllocFailed = true;
8144 if(memAllocFailed == true)
8149 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8150 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8151 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8152 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8153 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8156 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8157 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8158 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8159 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8160 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8163 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8164 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8165 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8166 UEContextReleaseCommandIEs__value_PR_Cause;
8167 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8168 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8169 CauseRadioNetwork_normal_release;
8171 /* RRC Container for RRC release */
8173 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8174 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8175 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8176 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8177 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8179 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8180 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8181 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8182 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8184 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8187 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8188 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8190 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8192 /* Encode the UE Context Release Command type as APER */
8193 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8195 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8198 /* Encode results */
8199 if(encRetVal.encoded == ENCODE_FAIL)
8201 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8202 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8207 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8208 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8210 DU_LOG("%x",encBuf[ieIdx]);
8214 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8216 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8224 FreeUeContextReleaseCommand(f1apMsg);
8227 /*******************************************************************
8229 * @brief process Ue context release request
8233 * Function : procUeContextReleaseReq
8236 * - process Ue context release request
8238 * @params[in] F1AP_PDU_t *f1apMsg
8239 * @return ROK - success
8242 * ****************************************************************/
8243 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
8245 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8247 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8248 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8250 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8252 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8254 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8256 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8259 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8261 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8268 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
8270 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8275 /*******************************************************************
8277 * @brief processing of Gnb-DU config update
8281 * Function : procGnbDuUpdate
8284 * - processing of Gnb-DU config update
8286 * @params[in] F1AP_PDU_t *f1apMsg
8287 * @return ROK - success
8290 * ****************************************************************/
8291 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
8293 bool cellToBeDelete = false;
8294 uint8_t ieIdx = 0, ueIdx = 0;
8295 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8297 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8298 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8300 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8302 case ProtocolIE_ID_id_TransactionID:
8304 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8306 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8308 cellToBeDelete = true;
8311 case ProtocolIE_ID_id_gNB_DU_ID:
8315 if(BuildAndSendDUUpdateAck() != ROK)
8317 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8321 if(cellToBeDelete == false)
8323 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8324 if(BuildAndSendF1ResetReq() != ROK)
8326 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8332 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
8334 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
8335 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
8342 /*******************************************************************
8344 * @brief storing slice list in CU database
8348 * Function : buildSliceList
8351 * - storing slice list in CU database
8353 * @params[in] SliceSupportList_t *sliceSupportList
8354 * @return ROK - success
8357 * ****************************************************************/
8358 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8360 uint8_t sliceListIdx = 0;
8362 if(sliceSupportList)
8364 if(sliceSupportList->list.array)
8366 cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
8367 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8369 if(sliceSupportList->list.array[sliceListIdx])
8371 CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai));
8372 if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
8374 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8377 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8379 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8380 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8382 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8384 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
8385 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8386 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8395 /****************************************************************
8396 * @brief Function to process Drb Setup Mod List
8400 * Function : procDrbSetupModList
8403 * - Function to process DRB Setup Mod List
8406 * @return ROK - success
8409 * ****************************************************************/
8410 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8414 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8416 if(drbSetupList != NULLP)
8418 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8420 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8421 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8423 /* extracting teId */
8424 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8427 if(addDrbTunnels(teId)== ROK)
8429 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8440 /*******************************************************************
8442 * @brief processing of GNB_DU_Served_Cells Plmn list information
8446 * Function : procServedCellPlmnList
8449 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8452 * @params[in] F1AP_PDU_t *f1apMsg
8453 * @return ROK - success
8456 * ****************************************************************/
8457 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8459 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8460 ProtocolExtensionContainer_4624P3_t **ieExtend;
8462 if(srvPlmn->list.array)
8464 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8466 if(srvPlmn->list.array[srvPlmnIdx])
8468 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8471 if((*ieExtend)->list.array)
8473 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8475 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8477 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8479 case ProtocolIE_ID_id_TAISliceSupportList:
8481 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8482 extensionValue.choice.SliceSupportList) != ROK)
8484 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8499 /****************************************************************
8500 * @brief Function to process Ue Context Modification Response
8504 * Function : procUeContextModificationResponse
8507 * - Function to process Ue Context Modification Response
8510 * @return ROK - success
8513 * ****************************************************************/
8514 uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
8516 uint8_t idx, duUeF1apId;
8517 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8518 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8520 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8522 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8524 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8526 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8529 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8531 /* Adding Tunnels for successful DRB */
8532 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8541 /*******************************************************************
8543 * @brief processing of F1 setup request
8547 * Function : procF1SetupReq
8550 * - processing of F1 setup request
8552 * @params[in] F1AP_PDU_t *f1apMsg
8553 * @return ROK - success
8556 * ****************************************************************/
8557 void procF1SetupReq(F1AP_PDU_t *f1apMsg)
8559 uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
8560 F1SetupRequest_t *f1SetupReq = NULLP;
8561 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8562 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8564 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8565 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8567 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8569 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8571 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8572 if(duServedCell->list.array)
8574 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8576 if(duServedCell->list.array[plmnidx])
8578 switch(duServedCell->list.array[plmnidx]->id)
8580 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8582 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8583 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8594 BuildAndSendF1SetupRsp();
8598 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
8602 /*******************************************************************
8604 * @brief Handles received F1AP message and sends back response
8608 * Function : F1APMsgHdlr
8611 * - Decodes received F1AP control message
8612 * - Prepares response message, encodes and sends to SCTP
8615 * @return ROK - success
8618 * ****************************************************************/
8619 void F1APMsgHdlr(Buffer *mBuf)
8625 F1AP_PDU_t *f1apMsg = NULLP;
8626 asn_dec_rval_t rval; /* Decoder return value */
8627 F1AP_PDU_t f1apasnmsg ;
8629 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
8630 ODU_PRINT_MSG(mBuf, 0,0);
8632 /* Copy mBuf into char array to decode it */
8633 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8634 CU_ALLOC(recvBuf, (Size)recvBufLen);
8636 if(recvBuf == NULLP)
8638 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
8641 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8643 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
8647 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
8648 for(i=0; i< recvBufLen; i++)
8650 DU_LOG("%x",recvBuf[i]);
8653 /* Decoding flat buffer into F1AP messsage */
8654 f1apMsg = &f1apasnmsg;
8655 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8657 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8658 CU_FREE(recvBuf, (Size)recvBufLen);
8660 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8662 DU_LOG("\nERROR --> F1AP : ASN decode failed");
8666 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8668 switch(f1apMsg->present)
8670 case F1AP_PDU_PR_initiatingMessage:
8672 switch(f1apMsg->choice.initiatingMessage->value.present)
8674 case InitiatingMessage__value_PR_Reset:
8676 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
8677 BuildAndSendF1ResetAck();
8681 case InitiatingMessage__value_PR_F1SetupRequest:
8683 DU_LOG("\nINFO --> F1AP : F1 setup request received");
8684 procF1SetupReq(f1apMsg);
8688 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
8690 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
8691 procGnbDuUpdate(f1apMsg);
8694 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
8696 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
8697 procInitULRRCMsg(f1apMsg);
8700 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
8702 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
8703 procUlRrcMsg(f1apMsg);
8707 case InitiatingMessage__value_PR_RRCDeliveryReport:
8709 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
8712 case InitiatingMessage__value_PR_UEContextReleaseRequest:
8714 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
8715 procUeContextReleaseReq(f1apMsg);
8720 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
8721 f1apMsg->choice.initiatingMessage->value.present);
8724 }/* End of switch(initiatingMessage) */
8728 case F1AP_PDU_PR_successfulOutcome:
8730 switch(f1apMsg->choice.successfulOutcome->value.present)
8732 case SuccessfulOutcome__value_PR_ResetAcknowledge:
8734 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
8737 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
8739 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
8740 procUeContextSetupResponse(f1apMsg);
8743 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
8745 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
8746 procUeContextModificationResponse(f1apMsg);
8749 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
8751 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
8756 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
8757 f1apMsg->choice.successfulOutcome->value.present);
8760 }/* End of switch(successfulOutcome) */
8765 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
8768 }/* End of switch(f1apMsg->present) */
8770 } /* End of F1APMsgHdlr */
8772 /**********************************************************************
8774 **********************************************************************/