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 "cu_stub_sctp.h"
23 #include "cu_stub_egtp.h"
24 #include "cu_f1ap_msg_hdl.h"
27 #include "BIT_STRING.h"
28 #include "odu_common_codec.h"
29 #include "ProtocolIE-Field.h"
30 #include "ProtocolExtensionField.h"
31 #include "ProtocolIE-SingleContainer.h"
33 #include "ModulationOrder.h"
35 #include "UE-CapabilityRAT-Container.h"
36 #include "UE-CapabilityRAT-ContainerList.h"
37 #include "UE-CapabilityRAT-ContainerListRRC.h"
38 #include "SupportedBandwidth.h"
39 #include "FeatureSetUplinkPerCC.h"
40 #include "FeatureSetDownlinkPerCC.h"
41 #include "FeatureSets.h"
42 #include "RF-Parameters.h"
43 #include "UE-NR-Capability.h"
44 #include "ProtocolExtensionContainer.h"
45 #include "CellGroupConfigRrc.h"
46 #include "MAC-CellGroupConfig.h"
47 #include "SchedulingRequestConfig.h"
48 #include "SchedulingRequestToAddMod.h"
49 #include "BSR-Config.h"
50 #include "TAG-Config.h"
52 #include "PHR-Config.h"
53 #include "RLC-Config.h"
54 #include "UL-AM-RLC.h"
55 #include "DL-AM-RLC.h"
56 #include "LogicalChannelConfig.h"
57 #include "RLC-BearerConfig.h"
58 #include "PhysicalCellGroupConfig.h"
59 #include "SpCellConfig.h"
60 #include "ServingCellConfig.h"
61 #include "ControlResourceSet.h"
62 #include "SearchSpace.h"
63 #include "PDCCH-Config.h"
64 #include "PDSCH-TimeDomainResourceAllocation.h"
65 #include "PDSCH-TimeDomainResourceAllocationList.h"
66 #include "DMRS-DownlinkConfig.h"
67 #include "PDSCH-Config.h"
68 #include "BWP-DownlinkDedicated.h"
69 #include "PUSCH-TimeDomainResourceAllocation.h"
70 #include "PUSCH-TimeDomainResourceAllocationList.h"
71 #include "DMRS-UplinkConfig.h"
72 #include "PUSCH-Config.h"
73 #include "SRS-ResourceId.h"
74 #include "SRS-Resource.h"
75 #include "SRS-ResourceSet.h"
76 #include "SRS-Config.h"
77 #include "PUCCH-Config.h"
78 #include "PUCCH-ResourceSet.h"
79 #include "PUCCH-Resource.h"
80 #include "PUCCH-format1.h"
81 #include "PUCCH-FormatConfig.h"
82 #include "BWP-UplinkDedicated.h"
83 #include "PUSCH-ServingCellConfig.h"
84 #include "UplinkConfig.h"
85 #include "PDSCH-ServingCellConfig.h"
86 #include "EUTRANQoS.h"
87 #include "GBR-QosInformation.h"
88 #include "DRBs-ToBeSetupMod-List.h"
89 #include "DRBs-ToBeSetupMod-Item.h"
90 #include "DRBs-Setup-Item.h"
91 #include "DLUPTNLInformation-ToBeSetup-List.h"
92 #include "DLUPTNLInformation-ToBeSetup-Item.h"
93 #include "UPTransportLayerInformation.h"
94 #include "GTPTunnel.h"
95 #include "QoSInformation.h"
96 #include "Cells-to-be-Activated-List.h"
97 #include "DL-CCCH-Message.h"
98 #include "SRB-ToAddModList.h"
99 #include "SRB-ToAddMod.h"
100 #include "RRCSetup-IEs.h"
101 #include "RRCSetup.h"
102 #include "DL-DCCH-Message.h"
103 #include "RRCReconfiguration-IEs.h"
104 #include "RRCReconfiguration.h"
105 #include "DRB-ToAddModList.h"
106 #include "DRB-ToAddMod.h"
107 #include "SDAP-Config.h"
109 /* MACRO for CUtoDURRCInformation */
110 #define CELL_GRP_ID 1
111 #define FREQ_DOM_RSRC_SIZE 6
112 #define CORESET0_END_PRB 48
113 #define CORESET1_NUM_PRB 24
114 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
115 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
116 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
117 #define PDCCH_SRCH_SPC_TWO_ID 2
119 #define SCRAMBLING_ID NR_PCI
120 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
121 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
122 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
123 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
124 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
125 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
126 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
127 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
128 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
130 /* MACRO Ddefine for PDSCH Configuration */
132 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
133 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
134 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
135 #define PDSCH_NUM_HARQ_PROC 5
136 #define PDSCH_MAPPING_TYPE_A 0
137 #define PDSCH_MAPPING_TYPE_B 1
139 /* MACRO Define for PUSCH Configuration */
140 #define PUSCH_K2_CFG1 1
141 #define PUSCH_K2_CFG2 2
143 #define PUSCH_MSG3_DELTA_PREAMBLE 0
144 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
145 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
146 #define PUSCH_MAX_MIMO_LAYERS 1
147 #define PUSCH_PROCESS_TYPE2_ENABLED false
148 #define PUSCH_MAPPING_TYPE_A 0
149 #define PUSCH_MAPPING_TYPE_B 1
151 /* MACRO defines for SRC config */
152 #define SRS_RSRC_ID 1
153 #define SRS_RSET_ID 1
154 #define SRS_COMB_OFFSET_N2 0
155 #define SRS_CYCLIC_SHIFT_N2 0
156 #define SRS_FREQ_DOM_POS 0
157 #define SRS_FREQ_DOM_SHIFT 0
162 #define APERIODIC_SRS_RESRC_TRIGGER 1
164 /* Macro definitions for DUtoCuRrcContainer */
165 #define CELL_GRP_ID 1
167 #define SR_PROHIBIT_TMR 5
168 #define SR_TRANS_MAX 2
169 #define PERIODIC_BSR_TMR 2
170 #define RETX_BSR_TMR 5
171 #define SR_DELAY_TMR 6
173 #define TIME_ALIGNMENT_TMR 7
174 #define PHR_PERIODIC_TMR 7
175 #define PHR_PROHIBHIT_TMR 0
176 #define PHR_PWR_FACTOR_CHANGE 3
177 #define PHR_MODE_OTHER_CG 0
180 #define SN_FIELD_LEN 0
181 #define T_POLL_RETRANSMIT 8
184 #define MAX_RETX_THRESHOLD 5
185 #define T_REASSEMBLY 8
186 #define T_STATUS_PROHIBHIT 7
187 #define MAC_LC_PRIORITY 1
188 #define PRIORTISIED_BIT_RATE 15
189 #define BUCKET_SIZE_DURATION 5
192 #define PDSCH_HARQ_ACK_CODEBOOK 1
193 #define SERV_CELL_IDX 0
194 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
195 #define ACTIVE_DL_BWP_ID 0
196 #define ACTIVE_UL_BWP_ID 0
197 #define SCRAMBLING_ID NR_PCI
198 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
199 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
200 #define FIVE_QI_VALUE9 9 /*spec 23.501, Table 5.7.4-1*/
201 #define FIVE_QI_VALUE8 8 /*spec 23.501, Table 5.7.4-1*/
202 #define PDU_SESSION_ID_1 1
203 #define PDU_SESSION_ID_2 2
204 #define INVALID_PDU_SESSION_ID -1
206 /*******************************************************************
208 * @brief Sends F1 msg over SCTP
212 * Function : SendF1APMsg
214 * Functionality: Sends F1 msg over SCTP
216 * @params[in] Region region
218 * @return ROK - success
221 * ****************************************************************/
222 S16 SendF1APMsg(Region region, Pool pool)
224 Buffer *mBuf = NULLP;
226 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
228 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
230 ODU_PRINT_MSG(mBuf, 0,0);
232 if(sctpSend(mBuf) != ROK)
234 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
235 ODU_PUT_MSG_BUF(mBuf);
241 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
242 ODU_PUT_MSG_BUF(mBuf);
245 ODU_PUT_MSG_BUF(mBuf);
249 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
256 /*******************************************************************
258 * @brief Builds NRCell ID
262 * Function : BuildNrCellId
264 * Functionality: Building the NR Cell ID
266 * @params[in] BIT_STRING_t *nrcell
267 * @return ROK - success
270 * ****************************************************************/
272 S16 BuildNrCellId(BIT_STRING_t *nrcell)
274 memset(nrcell->buf, 0, nrcell->size);
276 nrcell->bits_unused = 4;
277 nrcell->size = 5 * sizeof(uint8_t);
281 /********************************************************************
283 * @brief Builds and sends the F1SetupResponse
287 * Function : BuildAndSendF1SetupRsp
289 * Functionality: Constructs the F1SetupResponse message and sends
290 * it back to the DU through SCTP.
292 * @params[in] void **buf,Buffer to which encoded pattern is written into
293 * @params[in] int *size,size of buffer
295 * @return ROK - success
298 * ****************************************************************/
299 S16 BuildAndSendF1SetupRsp(BIT_STRING_t *nrcellId)
302 uint8_t elementCnt,cellCnt;
303 F1AP_PDU_t *f1apMsg = NULL;
304 F1SetupResponse_t *f1SetupRsp;
305 GNB_CU_Name_t *cuName;
306 Cells_to_be_Activated_List_t *cellToActivate;
307 RRC_Version_t *rrcVer;
308 asn_enc_rval_t encRetVal;
309 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
311 /* Allocate the memory for F1SetupRequest_t */
312 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
315 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
318 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
320 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
321 if(f1apMsg->choice.successfulOutcome == NULLP)
323 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
324 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
328 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
329 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
330 f1apMsg->choice.successfulOutcome->value.present = \
331 SuccessfulOutcome__value_PR_F1SetupResponse;
332 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
335 f1SetupRsp->protocolIEs.list.count = elementCnt;
336 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
338 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
339 elementCnt * sizeof(F1SetupResponseIEs_t *));
340 if(f1SetupRsp->protocolIEs.list.array == NULLP)
342 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
343 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
344 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
348 for(idx=0; idx<elementCnt; idx++)
350 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
351 sizeof(F1SetupResponseIEs_t));
352 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
354 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
355 elementCnt * sizeof(F1SetupResponseIEs_t *));
356 CU_FREE(f1apMsg->choice.successfulOutcome, \
357 sizeof(SuccessfulOutcome_t));
358 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
365 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
366 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
367 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
368 F1SetupResponseIEs__value_PR_TransactionID;
369 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
374 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
375 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
376 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
377 F1SetupResponseIEs__value_PR_GNB_CU_Name;
378 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
379 cuName->size = sizeof(cuCfgParams.cuName);
381 CU_ALLOC(cuName->buf, sizeof(cuName->size));
382 if(cuName->buf == NULLP)
384 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
386 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
387 sizeof(F1SetupResponseIEs_t));
389 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
390 elementCnt * sizeof(F1SetupResponseIEs_t *));
391 CU_FREE(f1apMsg->choice.successfulOutcome,\
392 sizeof(SuccessfulOutcome_t));
393 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
396 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
398 /*Cells to be activated list*/
400 f1SetupRsp->protocolIEs.list.array[idx]->id = \
401 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
402 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
403 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
404 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
405 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
406 Cells_to_be_Activated_List;
408 cellToActivate->list.count = cellCnt;
409 cellToActivate->list.size = \
410 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
411 CU_ALLOC(cellToActivate->list.array,\
412 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
413 if(cellToActivate->list.array == NULLP)
415 CU_FREE(cuName->buf, sizeof(cuName->size));
416 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
418 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
419 sizeof(F1SetupResponseIEs_t));
421 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
422 elementCnt * sizeof(F1SetupResponseIEs_t *));
423 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
424 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
427 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
429 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
430 if(cellToActivate->list.array[ieIdx] == NULLP)
432 CU_FREE(cellToActivate->list.array,\
433 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
434 CU_FREE(cuName->buf, sizeof(cuName->size));
435 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
437 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
438 sizeof(F1SetupResponseIEs_t));
440 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
441 elementCnt * sizeof(F1SetupResponseIEs_t *));
442 CU_FREE(f1apMsg->choice.successfulOutcome, \
443 sizeof(SuccessfulOutcome_t));
444 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
448 cellToActivate->list.array[0]->id = \
449 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
450 cellToActivate->list.array[0]->criticality = Criticality_ignore;
451 cellToActivate->list.array[0]->value.present = \
452 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
453 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
454 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
455 CU_ALLOC(cellToActivate->list.array[0]->\
456 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
458 if(cellToActivate->list.array[0]->value.choice.\
459 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
462 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
464 CU_FREE(cellToActivate->list.array[ieIdx],\
465 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
468 CU_FREE(cellToActivate->list.array,\
469 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
470 CU_FREE(cuName->buf, sizeof(cuName->size));
471 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
473 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
474 sizeof(F1SetupResponseIEs_t));
476 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
477 elementCnt * sizeof(F1SetupResponseIEs_t *));
478 CU_FREE(f1apMsg->choice.successfulOutcome, \
479 sizeof(SuccessfulOutcome_t));
480 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
483 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
484 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
485 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
486 nRCGI.nRCellIdentity.size = 5;
487 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
488 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
490 if(cellToActivate->list.array[0]->value.choice.\
491 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
493 CU_FREE(cellToActivate->list.array[0]->\
494 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
496 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
498 CU_FREE(cellToActivate->list.array[ieIdx],\
499 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
502 CU_FREE(cellToActivate->list.array,\
503 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
504 CU_FREE(cuName->buf, sizeof(cuName->size));
505 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
507 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
508 sizeof(F1SetupResponseIEs_t));
510 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
511 elementCnt * sizeof(F1SetupResponseIEs_t *));
512 CU_FREE(f1apMsg->choice.successfulOutcome, \
513 sizeof(SuccessfulOutcome_t));
514 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
517 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
520 f1SetupRsp->protocolIEs.list.array[idx]->id = \
521 ProtocolIE_ID_id_GNB_CU_RRC_Version;
522 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
523 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
524 F1SetupResponseIEs__value_PR_RRC_Version;
525 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
526 rrcVer->latest_RRC_Version.size = RRC_SIZE;
528 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
529 if(rrcVer->latest_RRC_Version.buf == NULLP)
531 CU_FREE(cuName->buf, sizeof(cuName->size));
532 for(ieIdx=0; ieIdx<elementCnt; idx++)
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));
544 /* Need to check RRC Version */
545 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
546 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
547 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
548 if(rrcVer->iE_Extensions == NULLP)
550 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
551 CU_FREE(cuName->buf, sizeof(cuName->size));
552 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
554 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
555 sizeof(F1SetupResponseIEs_t));
557 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
558 elementCnt * sizeof(F1SetupResponseIEs_t *));
559 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
560 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
563 rrcVer->iE_Extensions->list.count = 1;
564 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
565 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
566 sizeof(struct RRC_Version_ExtIEs *));
567 if(rrcVer->iE_Extensions->list.array == NULLP)
569 CU_FREE(rrcVer->iE_Extensions,\
570 sizeof(ProtocolExtensionContainer_4624P81_t));
571 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
572 CU_FREE(cuName->buf, sizeof(cuName->size));
573 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
575 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
576 sizeof(F1SetupResponseIEs_t));
578 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
579 elementCnt * sizeof(F1SetupResponseIEs_t *));
580 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
581 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
584 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
585 sizeof(struct RRC_Version_ExtIEs));
586 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
588 CU_FREE(rrcVer->iE_Extensions->list.array,\
589 sizeof(struct RRC_Version_ExtIEs *));
590 CU_FREE(rrcVer->iE_Extensions,\
591 sizeof(ProtocolExtensionContainer_4624P81_t));
592 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
593 CU_FREE(cuName->buf, sizeof(cuName->size));
594 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
596 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
597 sizeof(F1SetupResponseIEs_t));
599 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
600 elementCnt * sizeof(F1SetupResponseIEs_t *));
601 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
602 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
605 rrcVer->iE_Extensions->list.array[0]->id = \
606 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
607 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
608 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
609 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
610 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
611 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
612 CU_ALLOC(rrcVer->iE_Extensions->list.\
613 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
615 if(rrcVer->iE_Extensions->list.\
616 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
618 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
619 sizeof(struct RRC_Version_ExtIEs));
620 CU_FREE(rrcVer->iE_Extensions->list.array,\
621 sizeof(struct RRC_Version_ExtIEs *));
622 CU_FREE(rrcVer->iE_Extensions,\
623 sizeof(ProtocolExtensionContainer_4624P81_t));
624 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
625 CU_FREE(cuName->buf, sizeof(cuName->size));
626 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
628 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
629 sizeof(F1SetupResponseIEs_t));
631 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
632 elementCnt * sizeof(F1SetupResponseIEs_t *));
633 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
634 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
637 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
638 Latest_RRC_Version_Enhanced.buf[0] = 0;
639 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
640 Latest_RRC_Version_Enhanced.buf[1] = 5;
641 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
642 Latest_RRC_Version_Enhanced.buf[2] = 15;
644 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
646 /* Encode the F1SetupRequest type as UPER */
647 memset(encBuf, 0, ENC_BUF_MAX_LEN);
649 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
652 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
653 CU_FREE(cuName->buf, sizeof(cuName->size));
654 for(idx=0; idx<elementCnt; idx++)
656 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
658 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
659 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
660 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
662 /* Check encode results */
663 if(encRetVal.encoded == ENCODE_FAIL)
665 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
666 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
671 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
672 for(int i=0; i< encBufSize; i++)
674 DU_LOG("%x",encBuf[i]);
679 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
681 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
686 }/* End of BuildAndSendF1SetupRsp */
688 /*******************************************************************
690 * @brief Builds and sends the DUUpdateAcknowledge
694 * Function : BuildAndSendDUUpdateAck
696 * Functionality: Constructs the DU Update Acknowledge message and sends
697 * it to the DU through SCTP.
701 * @return ROK - success
704 * ****************************************************************/
706 S16 BuildAndSendDUUpdateAck()
710 F1AP_PDU_t *f1apMsg = NULL;
711 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
712 asn_enc_rval_t enRetVal; /* Encoder return value */
714 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
716 /* Allocate the memory for F1SetupRequest_t */
717 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
720 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
724 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
726 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
727 if(f1apMsg->choice.successfulOutcome == NULLP)
729 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
730 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
734 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
735 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
736 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
737 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
740 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
741 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
743 /* Initialize the F1Setup members */
744 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
745 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
747 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
748 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
749 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
753 for(idx=0; idx<elementCnt; idx++)
755 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
756 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
758 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
759 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
760 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
767 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
768 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
769 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
770 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
771 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
773 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
775 /* Encode the F1SetupRequest type as UPER */
776 memset(encBuf, 0, ENC_BUF_MAX_LEN);
778 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
781 for(idx=0; idx<elementCnt; idx++)
783 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
785 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
786 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
787 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
789 /* Checking encode results */
790 if(enRetVal.encoded == ENCODE_FAIL)
792 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
793 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
798 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
799 for(int i=0; i< encBufSize; i++)
801 DU_LOG("%x",encBuf[i]);
806 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
808 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
814 }/* End of BuildAndSendDUUpdateAck*/
815 /*******************************************************************
817 * @brief deallocating the memory of F1reset msg
821 * Function : FreeF1ResetReq
824 * - freeing memory of F1reset request msg
830 * ****************************************************************/
831 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
834 Reset_t *f1ResetMsg = NULLP;
838 if(f1apMsg->choice.initiatingMessage)
840 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
841 if(f1ResetMsg->protocolIEs.list.array)
843 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
845 if(f1ResetMsg->protocolIEs.list.array[idx])
847 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
850 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
852 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
854 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
857 /*******************************************************************
859 * @brief build ansld ans send f1reset msg
863 * Function : BuildAndSendF1ResetReq
865 * Functionality: build and send f1reset msg
867 * @return ROK - success
870 * ****************************************************************/
871 uint8_t BuildAndSendF1ResetReq()
873 uint8_t elementCnt=0;
875 uint8_t ret= RFAILED;
876 Reset_t *f1ResetMsg = NULLP;
877 F1AP_PDU_t *f1apMsg = NULLP;
878 asn_enc_rval_t encRetVal;
879 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
882 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
885 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
888 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
889 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
890 if(f1apMsg->choice.initiatingMessage == NULLP)
892 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
895 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
896 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
897 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
899 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
902 f1ResetMsg->protocolIEs.list.count = elementCnt;
903 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
905 /* Initialize the F1Reset members */
906 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
907 if(f1ResetMsg->protocolIEs.list.array == NULLP)
909 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
912 for(idx=0; idx<elementCnt; idx++)
914 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
915 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
917 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
924 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
925 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
926 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
927 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
931 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
932 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
933 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
934 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
935 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
939 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
940 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
941 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
942 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
943 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
945 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
947 /* Encode the F1SetupRequest type as APER */
948 memset(encBuf, 0, ENC_BUF_MAX_LEN);
950 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
954 if(encRetVal.encoded == ENCODE_FAIL)
956 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
957 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
962 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
963 for(idx=0; idx< encBufSize; idx++)
965 DU_LOG("%x",encBuf[idx]);
969 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
971 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
979 FreeF1ResetReq(f1apMsg);
983 /*******************************************************************
985 * @brief Fills Radio Bearer Config
989 * Function : fillSrbCfg
991 * Functionality: Fills Radio Bearer Config
993 * @params[in] SRB_ToAddModList *
995 * @return ROK - success
998 * ****************************************************************/
999 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
1003 if(bearerCfg != NULLP)
1006 bearerCfg->list.count = elementCnt;
1007 bearerCfg->list.size =\
1008 elementCnt * sizeof(SRB_ToAddMod_t *);
1009 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
1010 if(bearerCfg->list.array != NULLP)
1012 for(idx = 0; idx < elementCnt; idx++)
1014 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
1015 if(bearerCfg->list.array[idx] == NULLP)
1017 for(ieId = 0; ieId < idx; ieId++)
1019 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
1021 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1031 bearerCfg->list.array[idx]->srb_Identity = srbId;
1036 /*******************************************************************
1038 * @brief Fills Master CellGroup Info
1042 * Function : fillMasterCellGroup
1044 * Functionality: Fills Master Cell Group IE
1046 * @params[in] RRCSetup_IEs_t *
1048 * @return ROK - success
1051 * ****************************************************************/
1053 uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
1056 masterCellGroup->buf = NULLP;
1057 if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
1059 masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
1060 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1061 if(masterCellGroup->buf != NULLP)
1063 memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
1064 masterCellGroup->size);
1078 /*******************************************************************
1080 * @brief Fills RRC setup IE
1084 * Function : fillRRCSetupIE
1086 * Functionality: Fills RRC Setup IE
1088 * @params[in] RRCSetup_IEs_t *
1090 * @return ROK - success
1093 * ****************************************************************/
1095 uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
1100 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1101 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1103 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1107 ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
1111 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1117 /*******************************************************************
1119 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1123 * Function : fillDlCcchRrcMsg
1125 * Functionality: Fills DL DCCCH Message required for
1126 * DLRRCMessageTransfer
1128 * @params[in] RRCContainer_t *rrcContainer
1130 * @return ROK - success
1133 * ****************************************************************/
1135 uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
1139 DL_CCCH_Message_t dl_CCCH_Msg;
1140 asn_enc_rval_t encRetVal;
1142 if(rrcContainer != NULLP)
1144 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1146 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1147 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1149 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1150 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1151 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1153 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1154 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1155 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1156 /* Fill RRC Setup IE */
1157 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1158 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1159 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1160 criticalExtensions.choice.rrcSetup != NULLP)
1162 ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1163 criticalExtensions.choice.rrcSetup);
1167 /* encode DL-CCCH message into RRC Container */
1168 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1169 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1171 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1172 /* Encode results */
1173 if(encRetVal.encoded == ENCODE_FAIL)
1175 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1176 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1181 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1182 for(int i = 0; i< encBufSize; i++)
1184 DU_LOG("%x",encBuf[i]);
1186 rrcContainer->size = encBufSize;
1187 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1188 if(rrcContainer->buf != NULLP)
1190 memset(rrcContainer->buf, 0, encBufSize);
1191 for(idx2 = 0; idx2 < encBufSize; idx2++)
1193 rrcContainer->buf[idx2] = encBuf[idx2];
1205 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1211 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1217 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1223 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1228 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1230 uint8_t idx, ied, elementCnt;
1233 qosFlow->list.count = elementCnt;
1234 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1235 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1236 if(qosFlow->list.array != NULLP)
1238 for(idx = 0; idx < elementCnt; idx++)
1240 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1241 if(qosFlow->list.array[idx] == NULLP)
1243 for(ied = 0; ied < idx; ied++)
1245 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1247 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1253 *qosFlow->list.array[idx] = 9;
1257 /*******************************************************************
1259 * @brief Fills CN Assoc for Drb to Add/Mod List
1263 * Function : fillCnAssoc
1265 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1267 * @params[in] struct DRB_ToAddMod__cnAssociation *
1269 * @return ROK - success
1272 * ****************************************************************/
1274 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1278 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1279 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1281 cnAssoc->choice.eps_BearerIdentity = 5;
1283 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1285 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1286 if(cnAssoc->choice.sdap_Config)
1288 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1289 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1290 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1291 cnAssoc->choice.sdap_Config->defaultDRB = true;
1292 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1293 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1294 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1295 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1296 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1298 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1302 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1303 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1309 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1316 /*******************************************************************
1318 * @brief Fills Radio Bearer Config for Drb
1322 * Function : fillDrbCfg
1324 * Functionality: Fills Radio Bearer Config for Drb
1326 * @params[in] drbId, DRB_ToAddModList *
1328 * @return ROK - success
1331 * ****************************************************************/
1332 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1334 uint8_t idx, ied, ret, elementCnt;
1340 drbCfg->list.count = elementCnt;
1341 drbCfg->list.size =\
1342 elementCnt * sizeof(DRB_ToAddMod_t *);
1343 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1344 if(drbCfg->list.array != NULLP)
1346 for(idx = 0; idx < elementCnt; idx++)
1348 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1349 if(drbCfg->list.array[idx] == NULLP)
1351 for(ied = 0; ied < idx; ied++)
1353 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1355 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1365 /* CN ASSOCIATION */
1366 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1367 if(drbCfg->list.array[idx]->cnAssociation)
1369 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1372 drbCfg->list.array[idx]->drb_Identity = drbId;
1377 /*******************************************************************
1379 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1383 * Function : fillRrcReconfigIE
1385 * Functionality: Fills RRC Reconfig Message required for
1386 * DLRRCMessageTransfer
1388 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1390 * @return ROK - success
1393 * ****************************************************************/
1395 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1398 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1399 if(rrcReconfigMsg->radioBearerConfig)
1401 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1402 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1404 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1409 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1410 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1412 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1415 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1416 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1417 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1423 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1424 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1430 /*******************************************************************
1432 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1436 * Function : fillDlDcchRrcMsg
1438 * Functionality: Fills DL DCCH Message required for
1439 * DLRRCMessageTransfer
1441 * @params[in] RRCContainer_t *rrcContainer
1443 * @return ROK - success
1446 * ****************************************************************/
1448 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1452 DL_DCCH_Message_t dl_DCCH_Msg;
1453 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1454 asn_enc_rval_t encRetVal;
1456 if(rrcContainer != NULLP)
1458 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1460 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1461 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1463 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1464 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1465 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1467 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1468 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1469 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1470 /* Fill RRC Reconfig IE */
1471 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1472 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1473 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1474 criticalExtensions.choice.rrcReconfiguration != NULLP)
1476 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1477 criticalExtensions.choice.rrcReconfiguration);
1481 /* encode DL-DCCH message into RRC Container */
1482 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1483 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1485 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1486 /* Encode results */
1487 if(encRetVal.encoded == ENCODE_FAIL)
1489 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1490 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1495 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1496 for(int i = 0; i< encBufSize; i++)
1498 DU_LOG("%x",encBuf[i]);
1500 rrcContainer->size = encBufSize;
1501 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1502 if(rrcContainer->buf != NULLP)
1504 memset(rrcContainer->buf, 0, encBufSize);
1505 for(idx2 = 0; idx2 < encBufSize; idx2++)
1507 rrcContainer->buf[idx2] = encBuf[idx2];
1514 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1519 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1525 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1531 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1537 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1543 /*******************************************************************
1545 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1549 * Function : BuildDLRRCContainer
1551 * Functionality: Builds RRC Container IE required for
1552 * DLRRCMessageTransfer
1556 * @return ROK - success
1559 * ****************************************************************/
1561 uint8_t BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1563 uint8_t ret, bufLen;
1566 if(rrcMsgType == RRC_SETUP)
1568 ret = fillDlCcchRrcMsg(ueId, rrcContainer);
1570 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1572 else if(rrcMsgType == REGISTRATION_ACCEPT)
1574 /*Hardcoded RRC Container from reference logs*/
1575 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1577 rrcContainer->size = bufLen;
1578 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1579 if(rrcContainer->buf != NULLP)
1581 memset(rrcContainer->buf, 0, bufLen);
1582 memcpy(rrcContainer->buf, buf, bufLen);
1585 else if(rrcMsgType == RRC_RECONFIG)
1587 /*Hardcoded RRC Container from reference logs*/
1589 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1590 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1591 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1592 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1593 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1594 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1595 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1596 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1597 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1598 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1599 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1600 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1601 0x00, 0x00, 0x00, 0x00};
1603 rrcContainer->size = bufLen;
1604 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1605 if(rrcContainer->buf != NULLP)
1607 memset(rrcContainer->buf, 0, bufLen);
1608 memcpy(rrcContainer->buf, buf, bufLen);
1615 /*******************************************************************
1617 * @brief Builds and sends the DLRRCMessageTransfer
1621 * Function : BuildAndSendDLRRCMessageTransfer
1623 * Functionality: Constructs the DL RRC Message Transfer and sends
1624 * it to the CU through SCTP.
1628 * @return ROK - success
1631 * ****************************************************************/
1632 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
1634 uint8_t elementCnt = 0;
1637 F1AP_PDU_t *f1apMsg = NULLP;
1638 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1639 asn_enc_rval_t encRetVal; /* Encoder return value */
1641 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1643 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1644 if(f1apMsg == NULLP)
1646 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1650 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1651 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1652 sizeof(InitiatingMessage_t));
1653 if(f1apMsg->choice.initiatingMessage == NULLP)
1655 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1656 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1660 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1661 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1662 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1663 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1666 dlRRCMsg->protocolIEs.list.count = elementCnt;
1667 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1669 /* Initialize the F1Setup members */
1670 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1671 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1673 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1674 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1675 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1679 for(idx=0; idx<elementCnt; idx++)
1681 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1682 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1684 for(ieId=0; ieId<idx; ieId++)
1686 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1687 sizeof(DLRRCMessageTransferIEs_t));
1689 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1690 dlRRCMsg->protocolIEs.list.size);
1691 CU_FREE(f1apMsg->choice.initiatingMessage,\
1692 sizeof(InitiatingMessage_t));
1693 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1698 /* GNB CU UE F1AP ID */
1700 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1701 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1702 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1703 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1704 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
1706 /* GNB DU UE F1AP ID */
1708 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1709 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1710 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1711 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1712 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1713 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
1717 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1718 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1719 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1720 DLRRCMessageTransferIEs__value_PR_SRBID;
1721 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1725 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1726 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1727 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1728 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1729 BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1731 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1733 /* Encode the F1SetupRequest type as APER */
1734 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1736 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1738 /* Encode results */
1739 if(encRetVal.encoded == ENCODE_FAIL)
1741 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1742 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1747 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1748 for(int i=0; i< encBufSize; i++)
1750 DU_LOG("%x",encBuf[i]);
1755 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1757 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1762 }/* End of BuildAndSendDLRRCMessageTransfer */
1764 /*******************************************************************
1766 * @brief Function to set the Dl RRC Msg Type
1770 * Function : setDlRRCMsgType
1772 * Functionality: Constructs the UE Setup Response and sends
1773 * it to the DU through SCTP.
1777 * @return ROK - success
1780 * ****************************************************************/
1782 uint8_t setDlRRCMsgType(uint8_t ueId)
1784 uint8_t rrcMsgType = 0;
1785 switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
1788 rrcMsgType = RRC_SETUP;
1790 case REGISTRATION_ACCEPT:
1791 rrcMsgType = REGISTRATION_ACCEPT;
1793 case UE_CONTEXT_SETUP_REQ:
1794 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1796 case SECURITY_MODE_COMPLETE:
1797 rrcMsgType = SECURITY_MODE_COMPLETE;
1800 rrcMsgType = RRC_RECONFIG;
1802 case UE_CONTEXT_MOD_REQ:
1803 rrcMsgType = UE_CONTEXT_MOD_REQ;
1811 /*******************************************************************
1813 * @brief Function to build Initial UL RRC Message
1817 * Function : procInitULRRCMsg
1819 * Functionality: Function to build Initial UL RRC Message
1823 * @return ROK - success
1826 * ****************************************************************/
1828 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1830 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1832 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1833 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1835 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1837 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1839 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1841 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1842 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1844 case ProtocolIE_ID_id_NRCGI:
1846 case ProtocolIE_ID_id_C_RNTI:
1848 case ProtocolIE_ID_id_RRCContainer:
1850 case ProtocolIE_ID_id_DUtoCURRCContainer:
1852 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1853 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1854 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1856 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1857 ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
1858 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1859 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1860 CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
1861 ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
1862 if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
1864 memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1865 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
1866 .duToCuContainer.size);
1871 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1877 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1883 ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
1884 rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
1885 ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
1890 /*******************************************************************
1892 * @brief Builds Nrcgi
1896 * Function : BuildNrcgi
1898 * Functionality: Building the PLMN ID and NR Cell id
1900 * @params[in] NRCGI_t *nrcgi
1901 * @return ROK - success
1904 * ****************************************************************/
1905 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1908 uint8_t unused_bits = 4;
1909 uint8_t byteSize = 5;
1911 /* Allocate Buffer Memory */
1912 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1913 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1914 if(nrcgi->pLMN_Identity.buf == NULLP)
1918 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1924 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1925 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1926 if(nrcgi->nRCellIdentity.buf == NULLP)
1930 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
1934 /*******************************************************************
1936 * @brief Builds Special cell list for UE Setup Request
1940 * Function : BuildSplCellList
1942 * Functionality: Constructs the Special Cell list for UESetReq
1944 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1946 * @return ROK - success
1949 * ****************************************************************/
1950 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1956 spCellLst->list.count = cellCnt;
1957 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1958 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1959 if(spCellLst->list.array == NULLP)
1963 for(idx=0; idx<cellCnt; idx++)
1965 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1966 if(spCellLst->list.array[idx] == NULLP)
1972 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1973 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1974 spCellLst->list.array[idx]->value.present =\
1975 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1976 /* Special Cell ID -NRCGI */
1977 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1982 /*Special Cell Index*/
1983 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1985 }/* End of BuildSplCellList*/
1987 /*******************************************************************
1989 * @brief Builds SRBS to be setup
1993 * Function : BuildSRBSetup
1995 * Functionality: Constructs the SRB's for UESetReq
1997 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1999 * @return ROK - success
2002 * ****************************************************************/
2003 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2008 srbSet->list.count = srbCnt;
2009 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2010 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2011 if(srbSet->list.array == NULLP)
2015 for(idx=0; idx<srbCnt; idx++)
2017 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2018 if(srbSet->list.array[idx] == NULLP)
2024 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2025 srbSet->list.array[idx]->criticality = Criticality_ignore;
2026 srbSet->list.array[idx]->value.present = \
2027 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2028 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2030 }/* End of BuildSRBSetup*/
2032 /*******************************************************************
2034 * @brief Builds QOS Info for DRB Setum Item
2038 * Function : BuildQOSInfo
2040 * Functionality: Constructs the QOS Info for DRB Setup Item
2042 * @params[in] QoSInformation_t *qosinfo
2043 * int16_t pduSessionID
2045 * @return ROK - success
2048 * ****************************************************************/
2049 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
2050 int16_t pduSessionID)
2052 uint8_t elementCnt = 0, qosCntIdx = 0;
2053 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2055 /* NonDynamic5QIDescriptor */
2056 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2057 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2058 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2063 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2064 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2066 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2069 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2070 sizeof(AveragingWindow_t));
2071 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2076 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2077 /*MaxDataBurstVolume*/
2078 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2079 sizeof(MaxDataBurstVolume_t));
2080 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2085 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2087 /*nRGRAN Allocation Retention Priority*/
2088 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2089 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2090 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2092 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2093 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2095 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2099 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2100 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2104 elementCnt = NUM_QOS_EXT;
2105 qosIeExt->list.count = elementCnt;
2106 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2108 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2109 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2111 if(qosIeExt->list.array == NULLP)
2113 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2117 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2119 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2120 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2122 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2125 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2126 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2127 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2128 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2129 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2130 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2131 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2136 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2141 }/*End of BuildQOSInfo*/
2143 /*******************************************************************
2145 * @brief Builds SNSSAI
2149 * Function : BuildSNSSAI
2151 * Functionality: Constructs the SNSSAI For DRB list
2153 * @params[in] SNSSAI_t *snssai
2154 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2156 * @return ROK - success
2159 * ****************************************************************/
2160 uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
2164 snssai->sST.size = sizeof(uint8_t);
2165 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2166 if(snssai->sST.buf == NULLP)
2170 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2172 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2173 if(snssai->sD == NULLP)
2177 snssai->sD->size = 3*sizeof(uint8_t);
2178 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2179 if(snssai->sD->buf == NULLP)
2183 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2185 }/*End of BuildSNSSAI*/
2187 /*******************************************************************
2189 * @brief Builds the flow map.
2193 * Function : BuildFlowsMap
2195 * Functionality: Constructs the flowmap For DRB list
2197 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2199 * @return ROK - success
2202 * ****************************************************************/
2203 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2205 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2208 flowMap->list.count = flowCnt;
2209 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2210 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2211 if(flowMap->list.array == NULLP)
2213 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2216 for(idx=0; idx<flowCnt; idx++)
2218 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2219 if(flowMap->list.array[idx] == NULLP)
2221 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2226 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2227 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2228 actionType, INVALID_PDU_SESSION_ID);
2231 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2235 }/*End of BuildFlowsMap*/
2237 /*******************************************************************
2239 * @brief Builds the Uplink Tunnel Info
2243 * Function : BuildULTnlInfo
2245 * Functionality: Constructs the UL TnlInfo For DRB list
2247 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2249 * @return ROK - success
2252 * ****************************************************************/
2253 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2258 ulInfo->list.count = ulCnt;
2259 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2260 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2261 if(ulInfo->list.array == NULLP)
2263 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2266 for(idx=0; idx<ulCnt; idx++)
2268 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2269 if(ulInfo->list.array[idx] == NULLP)
2271 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2276 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2277 UPTransportLayerInformation_PR_gTPTunnel;
2279 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2280 sizeof(GTPTunnel_t));
2281 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2283 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2286 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2287 transportLayerAddress.size = 4*sizeof(uint8_t);
2288 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2289 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2290 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2291 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2292 transportLayerAddress.buf == NULLP)
2294 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2297 /* NOTE: Below IP address must be changed if running on different IP configuration */
2298 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2299 transportLayerAddress.buf[0] = 192;
2300 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2301 transportLayerAddress.buf[1] = 168;
2302 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2303 transportLayerAddress.buf[2] = 130;
2304 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2305 transportLayerAddress.buf[3] = 82;
2306 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2307 transportLayerAddress.bits_unused = 0;
2309 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2310 = 4 * sizeof(uint8_t);
2311 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2312 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2313 gTPTunnel->gTP_TEID.size);
2314 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2317 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2320 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2321 gTP_TEID.buf[0] = 0;
2322 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2323 gTP_TEID.buf[1] = 0;
2324 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2325 gTP_TEID.buf[2] = 0;
2326 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2327 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
2330 }/*End of BuildULTnlInfo*/
2332 /*******************************************************************
2334 * @brief Builds DRBS to be setup
2338 * Function : BuildDRBSetup
2340 * Functionality: Constructs the DRB's for UESetReq
2342 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2344 * @return ROK - success
2347 * ****************************************************************/
2348 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2350 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2351 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2352 DRBs_ToBeSetup_Item_t *drbSetItem;
2354 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2355 drbSet->list.count = drbCnt;
2356 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2357 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2358 if(drbSet->list.array == NULLP)
2360 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2363 for(idx=0; idx<drbCnt; idx++)
2365 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2366 if(drbSet->list.array[idx] == NULLP)
2368 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2372 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2373 drbSet->list.array[idx]->criticality = Criticality_ignore;
2374 drbSet->list.array[idx]->value.present = \
2375 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2376 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2378 drbSetItem->dRBID = idx + 1;
2380 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2381 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2382 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2384 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2387 drbSetItem->qoSInformation.choice.choice_extension->id = \
2388 ProtocolIE_ID_id_DRB_Information;
2389 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2391 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2392 QoSInformation_ExtIEs__value_PR_DRB_Information;
2393 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2394 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2395 ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
2396 if(BuildQOSInforet != ROK)
2398 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2402 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2403 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[0]);
2404 if(BuildSNSSAIret != ROK)
2406 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2409 /*Flows mapped to DRB List*/
2410 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2411 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2412 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2413 if(BuildFlowsMapret != ROK)
2415 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2418 /*ULUPTNLInformation To Be Setup List*/
2419 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2420 if(BuildULTnlInforet != ROK)
2422 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2426 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2429 }/* End of BuildDRBSetup*/
2431 /*******************************************************************
2433 * @brief Deallocating memory of function BuildAndSendUESetReq
2437 * Function : FreeNrcgi
2439 * Functionality: Deallocating memory for function BuildNrcgi
2441 * @params[in] NRCGI_t *nrcgi
2445 *******************************************************************/
2446 void FreeNrcgi(NRCGI_t *nrcgi)
2448 if(nrcgi->pLMN_Identity.buf != NULLP)
2450 if(nrcgi->nRCellIdentity.buf != NULLP)
2452 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2454 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2457 /*******************************************************************
2459 * @brief Deallocating memory of function BuildAndSendUESetReq
2463 * Function : FreeSplCellList
2465 * Functionality: Deallocating memory for function BuildSplCellList
2467 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2472 * *****************************************************************/
2473 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2476 if(spCellLst->list.array != NULLP)
2478 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2480 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2482 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2484 if(spCellLst->list.array[cellidx]!=NULLP)
2486 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2489 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2492 /*******************************************************************
2494 * @brief Deallocating memory of function BuildAndSendUESetReq
2498 * Function : FreeSRBSetup
2500 * Functionality: Deallocating memory for function BuildSRBSetup
2502 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2507 * ******************************************************************/
2508 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2511 if(srbSet->list.array != NULLP)
2513 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2515 if(srbSet->list.array[srbidx]!=NULLP)
2517 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2520 CU_FREE(srbSet->list.array,srbSet->list.size);
2523 /*******************************************************************
2525 * @brief Deallocating memory of function BuildAndSendUESetReq
2529 * Function : FreeQOSInfo
2531 * Functionality: Deallocating memory for function BuildQOSInfo
2533 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2537 * ****************************************************************/
2538 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2540 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2541 uint8_t qosCntIdx = 0;
2543 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2545 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2547 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2549 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2550 sizeof(MaxDataBurstVolume_t));
2552 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2553 sizeof(AveragingWindow_t));
2555 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2556 sizeof(NonDynamic5QIDescriptor_t));
2558 if(drbQos->iE_Extensions)
2560 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2561 if(qosIeExt->list.array != NULLP)
2563 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2565 if(qosIeExt->list.array[qosCntIdx])
2567 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2570 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2573 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2576 /*******************************************************************
2578 * @brief Deallocating memory of function BuildAndSendUESetReq
2582 * Function : FreeULTnlInfo
2584 * Functionality: Deallocating memory for function BuildULTnlInfo
2586 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2591 * ****************************************************************/
2592 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2595 if(ulInfo->list.array != NULLP)
2597 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2599 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2601 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2603 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2604 transportLayerAddress.buf != NULLP)
2606 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2609 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2610 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2611 gTPTunnel->gTP_TEID.size);
2613 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2614 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2615 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2617 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2618 sizeof(GTPTunnel_t));
2621 if(ulInfo->list.array[ulidx]!=NULLP)
2623 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2626 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2629 /*******************************************************************
2631 * @brief Deallocating memory for BuildAndSendUESetReq
2635 * Function : FreeDRBSetup
2637 * Functionality: Deallocating memory for BuildDRBSetup
2639 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2643 * ****************************************************************/
2644 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2646 DRBs_ToBeSetup_Item_t *drbSetItem;
2647 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2649 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
2651 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
2652 if(drbSet->list.array != NULLP)
2654 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2656 if(drbSet->list.array[drbidx] != NULLP)
2658 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2659 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2661 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2662 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2664 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2665 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2667 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2668 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2670 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2672 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2674 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2676 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2677 flows_Mapped_To_DRB_List.list.array != NULLP)
2679 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2680 flows_Mapped_To_DRB_List.list.count; flowidx++)
2682 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2683 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2685 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2686 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2687 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2689 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2690 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2691 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2693 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2694 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2695 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2697 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2698 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2700 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2701 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2702 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2703 sizeof(MaxDataBurstVolume_t));
2705 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2706 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2707 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2709 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2710 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2711 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2714 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2715 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2717 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2718 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2721 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2722 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2723 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2725 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2726 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2728 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2729 sizeof(OCTET_STRING_t));
2731 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2732 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2734 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2735 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2737 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2738 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2740 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2741 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2743 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2744 iE_Extensions != NULLP)
2746 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
2747 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
2748 if(qosIeExt->list.array != NULLP)
2750 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2752 if(qosIeExt->list.array[qosCntIdx] != NULLP)
2754 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2757 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2759 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2760 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2763 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2765 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2768 CU_FREE(drbSet->list.array,drbSet->list.size);
2773 /*******************************************************************
2775 * @brief Free the UE Setup Request
2779 * Function : FreeUeContextSetupReq
2781 * Functionality: Deallocate the memory of BuildUESetReq
2783 * @params[in] F1AP_PDU_t *f1apMsg
2788 * ****************************************************************/
2789 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2792 UEContextSetupRequest_t *ueSetReq = NULLP;
2794 if(f1apMsg != NULLP)
2796 if(f1apMsg->choice.initiatingMessage != NULLP)
2798 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2799 if(ueSetReq->protocolIEs.list.array != NULLP)
2801 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2803 if(ueSetReq->protocolIEs.list.array[idx])
2805 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2807 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2809 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2811 case ProtocolIE_ID_id_SpCell_ID:
2812 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2814 case ProtocolIE_ID_id_ServCellIndex:
2816 case ProtocolIE_ID_id_SpCellULConfigured:
2818 case ProtocolIE_ID_id_CUtoDURRCInformation:
2819 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2821 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2822 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2824 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2825 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2827 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2828 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2830 case ProtocolIE_ID_id_RRCContainer:
2831 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2833 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2834 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2838 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2842 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
2844 for(ieId=0; ieId<idx; ieId++)
2846 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2848 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2851 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2853 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2855 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2859 /**Filling cell group info **/
2860 /*******************************************************************
2862 * @brief Build Control resource set to add/modify list
2866 * Function : BuildControlRSetToAddModList
2868 * Functionality: Build Control resource set to add/modify list
2871 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2873 * @return ROK - success
2876 * ****************************************************************/
2877 uint8_t BuildControlRSetToAddModList
2879 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2884 uint8_t numBytes, bitsUnused;
2885 struct ControlResourceSet *controlRSet;
2886 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2887 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2890 controlRSetList->list.count = elementCnt;
2891 controlRSetList->list.size = \
2892 elementCnt * sizeof(struct ControlResourceSet *);
2894 controlRSetList->list.array = NULLP;
2895 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2896 if(!controlRSetList->list.array)
2898 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2902 for(idx = 0; idx < elementCnt; idx++)
2904 controlRSetList->list.array[idx] = NULLP;
2905 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2906 if(!controlRSetList->list.array[idx])
2908 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2914 controlRSet = controlRSetList->list.array[idx];
2915 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2917 /* Values harcoded according to our design:
2920 * Bit string stored ff0000000000
2924 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2925 controlRSet->frequencyDomainResources.buf = NULLP;
2926 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2927 controlRSet->frequencyDomainResources.size);
2928 if(!controlRSet->frequencyDomainResources.buf)
2930 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2934 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2935 coreset0EndPrb = CORESET0_END_PRB;
2936 coreset1StartPrb = coreset0EndPrb + 6;
2937 coreset1NumPrb = CORESET1_NUM_PRB;
2938 /* calculate the PRBs */
2939 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2940 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2941 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2943 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2944 controlRSet->cce_REG_MappingType.present = \
2945 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2947 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2948 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2949 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2950 controlRSet->tci_PresentInDCI = NULLP;
2952 uint8_t tciStateIdx;
2954 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2955 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2956 if(!controlRset->tci_StatesPDCCH_ToAddList)
2958 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2963 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2964 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2965 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2966 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2967 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2969 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2973 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2975 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2976 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2978 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2985 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2987 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2988 if(!controlRset->tci_PresentInDCI)
2990 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2994 *(controlRset->tci_PresentInDCI);
2997 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2998 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2999 if(!controlRSet->pdcch_DMRS_ScramblingID)
3001 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3004 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3007 } /* End BuildControlRSetToAddModList */
3009 /*******************************************************************
3011 * @brief Build search space to add/modify list
3015 * Function : BuildSearchSpcToAddModList
3017 * Functionality: Build search space to add/modify list
3020 * @return ROK - success
3023 * ****************************************************************/
3024 uint8_t BuildSearchSpcToAddModList
3026 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3034 struct SearchSpace *searchSpc;
3037 searchSpcList->list.count = elementCnt;
3038 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3040 searchSpcList->list.array = NULLP;
3041 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3042 if(!searchSpcList->list.array)
3044 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3048 for(idx = 0; idx < elementCnt; idx++)
3050 searchSpcList->list.array[idx] = NULLP;
3051 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3052 if(!searchSpcList->list.array[idx])
3054 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3060 searchSpc = searchSpcList->list.array[idx];
3062 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3064 searchSpc->controlResourceSetId = NULLP;
3065 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3066 if(!searchSpc->controlResourceSetId)
3068 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3071 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3073 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3074 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3075 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3076 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3078 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3081 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3082 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3084 searchSpc->duration = NULLP;
3085 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3086 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3087 if(!searchSpc->monitoringSymbolsWithinSlot)
3089 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3093 /* Values taken from reference logs :
3096 * Bit string stores 8000
3101 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3102 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3103 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3104 searchSpc->monitoringSymbolsWithinSlot->size);
3105 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3107 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3112 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3113 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3114 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3115 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3117 searchSpc->nrofCandidates = NULLP;
3118 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3119 if(!searchSpc->nrofCandidates)
3121 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3125 searchSpc->nrofCandidates->aggregationLevel1 = \
3126 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3127 searchSpc->nrofCandidates->aggregationLevel2 = \
3128 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3129 searchSpc->nrofCandidates->aggregationLevel4 = \
3130 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3131 searchSpc->nrofCandidates->aggregationLevel8 = \
3132 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3133 searchSpc->nrofCandidates->aggregationLevel16 = \
3134 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3136 searchSpc->searchSpaceType = NULLP;
3137 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3138 if(!searchSpc->searchSpaceType)
3140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3144 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3146 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3147 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3148 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3149 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3151 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3154 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3155 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3158 }/* End BuildSearchSpcToAddModList */
3160 /*******************************************************************
3162 * @brief Builds BWP DL dedicated PDCCH config
3166 * Function : BuildBWPDlDedPdcchCfg
3168 * Functionality: Builds BWP DL dedicated PDCCH config
3170 * @params[in] struct PDCCH_Config *pdcchCfg
3172 * @return ROK - success
3175 * ****************************************************************/
3176 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3178 pdcchCfg->controlResourceSetToAddModList = NULLP;
3179 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3180 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3181 if(!pdcchCfg->controlResourceSetToAddModList)
3183 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3187 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3192 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3194 pdcchCfg->searchSpacesToAddModList = NULLP;
3195 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3196 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3197 if(!pdcchCfg->searchSpacesToAddModList)
3199 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3203 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3208 pdcchCfg->searchSpacesToReleaseList = NULLP;
3209 pdcchCfg->downlinkPreemption = NULLP;
3210 pdcchCfg->tpc_PUSCH = NULLP;
3211 pdcchCfg->tpc_PUCCH = NULLP;
3212 pdcchCfg->tpc_SRS = NULLP;
3217 /*******************************************************************
3219 * @brief Builds DMRS DL PDSCH Mapping type A
3223 * Function : BuildDMRSDLPdschMapTypeA
3225 * Functionality: Builds DMRS DL PDSCH Mapping type A
3228 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3229 * @return ROK - success
3232 * ****************************************************************/
3233 uint8_t BuildDMRSDLPdschMapTypeA
3235 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3238 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3239 dmrsDlCfg->choice.setup = NULLP;
3240 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3241 if(!dmrsDlCfg->choice.setup)
3243 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3247 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3248 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3249 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3250 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3252 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3255 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3257 dmrsDlCfg->choice.setup->maxLength = NULLP;
3258 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3259 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3260 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3265 /*******************************************************************
3267 * @brief Builds TCI states to add/modify list
3271 * Function : BuildTCIStatesToAddModList
3273 * Functionality:Builds TCI states to add/modify list
3276 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3278 * @return ROK - success
3281 * ****************************************************************/
3282 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3287 /*******************************************************************
3289 * @brief Builds PDSCH time domain allocation list
3293 * Function : BuildPdschTimeDomAllocList
3295 * Functionality: Builds PDSCH time domain allocation list
3298 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3300 * @return ROK - success
3303 * ****************************************************************/
3304 uint8_t BuildPdschTimeDomAllocList
3306 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3311 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3313 timeDomAllocList->present = \
3314 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3316 timeDomAllocList->choice.setup = NULLP;
3317 CU_ALLOC(timeDomAllocList->choice.setup, \
3318 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3319 if(!timeDomAllocList->choice.setup)
3321 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3326 timeDomAllocList->choice.setup->list.count = elementCnt;
3327 timeDomAllocList->choice.setup->list.size = \
3328 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3330 timeDomAllocList->choice.setup->list.array = NULLP;
3331 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3332 timeDomAllocList->choice.setup->list.size);
3333 if(!timeDomAllocList->choice.setup->list.array)
3335 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3339 for(idx = 0; idx < elementCnt; idx++)
3341 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3342 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3343 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3344 if(!timeDomAllocList->choice.setup->list.array[idx])
3346 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3352 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3353 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3354 if(!timeDomAlloc->k0)
3356 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3359 *(timeDomAlloc->k0) = 0;
3360 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3361 timeDomAlloc->startSymbolAndLength = 66;
3364 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3365 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3366 if(!timeDomAlloc->k0)
3368 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3371 *(timeDomAlloc->k0) = 1;
3372 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3373 timeDomAlloc->startSymbolAndLength = 66;
3378 /*******************************************************************
3380 * @brief Builds PDSCH PRB Bundling type
3384 * Function : BuildPdschPrbBundlingType
3386 * Functionality: Builds PDSCH PRB Bundling type
3389 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3391 * @return ROK - success
3394 * ****************************************************************/
3395 uint8_t BuildPdschPrbBundlingType
3397 struct PDSCH_Config__prb_BundlingType *prbBndlType
3400 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3402 prbBndlType->choice.staticBundling = NULLP;
3403 CU_ALLOC(prbBndlType->choice.staticBundling, \
3404 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3405 if(!prbBndlType->choice.staticBundling)
3407 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3410 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3415 /*******************************************************************
3417 * @brief Builds BWP DL dedicated PDSCH config
3421 * Function : BuildBWPDlDedPdschCfg
3423 * Functionality: Builds BWP DL dedicated PDSCH config
3425 * @params[in] struct PDSCH_Config *pdschCfg
3427 * @return ROK - success
3430 * ****************************************************************/
3431 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3433 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3435 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3436 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3437 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3438 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3440 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3444 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3449 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3450 pdschCfg->tci_StatesToAddModList = NULLP;
3451 pdschCfg->tci_StatesToReleaseList = NULLP;
3452 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3454 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3455 if(!pdschCfg->tci_StatesToAddModList)
3457 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3460 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3466 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3468 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3469 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3470 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3471 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3473 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3476 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3480 pdschCfg->pdsch_AggregationFactor = NULLP;
3481 pdschCfg->rateMatchPatternToAddModList = NULLP;
3482 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3483 pdschCfg->rateMatchPatternGroup1 = NULLP;
3484 pdschCfg->rateMatchPatternGroup2 = NULLP;
3485 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3486 pdschCfg->mcs_Table = NULLP;
3488 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3489 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3490 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3492 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3495 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3497 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3502 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3503 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3504 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3505 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3506 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3507 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3508 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3513 /*******************************************************************
3515 * @brief Builds intitial DL BWP
3518 * Function : BuildInitialDlBWP
3520 * Functionality: Builds intitial DL BWP in spCellCfgDed
3522 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3524 * @return ROK - success
3527 * ****************************************************************/
3528 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3530 dlBwp->pdcch_Config = NULLP;
3531 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3532 if(!dlBwp->pdcch_Config)
3534 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3537 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3539 dlBwp->pdcch_Config->choice.setup = NULLP;
3540 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3541 if(!dlBwp->pdcch_Config->choice.setup)
3543 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3546 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3551 dlBwp->pdsch_Config = NULLP;
3552 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3553 if(!dlBwp->pdsch_Config)
3555 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3558 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3560 dlBwp->pdsch_Config->choice.setup = NULLP;
3561 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3562 if(!dlBwp->pdsch_Config->choice.setup)
3564 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3568 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3573 dlBwp->sps_Config = NULLP;
3574 dlBwp->radioLinkMonitoringConfig = NULLP;
3578 /*******************************************************************
3580 * @brief Builds DMRS UL Pusch Mapping type A
3584 * Function : BuildDMRSULPuschMapTypeA
3586 * Functionality: Builds DMRS UL Pusch Mapping type A
3589 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3590 * @return ROK - success
3593 * ****************************************************************/
3594 uint8_t BuildDMRSULPuschMapTypeA
3596 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3599 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3600 dmrsUlCfg->choice.setup= NULLP;
3601 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3602 if(!dmrsUlCfg->choice.setup)
3604 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3608 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3609 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3610 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3611 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3613 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3616 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3618 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3619 dmrsUlCfg->choice.setup->maxLength = NULLP;
3620 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3621 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3622 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3623 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3625 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3629 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3630 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3632 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3634 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3637 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3639 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3640 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3644 /*******************************************************************
3646 * @brief Build PUSCH time domain allocation list
3650 * Function : BuildPuschTimeDomAllocList
3652 * Functionality: Build PUSCH time domain allocation list
3655 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3657 * @return ROK - success
3660 * ****************************************************************/
3661 uint8_t BuildPuschTimeDomAllocList
3663 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3668 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3670 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3671 timeDomAllocList->choice.setup = NULLP;
3672 CU_ALLOC(timeDomAllocList->choice.setup, \
3673 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3674 if(!timeDomAllocList->choice.setup)
3676 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3681 timeDomAllocList->choice.setup->list.count = elementCnt;
3682 timeDomAllocList->choice.setup->list.size = \
3683 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3684 timeDomAllocList->choice.setup->list.array = NULLP;
3685 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3686 timeDomAllocList->choice.setup->list.size);
3687 if(!timeDomAllocList->choice.setup->list.array)
3689 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3693 for(idx = 0; idx < elementCnt; idx++)
3695 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3696 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3697 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3698 if(!timeDomAllocList->choice.setup->list.array[idx])
3700 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3706 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3707 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3708 if(!timeDomAlloc->k2)
3710 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3713 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3714 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3715 timeDomAlloc->startSymbolAndLength = 66;
3718 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3719 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3720 if(!timeDomAlloc->k2)
3722 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3725 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3726 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3727 timeDomAlloc->startSymbolAndLength = 66;
3732 /*******************************************************************
3734 * @brief Builds BWP UL dedicated PUSCH Config
3738 * Function : BuildBWPUlDedPuschCfg
3741 * Builds BWP UL dedicated PUSCH Config
3743 * @params[in] : PUSCH_Config_t *puschCfg
3745 * @return ROK - success
3748 * ****************************************************************/
3749 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3751 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3752 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3753 if(!puschCfg->dataScramblingIdentityPUSCH)
3755 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3758 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3760 puschCfg->txConfig = NULLP;
3761 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3762 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3763 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3764 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3766 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3770 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3775 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3776 puschCfg->pusch_PowerControl = NULLP;
3777 puschCfg->frequencyHopping = NULLP;
3778 puschCfg->frequencyHoppingOffsetLists = NULLP;
3779 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3781 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3782 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3783 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3784 if(!puschCfg->pusch_TimeDomainAllocationList)
3786 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3790 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3795 puschCfg->pusch_AggregationFactor = NULLP;
3796 puschCfg->mcs_Table = NULLP;
3797 puschCfg->mcs_TableTransformPrecoder = NULLP;
3798 puschCfg->transformPrecoder = NULLP;
3799 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3800 if(!puschCfg->transformPrecoder)
3802 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3805 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3807 puschCfg->codebookSubset = NULLP;
3808 puschCfg->maxRank = NULLP;
3809 puschCfg->rbg_Size = NULLP;
3810 puschCfg->uci_OnPUSCH = NULLP;
3811 puschCfg->tp_pi2BPSK = NULLP;
3816 /*******************************************************************
3818 * @brief Builds BWP UL dedicated PUCCH Config
3822 * Function : BuildBWPUlDedPucchCfg
3825 * Builds BWP UL dedicated PUCCH Config
3827 * @params[in] : PUCCH_Config_t *pucchCfg
3829 * @return ROK - success
3832 * ****************************************************************/
3833 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3835 uint8_t arrIdx, elementCnt;
3836 uint8_t rsrcIdx, rsrcSetIdx;
3837 PUCCH_ResourceSet_t *rsrcSet = NULLP;
3838 PUCCH_Resource_t *rsrc = NULLP;
3842 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
3843 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
3844 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
3845 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
3846 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
3848 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
3851 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
3852 rsrcSet->pucch_ResourceSetId = 1;
3854 rsrcSet->resourceList.list.count = elementCnt;
3855 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
3856 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
3857 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
3859 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
3862 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
3866 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
3867 pucchCfg->resourceToAddModList->list.count = elementCnt;
3868 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
3869 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
3870 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
3872 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
3875 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
3876 rsrc->pucch_ResourceId = 1;
3877 rsrc->startingPRB = 0;
3878 rsrc->format.present = PUCCH_Resource__format_PR_format1;
3879 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
3880 rsrc->format.choice.format1->initialCyclicShift = 0;
3881 rsrc->format.choice.format1->nrofSymbols = 4;
3882 rsrc->format.choice.format1->startingSymbolIndex = 0;
3883 rsrc->format.choice.format1->timeDomainOCC = 0;
3886 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
3887 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
3888 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
3889 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
3890 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
3893 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3894 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3896 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3901 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3902 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3903 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3904 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3906 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3910 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3912 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3913 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3915 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3921 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
3922 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
3927 /*******************************************************************
3929 * @brief Fills SRS resource to add/modify list
3933 * Function : BuildSrsRsrcAddModList
3935 * Functionality: Fills SRS resource to add/modify list
3938 * @return ROK - success
3941 * ****************************************************************/
3942 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3948 resourceList->list.count = elementCnt;
3949 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3950 resourceList->list.array = NULLP;
3951 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3952 if(!resourceList->list.array)
3954 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3958 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3960 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3961 if(!resourceList->list.array[rsrcIdx])
3963 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3969 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3970 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3971 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3973 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3974 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3975 sizeof(struct SRS_Resource__transmissionComb__n2));
3976 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3978 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3981 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3982 = SRS_COMB_OFFSET_N2;
3983 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3984 = SRS_CYCLIC_SHIFT_N2;
3986 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3988 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3989 SRS_Resource__resourceMapping__nrofSymbols_n1;
3990 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3991 SRS_Resource__resourceMapping__repetitionFactor_n1;
3993 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3994 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3995 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3996 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3997 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3998 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3999 SRS_Resource__groupOrSequenceHopping_neither;
4001 /* Setting resource type to aperiodic for intergration purposes */
4002 resourceList->list.array[rsrcIdx]->resourceType.present = \
4003 SRS_Resource__resourceType_PR_aperiodic;
4004 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4005 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4006 sizeof(struct SRS_Resource__resourceType__aperiodic));
4007 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4009 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4012 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4017 /*******************************************************************
4019 * @brief Build SRS resource set Add/mod list
4023 * Function : BuildSrsRsrcSetAddModList
4025 * Functionality: Build SRS resource set Add/mod list
4028 * @return ROK - success
4031 * ****************************************************************/
4032 uint8_t BuildSrsRsrcSetAddModList
4034 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4040 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4043 rsrcSetList->list.count = elementCnt;
4044 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4045 rsrcSetList->list.array = NULLP;
4046 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4047 if(!rsrcSetList->list.array)
4049 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4053 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4055 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4056 if(!rsrcSetList->list.array[rSetIdx])
4058 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4064 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4066 /* Fill Resource Id list in resource set */
4067 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4068 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4069 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4070 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4072 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4077 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4078 rsrcIdList->list.count = elementCnt;
4079 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4080 rsrcIdList->list.array = NULLP;
4081 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4082 if(!rsrcIdList->list.array)
4084 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4088 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4090 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4091 if(!rsrcIdList->list.array[rsrcIdx])
4093 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4099 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4101 /* Fill resource type */
4102 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4103 SRS_ResourceSet__resourceType_PR_aperiodic;
4105 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4106 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4107 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4108 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4110 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4113 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4114 = APERIODIC_SRS_RESRC_TRIGGER;
4116 /* TODO : Fill values for below IEs as expected by Viavi */
4117 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4118 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4121 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4122 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4123 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4124 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4125 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4130 /*******************************************************************
4132 * @brief Builds BWP UL dedicated SRS Config
4136 * Function : BuildBWPUlDedSrsCfg
4138 * Functionality: Builds BWP UL dedicated SRS Config
4140 * @params[in] SRS Config
4141 * @return ROK - success
4144 * ****************************************************************/
4145 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4147 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4148 srsCfg->srs_ResourceSetToAddModList = NULLP;
4149 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4150 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4151 if(!srsCfg->srs_ResourceSetToAddModList)
4153 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4156 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4161 srsCfg->srs_ResourceToReleaseList = NULLP;
4163 /* Resource to Add/Modify list */
4164 srsCfg->srs_ResourceToAddModList = NULLP;
4165 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4166 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4167 if(!srsCfg->srs_ResourceToAddModList)
4169 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4173 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4178 srsCfg->tpc_Accumulation = NULLP;
4183 /*******************************************************************
4185 * @brief Builds inital UL BWP
4189 * Function : BuildInitialUlBWP
4191 * Functionality: Builds initial UL BWP
4193 * @params[in] BWP_UplinkDedicated_t *ulBwp
4194 * @return ROK - success
4197 * ****************************************************************/
4198 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4200 ulBwp->pucch_Config = NULLP;
4201 ulBwp->pucch_Config = NULLP;
4202 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4203 if(!ulBwp->pucch_Config)
4205 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4209 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4210 ulBwp->pucch_Config->choice.setup = NULLP;
4211 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4212 if(!ulBwp->pucch_Config->choice.setup)
4214 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4218 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4223 /* Fill BWP UL dedicated PUSCH config */
4224 ulBwp->pusch_Config = NULLP;
4225 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4226 if(!ulBwp->pusch_Config)
4228 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4232 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4233 ulBwp->pusch_Config->choice.setup = NULLP;
4234 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4235 if(!ulBwp->pusch_Config->choice.setup)
4237 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4241 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4246 ulBwp->configuredGrantConfig = NULLP;
4248 /* Fill BPW UL dedicated SRS config */
4249 ulBwp->srs_Config = NULLP;
4250 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4251 if(!ulBwp->srs_Config)
4253 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4257 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4258 ulBwp->srs_Config->choice.setup = NULLP;
4259 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4260 if(!ulBwp->srs_Config->choice.setup)
4262 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4266 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4271 ulBwp->beamFailureRecoveryConfig = NULLP;
4276 /*******************************************************************
4278 * @brief Builds Pusch Serving cell Config
4282 * Function : BuildPuschSrvCellCfg
4284 * Functionality: Builds Pusch Serving cell Config
4286 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4288 * @return ROK - success
4291 * ****************************************************************/
4292 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4294 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4295 puschCfg->choice.setup = NULLP;
4296 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4297 if(!puschCfg->choice.setup)
4299 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4303 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4304 puschCfg->choice.setup->rateMatching = NULLP;
4305 puschCfg->choice.setup->xOverhead = NULLP;
4306 puschCfg->choice.setup->ext1 = NULLP;
4307 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4308 if(!puschCfg->choice.setup->ext1)
4310 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4314 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4315 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4316 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4318 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4321 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4323 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4324 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4325 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4327 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4330 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4334 /*******************************************************************
4336 * @brief Builds UL config
4339 * Function : BuildUlCfg
4341 * Functionality: Builds UL config in spCellCfgDed
4343 * @params[in] UplinkConfig_t *ulCfg
4345 * @return ROK - success
4348 * ****************************************************************/
4349 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4351 ulCfg->initialUplinkBWP = NULLP;
4352 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4353 if(!ulCfg->initialUplinkBWP)
4355 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4359 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4364 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4365 ulCfg->uplinkBWP_ToAddModList = NULLP;
4366 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4367 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4368 if(!ulCfg->firstActiveUplinkBWP_Id)
4370 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4373 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4375 ulCfg->pusch_ServingCellConfig = NULLP;
4376 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4377 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4378 if(!ulCfg->pusch_ServingCellConfig)
4380 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4384 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4389 ulCfg->carrierSwitching = NULLP;
4390 ulCfg->ext1 = NULLP;
4394 /*******************************************************************
4396 * @brief Builds PDSCH serving cell config
4399 * Function : BuildPdschSrvCellCfg
4401 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4403 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4405 * @return ROK - success
4408 * ****************************************************************/
4409 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4411 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4412 pdschCfg->choice.setup = NULLP;
4413 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4414 if(!pdschCfg->choice.setup)
4416 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4420 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4421 pdschCfg->choice.setup->xOverhead = NULLP;
4422 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4423 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4424 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4426 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4429 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4430 pdschCfg->choice.setup->pucch_Cell = NULLP;
4431 pdschCfg->choice.setup->ext1 = NULLP;
4436 /*******************************************************************
4438 * @brief Builds CSI Meas config
4441 * Function : BuildCsiMeasCfg
4443 * Functionality: Builds CSI Meas config in spCellCfgDed
4445 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4447 * @return ROK - success
4450 * ****************************************************************/
4451 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4457 /*******************************************************************
4459 * @brief Builds Spcell config dedicated
4462 * Function : BuildSpCellCfgDed
4464 * Functionality: Builds sp cell config dedicated in spCellCfg
4466 * @params[in] ServingCellConfig_t srvCellCfg
4468 * @return ROK - success
4471 * ****************************************************************/
4472 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4474 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4476 srvCellCfg->initialDownlinkBWP = NULLP;
4477 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4478 if(!srvCellCfg->initialDownlinkBWP)
4480 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4484 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4486 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4489 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4490 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4492 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4493 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4494 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4496 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4499 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4501 srvCellCfg->bwp_InactivityTimer = NULLP;
4503 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4504 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4505 if(!srvCellCfg->defaultDownlinkBWP_Id)
4507 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4510 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4512 srvCellCfg->uplinkConfig = NULLP;
4513 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4514 if(!srvCellCfg->uplinkConfig)
4516 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4520 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4522 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4525 srvCellCfg->supplementaryUplink = NULLP;
4526 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4528 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4529 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4530 if(!srvCellCfg->pdsch_ServingCellConfig)
4532 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4536 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4538 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4542 srvCellCfg->csi_MeasConfig = NULLP;
4544 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4545 if(!srvCellCfg->csi_MeasConfig)
4547 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4551 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4553 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4557 srvCellCfg->sCellDeactivationTimer = NULLP;
4558 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4559 srvCellCfg->tag_Id = TAG_ID;
4560 srvCellCfg->dummy = NULLP;
4561 srvCellCfg->pathlossReferenceLinking = NULLP;
4562 srvCellCfg->servingCellMO = NULLP;
4563 srvCellCfg->ext1 = NULLP;
4567 /*******************************************************************
4569 * @brief Builds Spcell config
4573 * Function : BuildSpCellCfg
4575 * Functionality: Builds sp cell config in DuToCuRrcContainer
4577 * @params[in] SpCellConfig_t spCellCfg
4579 * @return ROK - success
4582 * ****************************************************************/
4583 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4586 spCellCfg->servCellIndex = NULLP;
4587 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4588 if(!spCellCfg->servCellIndex)
4590 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4593 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4595 spCellCfg->reconfigurationWithSync = NULLP;
4596 spCellCfg->rlf_TimersAndConstants = NULLP;
4597 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4598 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4599 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4601 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4604 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4606 spCellCfg->spCellConfigDedicated = NULLP;
4607 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4608 if(!spCellCfg->spCellConfigDedicated)
4610 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4613 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4615 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4620 /*******************************************************************
4622 * @brief Builds Phy cell group config
4626 * Function : BuildPhyCellGrpCfg
4628 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4630 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4632 * @return ROK - success
4635 * ****************************************************************/
4636 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4638 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4639 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4641 phyCellGrpCfg->p_NR_FR1 = NULLP;
4642 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4643 if(!phyCellGrpCfg->p_NR_FR1)
4645 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4648 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4649 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4650 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4651 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4652 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4653 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4654 phyCellGrpCfg->cs_RNTI = NULLP;
4655 phyCellGrpCfg->ext1 = NULLP;
4656 phyCellGrpCfg->ext2 = NULLP;
4661 /*******************************************************************
4663 * @brief Builds tag config
4667 * Function : BuildTagConfig
4669 * Functionality: Builds tag config in MacCellGroupConfig
4671 * @params[in] TAG_Config *tag_Config
4673 * @return ROK - success
4676 * ****************************************************************/
4677 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4679 struct TAG_Config__tag_ToAddModList *tagList;
4680 uint8_t idx, elementCnt;
4682 tagConfig->tag_ToReleaseList = NULLP;
4683 tagConfig->tag_ToAddModList = NULLP;
4684 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4685 if(!tagConfig->tag_ToAddModList)
4687 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4691 elementCnt = 1; //ODU_VALUE_ONE;
4692 tagList = tagConfig->tag_ToAddModList;
4693 tagList->list.count = elementCnt;
4694 tagList->list.size = elementCnt * sizeof(struct TAG *);
4696 tagList->list.array = NULLP;
4697 CU_ALLOC(tagList->list.array, tagList->list.size);
4698 if(!tagList->list.array)
4700 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4704 for(idx=0; idx<tagList->list.count; idx++)
4706 tagList->list.array[idx] = NULLP;
4707 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4708 if(!tagList->list.array[idx])
4710 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4716 tagList->list.array[idx]->tag_Id = TAG_ID;
4717 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4722 /*******************************************************************
4724 * @brief Builds PHR Config
4728 * Function : BuildPhrConfig
4730 * Functionality: Builds phrConfig in MacCellGroupConfig
4732 * @params[in] PHR Config *
4734 * @return ROK - success
4737 * ****************************************************************/
4738 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4741 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4742 phrConfig->choice.setup = NULLP;
4743 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4744 if(!phrConfig->choice.setup)
4746 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4750 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4751 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4752 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4753 phrConfig->choice.setup->multiplePHR = false;
4754 phrConfig->choice.setup->dummy = false;
4755 phrConfig->choice.setup->phr_Type2OtherCell = false;
4756 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4761 /*******************************************************************
4763 * @brief Builds BSR Config
4767 * Function : BuildBsrConfig
4769 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4771 * @params[in] BSR_Config *bsrConfig
4773 * @return ROK - success
4776 * ****************************************************************/
4777 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4779 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4780 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4781 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4786 /*******************************************************************
4788 * @brief Builds scheduling request config
4792 * Function : BuildSchedulingReqConfig
4794 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4796 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4798 * @return ROK - success
4801 * ****************************************************************/
4802 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4804 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4805 uint8_t idx, elementCnt;
4807 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4808 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4809 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4810 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4812 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4816 elementCnt = 1; //ODU_VALUE_ONE;
4817 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4818 schReqList->list.count = elementCnt;
4819 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4821 schReqList->list.array = NULLP;
4822 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4823 if(!schReqList->list.array)
4825 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4829 for(idx=0;idx<schReqList->list.count; idx++)
4831 schReqList->list.array[idx] = NULLP;
4832 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4833 if(!schReqList->list.array[idx])
4835 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4841 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4843 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4844 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4845 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4847 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4850 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4851 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4852 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4856 /*******************************************************************
4858 * @brief Builds Mac cell group config
4862 * Function : BuildMacCellGrpCfg
4864 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4866 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4868 * @return ROK - success
4871 * ****************************************************************/
4872 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4874 macCellGrpCfg->drx_Config = NULLP;
4875 macCellGrpCfg->schedulingRequestConfig = NULLP;
4876 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4877 if(!macCellGrpCfg->schedulingRequestConfig)
4879 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4883 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4885 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4889 macCellGrpCfg->bsr_Config = NULLP;
4890 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4891 if(!macCellGrpCfg->bsr_Config)
4893 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4897 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4899 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4903 macCellGrpCfg->tag_Config = NULLP;
4904 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4905 if(!macCellGrpCfg->tag_Config)
4907 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4911 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4913 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4917 macCellGrpCfg->phr_Config = NULLP;
4918 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4919 if(!macCellGrpCfg->phr_Config)
4921 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4925 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4927 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4931 macCellGrpCfg->skipUplinkTxDynamic = false;
4932 macCellGrpCfg->ext1 = NULLP;
4936 /*******************************************************************
4938 * @brief Frees memeory allocated for SearchSpcToAddModList
4942 * Function : FreeSearchSpcToAddModList
4944 * Functionality: Deallocating memory of SearchSpcToAddModList
4946 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4950 4221 * ****************************************************************/
4951 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4955 struct SearchSpace *searchSpc=NULLP;
4957 if(searchSpcList->list.array)
4959 if(searchSpcList->list.array[idx2])
4961 searchSpc = searchSpcList->list.array[idx2];
4962 if(searchSpc->controlResourceSetId)
4964 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4966 if(searchSpc->monitoringSymbolsWithinSlot)
4968 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4970 if(searchSpc->nrofCandidates)
4972 if(searchSpc->searchSpaceType)
4974 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4975 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4976 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4977 SearchSpace__searchSpaceType));
4979 CU_FREE(searchSpc->nrofCandidates,
4980 sizeof(struct SearchSpace__nrofCandidates));
4982 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4983 searchSpc->monitoringSymbolsWithinSlot->size);
4985 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4986 sizeof(BIT_STRING_t));
4988 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4989 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4991 CU_FREE(searchSpc->controlResourceSetId,
4992 sizeof(ControlResourceSetId_t));
4995 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4997 CU_FREE(searchSpcList->list.array[idx1],
4998 sizeof(struct SearchSpace));
5000 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5003 /*******************************************************************
5005 * @brief Frees memory allocated for PdschTimeDomAllocList
5009 * Function : FreePdschTimeDomAllocList
5011 * Functionality: Deallocating memory of PdschTimeDomAllocList
5013 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5017 4221 * ****************************************************************/
5018 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5022 if(timeDomAllocList->choice.setup)
5024 if(timeDomAllocList->choice.setup->list.array)
5026 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5028 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5029 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5031 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5032 timeDomAllocList->choice.setup->list.size);
5034 CU_FREE(timeDomAllocList->choice.setup,\
5035 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5038 /*******************************************************************
5040 * @brief Frees memory allocated for PuschTimeDomAllocList
5044 * Function : FreePuschTimeDomAllocList
5046 * Functionality: Deallocating memory of PuschTimeDomAllocList
5048 * @params[in] PUSCH_Config_t *puschCfg
5052 ***********************************************************************/
5053 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5057 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5059 if(puschCfg->pusch_TimeDomainAllocationList)
5061 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5062 if(timeDomAllocList_t->choice.setup)
5064 if(timeDomAllocList_t->choice.setup->list.array)
5066 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5067 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5069 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5070 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5072 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5073 timeDomAllocList_t->choice.setup->list.size);
5075 CU_FREE(timeDomAllocList_t->choice.setup, \
5076 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5078 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5079 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5080 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5085 /*******************************************************************
5087 * @brief Frees memory allocated for Dedicated PUCCH config
5091 * Function : FreeBWPUlDedPucchCfg
5093 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5095 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5099 * ****************************************************************/
5100 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5102 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5103 PUCCH_Config_t *pucchCfg = NULLP;
5104 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5105 PUCCH_Resource_t *rsrc = NULLP;
5109 if(ulBwpPucchCfg->choice.setup)
5111 pucchCfg = ulBwpPucchCfg->choice.setup;
5113 //Free resource set list
5114 if(pucchCfg->resourceSetToAddModList)
5116 if(pucchCfg->resourceSetToAddModList->list.array)
5118 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5120 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5121 if(rsrcSet->resourceList.list.array)
5123 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5125 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5127 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5129 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5131 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5133 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5136 //Free resource list
5137 if(pucchCfg->resourceToAddModList)
5139 if(pucchCfg->resourceToAddModList->list.array)
5141 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5143 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5144 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5145 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5147 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5149 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5153 if(pucchCfg->format1)
5155 if(pucchCfg->format1->choice.setup)
5157 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5158 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5160 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5164 if(pucchCfg->dl_DataToUL_ACK)
5166 if(pucchCfg->dl_DataToUL_ACK->list.array)
5168 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5170 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5172 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5174 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5177 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5179 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5183 /*******************************************************************
5185 * @brief Frees memory allocated for InitialUlBWP
5189 * Function : FreeInitialUlBWP
5191 * Functionality: Deallocating memory of InitialUlBWP
5193 * @params[in] BWP_UplinkDedicated_t *ulBwp
5197 * ****************************************************************/
5198 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5200 uint8_t rSetIdx, rsrcIdx;
5201 SRS_Config_t *srsCfg = NULLP;
5202 PUSCH_Config_t *puschCfg = NULLP;
5203 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5204 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5205 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5206 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5208 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5210 if(ulBwp->pusch_Config)
5212 if(ulBwp->pusch_Config->choice.setup)
5214 puschCfg=ulBwp->pusch_Config->choice.setup;
5215 if(puschCfg->dataScramblingIdentityPUSCH)
5217 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5219 FreePuschTimeDomAllocList(puschCfg);
5220 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5221 if(dmrsUlCfg->choice.setup)
5223 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5225 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5227 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5229 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5230 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5232 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5235 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5237 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5238 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5240 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5242 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5244 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5246 /* Free SRS-Config */
5247 if(ulBwp->srs_Config)
5249 if(ulBwp->srs_Config->choice.setup)
5251 srsCfg = ulBwp->srs_Config->choice.setup;
5253 /* Free Resource Set to add/mod list */
5254 if(srsCfg->srs_ResourceSetToAddModList)
5256 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5257 if(rsrcSetList->list.array)
5261 /* Free SRS resource Id list in this SRS resource set */
5262 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5264 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5266 if(rsrcIdList->list.array)
5268 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5270 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5272 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5274 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5275 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5278 /* Free resource type info for this SRS resource set */
5279 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5280 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5282 /* Free memory for each resource set */
5283 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5285 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5287 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5289 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5290 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5293 /* Free resource to add/modd list */
5294 if(srsCfg->srs_ResourceToAddModList)
5296 resourceList = srsCfg->srs_ResourceToAddModList;
5297 if(resourceList->list.array)
5300 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5301 sizeof(struct SRS_Resource__transmissionComb__n2));
5302 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5303 sizeof(struct SRS_Resource__resourceType__aperiodic));
5305 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5307 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5309 CU_FREE(resourceList->list.array, resourceList->list.size);
5311 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5312 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5315 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5317 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5321 /*******************************************************************
5323 * @brief Frees memory allocated for initialUplinkBWP
5327 * Function : FreeinitialUplinkBWP
5329 * Functionality: Deallocating memory of initialUplinkBWP
5331 * @params[in] UplinkConfig_t *ulCfg
5336 * ****************************************************************/
5337 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5339 BWP_UplinkDedicated_t *ulBwp=NULLP;
5340 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5342 if(ulCfg->initialUplinkBWP)
5344 ulBwp=ulCfg->initialUplinkBWP;
5345 if(ulCfg->firstActiveUplinkBWP_Id)
5347 if(ulCfg->pusch_ServingCellConfig)
5349 puschCfg=ulCfg->pusch_ServingCellConfig;
5350 if(puschCfg->choice.setup)
5352 if(puschCfg->choice.setup->ext1)
5354 CU_FREE(puschCfg->choice.setup->ext1->\
5355 processingType2Enabled,sizeof(BOOLEAN_t));
5356 CU_FREE(puschCfg->choice.setup->ext1->\
5357 maxMIMO_Layers,sizeof(long));
5358 CU_FREE(puschCfg->choice.setup->ext1, \
5359 sizeof(struct PUSCH_ServingCellConfig__ext1));
5361 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5363 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5365 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5367 FreeInitialUlBWP(ulBwp);
5368 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5371 /*******************************************************************
5373 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5377 * Function : FreeBWPDlDedPdschCfg
5379 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5381 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5386 * ****************************************************************/
5387 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5389 struct PDSCH_Config *pdschCfg=NULLP;
5390 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5391 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5392 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5394 if(dlBwp->pdsch_Config->choice.setup)
5396 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5397 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5399 if(pdschCfg->pdsch_TimeDomainAllocationList)
5401 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5402 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5404 prbBndlType=&pdschCfg->prb_BundlingType;
5405 CU_FREE(prbBndlType->choice.staticBundling,\
5406 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5407 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5409 FreePdschTimeDomAllocList(timeDomAllocList);
5410 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5411 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5413 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5414 if(dmrsDlCfg->choice.setup)
5416 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5418 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5420 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5421 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5423 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5426 /*******************************************************************
5428 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5432 * Function : FreeBWPDlDedPdcchCfg
5434 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5436 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5441 * ****************************************************************/
5442 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5446 struct PDCCH_Config *pdcchCfg=NULLP;
5447 struct ControlResourceSet *controlRSet=NULLP;
5448 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5450 if(dlBwp->pdcch_Config->choice.setup)
5452 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5453 if(pdcchCfg->controlResourceSetToAddModList)
5455 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5456 if(controlRSetList->list.array)
5458 controlRSet = controlRSetList->list.array[idx2];
5461 if(controlRSet->frequencyDomainResources.buf)
5463 if(controlRSet->pdcch_DMRS_ScramblingID)
5465 if(pdcchCfg->searchSpacesToAddModList)
5467 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5468 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5469 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5471 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5473 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5474 controlRSet->frequencyDomainResources.size);
5477 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5479 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5481 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5483 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5484 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5486 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5489 /*******************************************************************
5491 * @brief Builds RLC Config
5495 * Function : BuildRlcConfig
5497 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5499 * @params[in] RLC_Config *rlcConfig
5501 * @return ROK - success
5504 * ****************************************************************/
5505 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5508 rlcConfig->present = RLC_Config_PR_am;
5510 rlcConfig->choice.am = NULLP;
5511 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5512 if(!rlcConfig->choice.am)
5514 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5519 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5520 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5521 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5523 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5526 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5527 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5528 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5529 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5530 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5533 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5534 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5535 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5537 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5540 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5541 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5542 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5547 /*******************************************************************
5549 * @brief Builds MAC LC Config
5553 * Function : BuildMacLCConfig
5555 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5557 * @params[in] struct LogicalChannelConfig macLcConfig
5559 * @return ROK - success
5562 * ****************************************************************/
5563 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5566 macLcConfig->ul_SpecificParameters = NULLP;
5567 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5568 if(!macLcConfig->ul_SpecificParameters)
5570 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5574 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5575 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5576 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5577 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5578 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5579 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5580 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5582 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5583 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5584 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5586 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5589 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5591 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5592 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5593 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5595 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5598 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5600 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5601 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5602 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5606 /*******************************************************************
5608 * @brief Builds RLC Bearer to Add/Mod list
5612 * Function :BuildRlcBearerToAddModList
5614 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5616 * @params[in] rlc_BearerToAddModList
5618 * @return ROK - success
5621 * ****************************************************************/
5622 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5624 uint8_t idx, elementCnt;
5627 rlcBearerList->list.count = elementCnt;
5628 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5630 rlcBearerList->list.array = NULLP;
5631 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5632 if(!rlcBearerList->list.array)
5634 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5638 for(idx=0; idx<rlcBearerList->list.count; idx++)
5640 rlcBearerList->list.array[idx] = NULLP;
5641 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5642 if(!rlcBearerList->list.array[idx])
5644 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5650 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5652 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5653 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5655 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5659 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5660 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5662 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5663 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5664 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5665 if(!rlcBearerList->list.array[idx]->rlc_Config)
5667 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5671 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5673 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5677 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5678 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5679 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5681 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5685 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5687 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5694 /*******************************************************************
5696 * @brief Free memory allocated for CellGroupConfig
5700 * Function : FreeMemCellGrpCfg
5702 * Functionality: Deallocating memory of CellGroupConfig
5704 * @params[in] pointer to CellGroupConfigRrc_t
5706 * @return ROK - success
5709 ******************************************************************/
5710 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5713 SpCellConfig_t *spCellCfg=NULLP;
5714 ServingCellConfig_t *srvCellCfg=NULLP;
5715 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5716 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5717 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5718 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5719 struct RLC_Config *rlcConfig=NULLP;
5720 struct LogicalChannelConfig *macLcConfig=NULLP;
5721 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5722 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5723 struct TAG_Config *tagConfig=NULLP;
5724 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5725 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5726 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5728 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5731 if(rlcBearerList->list.array)
5733 for(idx=0; idx<rlcBearerList->list.count; idx++)
5735 if(rlcBearerList->list.array[idx])
5737 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5738 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5741 if(rlcConfig->choice.am)
5743 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5744 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5745 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5747 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5749 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5752 if(macLcConfig->ul_SpecificParameters)
5754 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5755 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5756 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5758 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5760 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5763 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5765 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5768 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5771 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5772 if(schedulingRequestConfig)
5774 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5777 if(schReqList->list.array)
5779 for(idx=0;idx<schReqList->list.count; idx++)
5781 if(schReqList->list.array[idx])
5783 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5784 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5787 CU_FREE(schReqList->list.array, schReqList->list.size);
5789 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5790 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5791 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5793 if(macCellGrpCfg->bsr_Config)
5795 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5797 tagConfig = macCellGrpCfg->tag_Config;
5800 tagList = tagConfig->tag_ToAddModList;
5803 if(tagList->list.array)
5805 for(idx=0; idx<tagList->list.count; idx++)
5807 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5809 CU_FREE(tagList->list.array, tagList->list.size);
5811 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5813 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5816 phrConfig = macCellGrpCfg->phr_Config;
5819 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5820 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5823 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5826 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5829 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5830 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5833 spCellCfg = cellGrpCfg->spCellConfig;
5836 if(spCellCfg->servCellIndex)
5838 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5840 if(spCellCfg->spCellConfigDedicated)
5842 srvCellCfg = spCellCfg->spCellConfigDedicated;
5843 if(srvCellCfg->initialDownlinkBWP)
5845 dlBwp = srvCellCfg->initialDownlinkBWP;
5846 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5848 if(srvCellCfg->defaultDownlinkBWP_Id)
5850 if(srvCellCfg->uplinkConfig)
5852 if(srvCellCfg->pdsch_ServingCellConfig)
5854 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5855 if(pdschCfg->choice.setup)
5857 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5858 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5860 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5861 ServingCellConfig__pdsch_ServingCellConfig));
5863 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5864 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5866 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5868 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5870 if(dlBwp->pdcch_Config)
5872 if(dlBwp->pdsch_Config)
5874 FreeBWPDlDedPdschCfg(dlBwp);
5875 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5877 FreeBWPDlDedPdcchCfg(dlBwp);
5878 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5880 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5882 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5884 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5886 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5888 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5893 /*******************************************************************
5895 * @brief Fills CellGroupConfig
5899 * Function : fillCellGrpCfg
5901 * Functionality: Fills CellGroupConfig
5903 * @params[in] pointer to CellGroupConfigRrc_t
5905 * @return ROK - success
5908 ******************************************************************/
5910 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5912 uint8_t ret = RFAILED;
5913 CellGroupConfigRrc_t cellGrpCfg;
5914 asn_enc_rval_t encRetVal;
5918 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5920 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5921 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5922 if(!cellGrpCfg.rlc_BearerToAddModList)
5924 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5927 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5929 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5933 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5934 cellGrpCfg.mac_CellGroupConfig = NULLP;
5935 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5936 if(!cellGrpCfg.mac_CellGroupConfig)
5938 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5941 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5943 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5948 cellGrpCfg.physicalCellGroupConfig = NULLP;
5949 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5950 if(!cellGrpCfg.physicalCellGroupConfig)
5952 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5955 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5957 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5961 cellGrpCfg.spCellConfig = NULLP;
5962 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5963 if(!cellGrpCfg.spCellConfig)
5965 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5968 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5970 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5974 cellGrpCfg.sCellToAddModList = NULLP;
5975 cellGrpCfg.sCellToReleaseList = NULLP;
5976 cellGrpCfg.ext1 = NULLP;
5978 /* encode cellGrpCfg into duToCuRrcContainer */
5979 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5980 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5982 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5983 /* Encode results */
5984 if(encRetVal.encoded == ENCODE_FAIL)
5986 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5987 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5992 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5993 for(int i=0; i< encBufSize; i++)
5995 DU_LOG("%x",encBuf[i]);
5999 cellGrp->size = encBufSize;
6000 CU_ALLOC(cellGrp->buf, cellGrp->size);
6003 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6006 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6010 FreeMemCellGrpCfg(&cellGrpCfg);
6014 /*******************************************************************
6016 * @brief Free UE Capability RAT container
6020 * Function : freeUeCapRatCont
6023 * Free UE Capability RAT conatiner
6026 * @return ROK - success
6029 * ****************************************************************/
6030 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6033 FeatureSets_t *featureSets;
6035 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6037 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6039 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6040 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6042 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6045 if(ueNrCap->featureSets)
6047 featureSets = ueNrCap->featureSets;
6048 if(featureSets->featureSetsDownlinkPerCC)
6050 if(featureSets->featureSetsDownlinkPerCC->list.array)
6052 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6054 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6055 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6056 sizeof(ModulationOrder_t));
6057 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6059 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6061 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6064 if(featureSets->featureSetsUplinkPerCC)
6066 if(featureSets->featureSetsUplinkPerCC->list.array)
6068 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6070 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6072 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6073 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6074 sizeof(ModulationOrder_t));
6075 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6078 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6080 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6082 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6086 /*******************************************************************
6088 * @brief Free UE capability RAT container list
6092 * Function : freeUeCapRatContList
6094 * Functionality: Free UE capability RAT container list
6097 * @return ROK - success
6100 * ****************************************************************/
6101 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6104 if(ueCapablityList->list.array)
6106 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6108 if(ueCapablityList->list.array[idx])
6109 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6111 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6115 /*******************************************************************
6117 * @brief Fill feature sets
6121 * Function : fillFeatureSets
6123 * Functionality: Fill feature sets
6126 * @return ROK - success
6129 * ****************************************************************/
6130 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6132 uint8_t idx, elementCnt;
6134 featureSets->featureSetsDownlink = NULLP;
6135 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6136 if(!featureSets->featureSetsDownlinkPerCC)
6138 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6143 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6144 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6145 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6146 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6148 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6152 for(idx = 0; idx < elementCnt; idx++)
6154 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6155 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6157 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6163 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6164 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6165 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6166 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6167 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6169 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6170 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6172 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6175 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6177 featureSets->featureSetsUplink = NULLP;
6178 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6179 if(!featureSets->featureSetsUplinkPerCC)
6181 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6186 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6187 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6188 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6189 if(!featureSets->featureSetsUplinkPerCC->list.array)
6191 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6195 for(idx = 0; idx < elementCnt; idx++)
6197 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6198 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6200 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6206 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6207 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6208 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6209 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6210 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6211 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6213 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6214 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6216 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6219 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6224 /*******************************************************************
6226 * @brief Fill UE capability RAT container
6230 * Function : fillUeCapRatCont
6232 * Functionality: Fill UE capability RAT container
6234 * @params[in] UE Capability RAT container buffer
6235 * @return ROK - success
6238 * ****************************************************************/
6239 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6242 uint8_t idx, elementCnt;
6243 asn_enc_rval_t encRetVal;
6244 UE_NR_Capability_t ueNrCap;
6248 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6250 /* Filling PDCP parameters */
6251 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6252 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6253 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6254 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6255 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6256 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6257 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6258 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6259 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6260 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6261 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6262 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6263 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6264 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6265 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6266 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6267 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6269 ueNrCap.rlc_Parameters = NULLP;
6270 ueNrCap.mac_Parameters = NULLP;
6272 /* Filling PHY parameters */
6273 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6274 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6275 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6276 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6277 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6279 /* Filling RF parameters */
6281 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6282 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6283 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6284 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6286 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6291 for(idx = 0; idx < elementCnt; idx++)
6293 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6294 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6304 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6305 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6306 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6308 ueNrCap.measAndMobParameters = NULLP;
6309 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6310 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6311 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6312 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6313 ueNrCap.featureSets = NULLP;
6315 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6316 if(!ueNrCap.featureSets)
6318 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6323 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6325 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6330 ueNrCap.featureSetCombinations = NULLP;
6331 ueNrCap.lateNonCriticalExtension = NULLP;
6332 ueNrCap.nonCriticalExtension = NULLP;
6334 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6335 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6336 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6338 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6340 /* Encode results */
6341 if(encRetVal.encoded == ENCODE_FAIL)
6343 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6344 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6349 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6350 for(int i=0; i< encBufSize; i++)
6352 DU_LOG("%x",encBuf[i]);
6356 ueCapRatContBuf->size = encBufSize;
6357 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6358 if(!ueCapRatContBuf->buf)
6360 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6363 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6367 freeUeCapRatCont(&ueNrCap);
6371 /*******************************************************************
6373 * @brief Fill UE Capability RAT container list
6377 * Function : fillUeCapRatContList
6379 * Functionality: Fill UE Capability RAT container list
6382 * @params[in] UE capability RAT container list buffer
6383 * @return ROK - success
6386 * ****************************************************************/
6387 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6389 uint8_t ret = RFAILED;
6390 uint8_t idx, elementCnt;
6391 asn_enc_rval_t encRetVal;
6392 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6397 ueCapablityList.list.count = elementCnt;
6398 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6400 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6401 if(!ueCapablityList.list.array)
6403 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6408 for(idx=0; idx<elementCnt; idx++)
6410 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6411 if(ueCapablityList.list.array[idx] == NULLP)
6413 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6419 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6420 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6422 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6423 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6424 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6426 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6427 &ueCapablityList, PrepFinalEncBuf, encBuf);
6429 /* Encode results */
6430 if(encRetVal.encoded == ENCODE_FAIL)
6432 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6433 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6438 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6439 for(int i=0; i< encBufSize; i++)
6441 DU_LOG("%x",encBuf[i]);
6445 ueCapablityListBuf->size = encBufSize;
6446 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6447 if(!ueCapablityListBuf->buf)
6449 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6452 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6456 freeUeCapRatContList(&ueCapablityList);
6460 /*******************************************************************
6462 * @brief Fills CuToDuContainer
6466 * Function : fillCuToDuContainer
6468 * Functionality: Fills CuToDuContainer
6470 * @params[in] pointer to CUtoDURRCInformation_t
6472 * @return ROK - success
6475 ******************************************************************/
6477 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6479 uint8_t elementCnt = 0;
6481 uint8_t idx, idx2, rrcBufLen;
6483 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6484 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6486 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6489 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6491 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6492 if(rrcMsg->iE_Extensions)
6495 rrcMsg->iE_Extensions->list.count = elementCnt;
6496 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6498 /* Initialize the CUtoDURRCInformation_ExtIEs */
6499 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6501 if(rrcMsg->iE_Extensions->list.array == NULLP)
6503 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6507 for(idx=0; idx<elementCnt; idx++)
6509 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6510 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6516 /* Filling CellGroupConfig_t IE */
6517 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6518 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6519 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6520 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6521 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6526 /*******************************************************************
6528 * @brief Free CuToDuContainer
6532 * Function : FreeCuToDuInfo
6534 * Functionality: Free CuToDuContainer
6536 * @params[in] pointer to CUtoDURRCInformation_t
6538 * @return ROK - success
6541 ******************************************************************/
6543 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6547 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6549 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6550 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6551 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6553 if(rrcMsg->iE_Extensions)
6555 if(rrcMsg->iE_Extensions->list.array)
6557 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6559 if(rrcMsg->iE_Extensions->list.array[idx])
6561 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6563 case ProtocolIE_ID_id_CellGroupConfig:
6564 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6566 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6567 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6572 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6573 rrcMsg->iE_Extensions->list.array[idx]->id);
6579 for(idx2 = 0; idx2 < idx; idx2++)
6581 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6583 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6587 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6590 /*******************************************************************
6592 * @brief Builds and sends the UE Setup Request
6596 * Function : BuildAndSendUeContextSetupReq
6598 * Functionality: Constructs the UE Setup Request and sends
6599 * it to the CU through SCTP.
6603 * @return ROK - success
6606 * ****************************************************************/
6607 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6608 uint16_t rrcContLen, uint8_t *rrcContainer)
6611 uint8_t SplCellListret;
6612 uint8_t SrbSetupret;
6614 uint8_t idx, bufLen;
6616 F1AP_PDU_t *f1apMsg = NULLP;
6617 UEContextSetupRequest_t *ueSetReq = NULLP;
6618 asn_enc_rval_t encRetVal; /* Encoder return value */
6619 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6620 uint8_t ret= RFAILED;
6624 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6626 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6627 if(f1apMsg == NULLP)
6629 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6633 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6634 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6635 if(f1apMsg->choice.initiatingMessage == NULLP)
6637 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6641 f1apMsg->choice.initiatingMessage->procedureCode = \
6642 ProcedureCode_id_UEContextSetup;
6643 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6644 f1apMsg->choice.initiatingMessage->value.present = \
6645 InitiatingMessage__value_PR_UEContextSetupRequest;
6647 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6650 ueSetReq->protocolIEs.list.count = elementCnt;
6651 ueSetReq->protocolIEs.list.size = \
6652 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6654 /* Initialize the UESetup members */
6655 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6657 if(ueSetReq->protocolIEs.list.array == NULLP)
6659 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6663 for(idx1=0; idx1<elementCnt; idx1++)
6665 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6666 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6674 /*GNB CU UE F1AP ID*/
6675 ueSetReq->protocolIEs.list.array[idx]->id = \
6676 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6677 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6678 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6679 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6680 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6682 /*GNB DU UE F1AP ID*/
6684 ueSetReq->protocolIEs.list.array[idx]->id = \
6685 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6686 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6687 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6688 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6689 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6693 ueSetReq->protocolIEs.list.array[idx]->id = \
6694 ProtocolIE_ID_id_SpCell_ID;
6695 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6696 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6697 UEContextSetupRequestIEs__value_PR_NRCGI;
6698 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6704 /*Served Cell Index*/
6706 ueSetReq->protocolIEs.list.array[idx]->id = \
6707 ProtocolIE_ID_id_ServCellIndex;
6708 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6709 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6710 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6711 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6714 /*CellULConfigured*/
6716 ueSetReq->protocolIEs.list.array[idx]->id = \
6717 ProtocolIE_ID_id_SpCellULConfigured;
6718 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6719 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6720 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6721 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6722 CellULConfigured_none;
6724 /*CUtoDURRCContainer*/
6726 ueSetReq->protocolIEs.list.array[idx]->id = \
6727 ProtocolIE_ID_id_CUtoDURRCInformation;
6728 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6729 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6730 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6731 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6736 /*Special Cells to be SetupList*/
6738 ueSetReq->protocolIEs.list.array[idx]->id = \
6739 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6740 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6741 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6742 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6743 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6744 if(SplCellListret != ROK)
6748 /*SRBs To Be Setup List*/
6750 ueSetReq->protocolIEs.list.array[idx]->id = \
6751 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6752 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6753 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6754 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6755 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6756 if(SrbSetupret != ROK)
6760 /*DRBs to Be Setup List*/
6762 ueSetReq->protocolIEs.list.array[idx]->id = \
6763 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6764 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6765 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6766 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6767 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6772 /* RRC Container for security mode */
6774 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6775 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6776 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6777 UEContextSetupRequestIEs__value_PR_RRCContainer;
6778 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6780 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6781 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6782 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6783 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6785 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6788 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6789 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6791 /* RRC delivery status request */
6793 ueSetReq->protocolIEs.list.array[idx]->id = \
6794 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6795 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6796 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6797 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6798 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6799 RRCDeliveryStatusRequest_true;
6801 /* Bit Rate hardcoded as in reference logs */
6803 ueSetReq->protocolIEs.list.array[idx]->id = \
6804 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6805 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6806 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6807 UEContextSetupRequestIEs__value_PR_BitRate;
6808 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6810 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6811 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6812 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6813 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6815 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6818 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6819 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6821 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6823 /* Encode the F1SetupRequest type as APER */
6824 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6826 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6828 /* Encode results */
6829 if(encRetVal.encoded == ENCODE_FAIL)
6831 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6832 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6837 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6838 for(int i=0; i< encBufSize; i++)
6840 DU_LOG("%x",encBuf[i]);
6845 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6847 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6853 FreeUeContextSetupReq(f1apMsg);
6856 }/* End of BuildAndSendUeContextSetupReq*/
6858 /**********************************************************************
6859 * @brief Function to extractTeId received in UE context setup Response
6863 * Function : extractTeId
6866 * - Function to extract TeId
6869 * @return ROK - success
6872 **********************************************************************/
6873 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6877 GTPTunnel_t *gtpDl = NULLP;
6879 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6881 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6883 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6885 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6886 if(gtpDl->gTP_TEID.size > 0)
6888 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6891 DU_LOG("\nERROR --> EGTP: No TeId received");
6899 /****************************************************************
6900 * @brief Function to add Drb tunnels
6904 * Function : addDrbTunnels
6907 * - Function to add Drb tunnels
6910 * @return ROK - success
6913 * ****************************************************************/
6914 uint8_t addDrbTunnels(uint8_t teId)
6919 if(teId > MAX_TEID || teId < MIN_TEID)
6921 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6923 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6924 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6925 tnlEvt.lclTeid = teId;
6926 tnlEvt.remTeid = teId;
6927 ret = cuEgtpTnlMgmtReq(tnlEvt);
6930 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6935 /****************************************************************
6936 * @brief Function to process Drb Setup List
6940 * Function : procDrbSetupList
6943 * - Function to process DRB Setup List
6946 * @return ROK - success
6949 * ****************************************************************/
6950 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
6954 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
6956 if(drbSetupList != NULLP)
6958 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
6960 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
6961 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
6963 /* extracting teId */
6964 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
6967 if(addDrbTunnels(teId)== ROK)
6969 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
6980 /****************************************************************
6981 * @brief Function to process Ue Context Setup Response
6985 * Function : procUeContextSetupResponse
6988 * - Function to process Ue Context Setup Response
6991 * @return ROK - success
6994 * ****************************************************************/
6995 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
6997 uint8_t idx, duUeF1apId;
6998 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
6999 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
7001 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
7003 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
7005 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7007 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7010 case ProtocolIE_ID_id_DRBs_Setup_List:
7012 /* Adding Tunnels for successful DRB */
7013 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
7019 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7023 /****************************************************************
7024 * @brief Function to process Ul Rrc Msg received from DU
7028 * Function : procUlRrcMsg
7031 * - Function to process Ul Rrc Msg received from DU
7034 * @return ROK - success
7037 * ****************************************************************/
7039 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
7041 uint8_t idx, ret, srbId, rrcMsgType;
7042 uint8_t cuUeF1apId, duUeF1apId;
7043 uint8_t *rrcContainer = NULLP;
7044 uint16_t rrcContLen;
7045 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
7048 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
7050 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
7052 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
7054 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7056 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
7059 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7061 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7064 case ProtocolIE_ID_id_SRBID:
7065 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
7067 case ProtocolIE_ID_id_RRCContainer:
7069 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
7070 CU_ALLOC(rrcContainer, rrcContLen)
7073 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
7076 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
7082 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
7088 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7089 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7090 if(rrcMsgType == REGISTRATION_ACCEPT)
7092 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
7093 ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7095 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
7097 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
7098 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
7099 rrcContLen, rrcContainer);
7101 if(rrcMsgType == SECURITY_MODE_COMPLETE)
7103 /* To trigger the DL RRC Msg for RRC Reconfig */
7104 ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
7105 rrcMsgType = setDlRRCMsgType(duUeF1apId);
7106 if(rrcMsgType == RRC_RECONFIG)
7108 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
7109 BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
7112 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
7114 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
7115 BuildAndSendUeContextModificationReq(duUeF1apId);
7121 /****************************************************************
7122 * @brief Build And Send F1ResetAck
7126 * Function : FreeF1ResetAck
7129 * - Build And Send F1ResetRSP
7132 * @return ROK - success
7135 * ****************************************************************/
7136 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7139 ResetAcknowledge_t *f1ResetAck;
7143 if(f1apMsg->choice.successfulOutcome)
7145 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7147 if(f1ResetAck->protocolIEs.list.array)
7149 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7151 if(f1ResetAck->protocolIEs.list.array[idx])
7153 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7156 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7158 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7160 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7164 /****************************************************************
7165 * @brief Build And Send F1ResetAck
7169 * Function : BuildAndSendF1ResetAck
7172 * - Build And Send F1ResetRSP
7175 * @return ROK - success
7178 * ****************************************************************/
7180 uint8_t BuildAndSendF1ResetAck()
7183 uint8_t elementCnt = 0;
7184 uint8_t ret = RFAILED;
7185 F1AP_PDU_t *f1apMsg = NULL;
7186 ResetAcknowledge_t *f1ResetAck = NULLP;
7187 asn_enc_rval_t encRetVal;
7188 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
7191 /* Allocate the memory for F1ResetRequest_t */
7192 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7193 if(f1apMsg == NULLP)
7195 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7199 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7201 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7202 if(f1apMsg->choice.successfulOutcome == NULLP)
7204 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7208 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
7209 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7210 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7211 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7215 f1ResetAck->protocolIEs.list.count = elementCnt;
7216 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7218 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7219 if(f1ResetAck->protocolIEs.list.array == NULLP)
7221 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
7225 for(idx=0; idx<elementCnt; idx++)
7227 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7228 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7235 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7236 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7237 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7238 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7240 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7242 /* Encode the F1SetupRequest type as UPER */
7243 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7245 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7247 /* Check encode results */
7248 if(encRetVal.encoded == ENCODE_FAIL)
7250 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
7251 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7256 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
7257 for(int i=0; i< encBufSize; i++)
7259 DU_LOG("%x",encBuf[i]);
7263 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7265 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7273 FreeF1ResetAck(f1apMsg);
7276 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7280 if(ulInfo->list.array)
7282 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7284 if(ulInfo->list.array[arrIdx])
7286 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7288 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7290 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7292 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7293 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7294 gTPTunnel->gTP_TEID.size);
7296 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7297 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7298 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7300 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7301 sizeof(GTPTunnel_t));
7303 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7306 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7310 /*******************************************************************
7312 * @brief Deletes the EGTP tunnel
7316 * Function : deleteEgtpTunnel
7318 * Functionality: Deletes the EGTP tunnel
7320 * @params[in] uint8_t *buf
7322 * @return ROK - success
7325 * ****************************************************************/
7326 uint8_t deleteEgtpTunnel(uint8_t *buf)
7331 teIdStringToInt(buf, &teId);
7332 if(teId > MAX_TEID || teId < MIN_TEID)
7334 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7337 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7338 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7339 tnlEvt.lclTeid = teId;
7340 tnlEvt.remTeid = teId;
7341 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7343 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7348 /*******************************************************************
7350 * @brief Builds the Uplink Tunnel Info
7354 * Function : BuildUlTnlInfoforSetupMod
7356 * Functionality: Constructs the UL TnlInfo For DRB list
7358 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7360 * @return ROK - success
7363 * ****************************************************************/
7364 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7370 ulInfo->list.count = ulCnt;
7371 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7372 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7373 if(ulInfo->list.array == NULLP)
7375 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7378 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7380 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7381 if(ulInfo->list.array[arrIdx] == NULLP)
7383 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7389 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7390 UPTransportLayerInformation_PR_gTPTunnel;
7393 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7394 sizeof(GTPTunnel_t));
7395 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7397 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7400 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7401 transportLayerAddress.size = 4*sizeof(uint8_t);
7402 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7403 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7404 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7405 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7406 transportLayerAddress.buf == NULLP)
7408 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7412 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7413 transportLayerAddress.buf[0] = 192;
7414 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7415 transportLayerAddress.buf[1] = 168;
7416 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7417 transportLayerAddress.buf[2] = 130;
7418 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7419 transportLayerAddress.buf[3] = 82;
7420 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7421 transportLayerAddress.bits_unused = 0;
7424 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7425 = 4 * sizeof(uint8_t);
7426 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7427 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7428 gTPTunnel->gTP_TEID.size);
7429 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7432 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7435 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7436 gTP_TEID.buf[0] = 0;
7437 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7438 gTP_TEID.buf[1] = 0;
7439 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7440 gTP_TEID.buf[2] = 0;
7441 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7443 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7444 * fetched based on the Drb Id */
7446 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
7447 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
7448 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
7452 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7453 gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
7456 }/*End of BuildULTnlInfo*/
7458 /*******************************************************************
7460 * @brief freeing the DRB item
7464 * Function : FreeDrbItem
7466 * Functionality: freeing the DRB item
7468 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7470 * @return ROK - success
7473 * ****************************************************************/
7475 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7478 SNSSAI_t *snssai =NULLP;
7479 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7481 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7482 switch(drbItem->qoSInformation.present)
7484 case QoSInformation_PR_NOTHING:
7486 case QoSInformation_PR_eUTRANQoS:
7488 if(drbItem->qoSInformation.choice.eUTRANQoS)
7490 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7494 case QoSInformation_PR_choice_extension:
7496 if(drbItem->qoSInformation.choice.choice_extension)
7498 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7500 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7503 CU_FREE(snssai->sST.buf,snssai->sST.size);
7509 CU_FREE(snssai->sD->buf,snssai->sD->size);
7511 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7514 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7515 if(flowMap->list.array)
7517 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7519 if(flowMap->list.array[arrIdx] )
7521 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7522 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7525 CU_FREE(flowMap->list.array,flowMap->list.size);
7528 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7534 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7535 if(drbItem->uLConfiguration)
7537 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7541 /*******************************************************************
7543 * @brief filling the DRB setup Mod item
7547 * Function : FillDrbItemToSetupMod
7549 * Functionality: filling the DRB setup Mod item
7552 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7554 * @return ROK - success
7557 * ****************************************************************/
7559 uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7564 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
7567 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7569 switch(drbItem->qoSInformation.present)
7571 case QoSInformation_PR_NOTHING:
7575 case QoSInformation_PR_eUTRANQoS:
7578 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7579 if(drbItem->qoSInformation.choice.eUTRANQoS)
7581 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7584 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7585 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7586 PriorityLevel_no_priority;
7588 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7589 Pre_emptionCapability_may_trigger_pre_emption;
7591 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7592 Pre_emptionVulnerability_pre_emptable;
7596 case QoSInformation_PR_choice_extension:
7598 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7599 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7601 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7605 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7606 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7607 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7608 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7609 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
7612 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7617 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7618 choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[1]);
7621 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7625 /*Flows mapped to DRB List*/
7626 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7627 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7628 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7631 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7637 /*ULUPTNLInformation To Be Setup List*/
7638 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
7639 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7642 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7647 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7651 /*******************************************************************
7653 * @brief Builds the DRB to be Setup Mod ItemIes
7657 * Function : FillDrbItemList
7659 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7661 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7663 * @return ROK - success
7666 * ****************************************************************/
7668 uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7670 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7671 drbItemIe->criticality = Criticality_reject;
7672 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7674 if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7676 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7681 /*******************************************************************
7683 * @brief free the DRB to be Setup Mod list
7687 * Function : FreeDrbToBeSetupModList
7689 * Functionality: free the DRB to be Setup Mod list
7691 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7693 * @return ROK - success
7696 * ****************************************************************/
7697 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7700 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7702 if(drbSet->list.array)
7704 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7706 if(drbSet->list.array[arrIdx] != NULLP)
7710 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7711 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7713 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7716 CU_FREE(drbSet->list.array, drbSet->list.size);
7721 /*******************************************************************
7723 * @brief Builds the DRB to be Setup Mod list
7727 * Function : BuildDrbToBeSetupList
7729 * Functionality: Constructs the DRB to be Setup Mod list
7731 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7733 * @return ROK - success
7736 * ****************************************************************/
7738 uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
7744 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7745 drbSet->list.count = drbCnt;
7746 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7747 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7748 if(drbSet->list.array == NULLP)
7750 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7754 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7756 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7757 if(drbSet->list.array[arrIdx] == NULLP)
7759 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7763 ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7766 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7773 /*******************************************************************
7775 * @brief Filling the DRB to be modified item
7779 * Function : FillDrbToBeModItem
7781 * Functionality: filling the DRB to be modified item
7783 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7785 * @return ROK - success
7788 * ****************************************************************/
7790 uint8_t FillDrbToBeModItem(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
7795 drbItem->dRBID = DRB2 + arrIdx;
7798 drbItem->qoSInformation = NULLP;
7799 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7800 if(drbItem->qoSInformation != NULLP)
7802 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7804 switch(drbItem->qoSInformation->present)
7806 case QoSInformation_PR_NOTHING:
7810 case QoSInformation_PR_eUTRANQoS:
7813 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7814 if(drbItem->qoSInformation->choice.eUTRANQoS)
7816 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7819 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7820 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7821 PriorityLevel_no_priority;
7823 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7824 Pre_emptionCapability_may_trigger_pre_emption;
7826 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7827 Pre_emptionVulnerability_pre_emptable;
7831 case QoSInformation_PR_choice_extension:
7833 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7834 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7836 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7840 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7841 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7842 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7843 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7844 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
7847 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7852 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7853 choice_extension->value.choice.DRB_Information.sNSSAI,cuCfgParams.snssaiList[0]);
7856 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7860 /*Flows mapped to DRB List*/
7861 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7862 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7863 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7866 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7873 /*ULUPTNLInformation To Be Setup List*/
7874 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
7875 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7878 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7884 /*******************************************************************
7886 * @brief Builds the DRB to be modified Item IE
7890 * Function : FillDrbToBeModItemList
7892 * Functionality: Constructs the DRB to be modified Mod Item Ies
7894 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7896 * @return ROK - success
7899 * ****************************************************************/
7901 uint8_t FillDrbToBeModItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7903 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7904 drbItemIe->criticality = Criticality_reject;
7905 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7906 if(FillDrbToBeModItem(ueId, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7908 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7915 /*******************************************************************
7917 * @brief Builds the DRB to be modified list
7921 * Function : BuildDrbToBeModList
7923 * Functionality: Constructs the DRB to be modified list
7925 * @params[in] DRBs_ToBeModified_List_t *drbSet
7927 * @return ROK - success
7930 * ****************************************************************/
7932 uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
7938 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
7939 drbSet->list.count = drbCnt;
7940 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
7941 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7942 if(drbSet->list.array == NULLP)
7944 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
7947 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7949 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
7950 if(drbSet->list.array[arrIdx] == NULLP)
7952 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7956 ret = FillDrbToBeModItemList(ueId, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
7959 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
7966 /*******************************************************************
7968 * @brief freeing the DRB item
7972 * Function : FreeModifiedDrbItem
7974 * Functionality: freeing the DRB 2 item
7976 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7978 * @return ROK - success
7981 * ****************************************************************/
7983 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
7986 SNSSAI_t *snssai =NULLP;
7987 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7989 if(drbItem->qoSInformation != NULLP)
7991 switch(drbItem->qoSInformation->present)
7993 case QoSInformation_PR_NOTHING:
7995 case QoSInformation_PR_eUTRANQoS:
7997 if(drbItem->qoSInformation->choice.eUTRANQoS)
7999 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
8003 case QoSInformation_PR_choice_extension:
8005 if(drbItem->qoSInformation->choice.choice_extension)
8007 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
8009 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
8012 CU_FREE(snssai->sST.buf,snssai->sST.size);
8018 CU_FREE(snssai->sD->buf,snssai->sD->size);
8020 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
8023 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
8024 if(flowMap->list.array)
8026 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
8028 if(flowMap->list.array[arrIdx] )
8030 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
8031 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
8034 CU_FREE(flowMap->list.array,flowMap->list.size);
8037 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
8043 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
8044 if(drbItem->uLConfiguration)
8046 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
8050 /*******************************************************************
8052 * @brief free the DRB to be modfified list
8056 * Function : FreeDrbToBeModifiedList
8058 * Functionality: free the DRB to be Setup Mod list
8060 * @params[in] FreeDrbToBeModifiedList_t *drbSet
8062 * @return ROK - success
8065 * ****************************************************************/
8066 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
8069 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
8071 if(drbSet->list.array)
8073 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
8075 if(drbSet->list.array[arrIdx] != NULLP)
8077 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
8078 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
8079 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8082 CU_FREE(drbSet->list.array, drbSet->list.size);
8087 /*******************************************************************
8089 * @brief free the UeContextModification Request
8093 * Function : FreeUeContextModicationRequest
8095 * Functionality : deallocation of memory allocated in UeContextModiification
8098 * @params[in] F1AP_PDU_t *f1apMsg
8102 * ****************************************************************/
8103 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
8105 uint8_t arrIdx =0 , ieId=0;
8106 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
8110 if(f1apMsg->choice.initiatingMessage)
8112 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8113 if(UeContextModifyReq->protocolIEs.list.array)
8115 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
8117 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
8119 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
8122 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8124 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8126 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
8128 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8129 choice.DRBs_ToBeSetupMod_List);
8132 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
8134 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8135 choice.DRBs_ToBeSetupMod_List);
8140 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
8143 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
8145 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8147 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8150 /*******************************************************************
8152 * @brief Builds the Ue Context Modification Req
8156 * Function : BuildAndSendUeContextModificationReq
8158 * Functionality: Constructs the Ue Context Modification Req
8162 * @return ROK - success
8165 * ****************************************************************/
8166 uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
8169 uint8_t elementCnt = 0;
8170 uint8_t ret = RFAILED;
8171 F1AP_PDU_t *f1apMsg = NULLP;
8172 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
8174 asn_enc_rval_t encRetVal;
8175 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
8179 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8180 if(f1apMsg == NULLP)
8182 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8186 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8188 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8189 if(f1apMsg->choice.initiatingMessage == NULLP)
8191 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8194 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
8195 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8196 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
8198 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8201 ueContextModifyReq->protocolIEs.list.count = elementCnt;
8202 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
8204 /* Initialize the UE context modification members */
8205 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
8206 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
8208 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8212 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8214 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
8215 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
8217 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8224 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8225 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8226 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8227 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8228 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
8231 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8232 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8233 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
8234 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8235 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
8237 /* DRB to be setup list */
8239 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
8240 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8241 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8242 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
8243 ret = BuildDrbToBeSetupList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8244 value.choice.DRBs_ToBeSetupMod_List));
8246 /* DRB to be modified list */
8248 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
8249 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8250 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8251 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
8252 ret = BuildDrbToBeModifiedList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8253 value.choice.DRBs_ToBeModified_List));
8255 /* TODO: DRB to be release list */
8261 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8263 /* Encode the F1SetupRequest type as APER */
8264 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8266 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8269 /* Encode results */
8270 if(encRetVal.encoded == ENCODE_FAIL)
8272 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8273 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8278 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8279 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8281 DU_LOG("%x",encBuf[ieIdx]);
8285 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8287 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8295 FreeUeContextModicationRequest(f1apMsg);
8298 /*****************************************************************i
8300 * @brief Free memory allocated for UE Context Release Command
8304 * Function : FreeUeContextReleaseCommand
8307 * - Free memory allocated for UE Context Release Command
8309 * @params[in] F1AP_PDU_t *f1apMsg
8312 * *************************************************************/
8313 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8316 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8320 if(f1apMsg->choice.initiatingMessage)
8322 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8323 if(ueReleaseCommand->protocolIEs.list.array)
8325 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8327 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8329 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8331 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8333 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8336 /*******************************************************************
8338 * @brief Builds the Ue Context Release Command
8342 * Function : BuildAndSendUeContextReleaseCommand
8344 * Functionality: Constructs the Ue Context Release Command
8348 * @return ROK - success
8351 * ****************************************************************/
8352 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
8354 bool memAllocFailed = false;
8355 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8356 F1AP_PDU_t *f1apMsg = NULLP;
8357 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8359 asn_enc_rval_t encRetVal;
8360 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8364 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8365 if(f1apMsg == NULLP)
8367 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8371 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8373 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8374 if(f1apMsg->choice.initiatingMessage == NULLP)
8376 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8379 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8380 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8381 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8383 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8386 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8387 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8389 /* Initialize the UE context modification members */
8390 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8391 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8393 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8397 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8399 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8400 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8402 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8403 memAllocFailed = true;
8408 if(memAllocFailed == true)
8413 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8414 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8415 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8416 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8417 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8420 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8421 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8422 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8423 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8424 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8427 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8428 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8429 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8430 UEContextReleaseCommandIEs__value_PR_Cause;
8431 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8432 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8433 CauseRadioNetwork_normal_release;
8435 /* RRC Container for RRC release */
8437 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8438 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8439 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8440 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8441 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8443 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8444 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8445 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8446 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8448 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8451 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8452 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8454 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8456 /* Encode the UE Context Release Command type as APER */
8457 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8459 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8462 /* Encode results */
8463 if(encRetVal.encoded == ENCODE_FAIL)
8465 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8466 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8471 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8472 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8474 DU_LOG("%x",encBuf[ieIdx]);
8478 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
8480 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8488 FreeUeContextReleaseCommand(f1apMsg);
8491 /*******************************************************************
8493 * @brief process Ue context release request
8497 * Function : procUeContextReleaseReq
8500 * - process Ue context release request
8502 * @params[in] F1AP_PDU_t *f1apMsg
8503 * @return ROK - success
8506 * ****************************************************************/
8507 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
8509 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8511 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8512 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8514 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8516 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8518 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8520 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8523 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8525 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8532 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
8534 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8539 /*******************************************************************
8541 * @brief processing of Gnb-DU config update
8545 * Function : procGnbDuUpdate
8548 * - processing of Gnb-DU config update
8550 * @params[in] F1AP_PDU_t *f1apMsg
8551 * @return ROK - success
8554 * ****************************************************************/
8555 uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
8557 bool cellToBeDelete = false;
8558 uint8_t ieIdx = 0, ueIdx = 0;
8559 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8561 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8562 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8564 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8566 case ProtocolIE_ID_id_TransactionID:
8568 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8570 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8572 cellToBeDelete = true;
8575 case ProtocolIE_ID_id_gNB_DU_ID:
8579 if(BuildAndSendDUUpdateAck() != ROK)
8581 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8585 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
8586 * commented this trigger for now */
8588 if(cellToBeDelete == false)
8590 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8591 if(BuildAndSendF1ResetReq() != ROK)
8593 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8598 if(cellToBeDelete == true)
8600 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
8602 CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
8603 memset(&ueCb[ueIdx], 0, sizeof(UeCb));
8610 /*******************************************************************
8612 * @brief storing slice list in CU database
8616 * Function : buildSliceList
8619 * - storing slice list in CU database
8621 * @params[in] SliceSupportList_t *sliceSupportList
8622 * @return ROK - success
8625 * ****************************************************************/
8626 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8628 uint8_t sliceListIdx = 0;
8630 if(sliceSupportList)
8632 if(sliceSupportList->list.array)
8634 cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
8635 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8637 if(sliceSupportList->list.array[sliceListIdx])
8639 CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai));
8640 if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
8642 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8645 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8647 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8648 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8650 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8652 memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
8653 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8654 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8663 /****************************************************************
8664 * @brief Function to process Drb Setup Mod List
8668 * Function : procDrbSetupModList
8671 * - Function to process DRB Setup Mod List
8674 * @return ROK - success
8677 * ****************************************************************/
8678 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8682 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8684 if(drbSetupList != NULLP)
8686 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8688 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8689 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8691 /* extracting teId */
8692 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8695 if(addDrbTunnels(teId)== ROK)
8697 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8708 /*******************************************************************
8710 * @brief processing of GNB_DU_Served_Cells Plmn list information
8714 * Function : procServedCellPlmnList
8717 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8720 * @params[in] F1AP_PDU_t *f1apMsg
8721 * @return ROK - success
8724 * ****************************************************************/
8725 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8727 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8728 ProtocolExtensionContainer_4624P3_t **ieExtend;
8730 if(srvPlmn->list.array)
8732 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8734 if(srvPlmn->list.array[srvPlmnIdx])
8736 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8739 if((*ieExtend)->list.array)
8741 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8743 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8745 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8747 case ProtocolIE_ID_id_TAISliceSupportList:
8749 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8750 extensionValue.choice.SliceSupportList) != ROK)
8752 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8767 /****************************************************************
8768 * @brief Function to process Ue Context Modification Response
8772 * Function : procUeContextModificationResponse
8775 * - Function to process Ue Context Modification Response
8778 * @return ROK - success
8781 * ****************************************************************/
8782 uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
8784 uint8_t idx, duUeF1apId;
8785 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8786 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8788 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8790 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8792 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8794 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8797 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8799 /* Adding Tunnels for successful DRB */
8800 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8809 /*******************************************************************
8811 * @brief processing of F1 setup request
8815 * Function : procF1SetupReq
8818 * - processing of F1 setup request
8820 * @params[in] F1AP_PDU_t *f1apMsg
8821 * @return ROK - success
8824 * ****************************************************************/
8825 void procF1SetupReq(F1AP_PDU_t *f1apMsg)
8827 uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
8828 BIT_STRING_t nrcellIdentity;
8829 F1SetupRequest_t *f1SetupReq = NULLP;
8830 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8831 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8833 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8834 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8836 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8838 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8840 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8841 if(duServedCell->list.array)
8843 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8845 if(duServedCell->list.array[plmnidx])
8847 switch(duServedCell->list.array[plmnidx]->id)
8849 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8851 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8852 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8853 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
8864 BuildAndSendF1SetupRsp(&nrcellIdentity);
8868 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
8872 /*******************************************************************
8874 * @brief Handles received F1AP message and sends back response
8878 * Function : F1APMsgHdlr
8881 * - Decodes received F1AP control message
8882 * - Prepares response message, encodes and sends to SCTP
8885 * @return ROK - success
8888 * ****************************************************************/
8889 void F1APMsgHdlr(Buffer *mBuf)
8895 F1AP_PDU_t *f1apMsg = NULLP;
8896 asn_dec_rval_t rval; /* Decoder return value */
8897 F1AP_PDU_t f1apasnmsg ;
8899 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
8900 ODU_PRINT_MSG(mBuf, 0,0);
8902 /* Copy mBuf into char array to decode it */
8903 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8904 CU_ALLOC(recvBuf, (Size)recvBufLen);
8906 if(recvBuf == NULLP)
8908 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
8911 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8913 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
8917 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
8918 for(i=0; i< recvBufLen; i++)
8920 DU_LOG("%x",recvBuf[i]);
8923 /* Decoding flat buffer into F1AP messsage */
8924 f1apMsg = &f1apasnmsg;
8925 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8927 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8928 CU_FREE(recvBuf, (Size)recvBufLen);
8930 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8932 DU_LOG("\nERROR --> F1AP : ASN decode failed");
8936 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8938 switch(f1apMsg->present)
8940 case F1AP_PDU_PR_initiatingMessage:
8942 switch(f1apMsg->choice.initiatingMessage->value.present)
8944 case InitiatingMessage__value_PR_Reset:
8946 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
8947 BuildAndSendF1ResetAck();
8951 case InitiatingMessage__value_PR_F1SetupRequest:
8953 DU_LOG("\nINFO --> F1AP : F1 setup request received");
8954 procF1SetupReq(f1apMsg);
8958 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
8960 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
8961 procGnbDuUpdate(f1apMsg);
8964 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
8966 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
8967 procInitULRRCMsg(f1apMsg);
8970 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
8972 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
8973 procUlRrcMsg(f1apMsg);
8977 case InitiatingMessage__value_PR_RRCDeliveryReport:
8979 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
8982 case InitiatingMessage__value_PR_UEContextReleaseRequest:
8984 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
8985 procUeContextReleaseReq(f1apMsg);
8990 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
8991 f1apMsg->choice.initiatingMessage->value.present);
8994 }/* End of switch(initiatingMessage) */
8998 case F1AP_PDU_PR_successfulOutcome:
9000 switch(f1apMsg->choice.successfulOutcome->value.present)
9002 case SuccessfulOutcome__value_PR_ResetAcknowledge:
9004 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
9007 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
9009 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
9010 procUeContextSetupResponse(f1apMsg);
9013 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
9015 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
9016 procUeContextModificationResponse(f1apMsg);
9019 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
9021 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
9026 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
9027 f1apMsg->choice.successfulOutcome->value.present);
9030 }/* End of switch(successfulOutcome) */
9035 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
9038 }/* End of switch(f1apMsg->present) */
9040 } /* End of F1APMsgHdlr */
9042 /**********************************************************************
9044 **********************************************************************/