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, uint32_t duId)
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(duId, 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 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, 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(cuCb.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*)cuCb.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(cuCb.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] = cuCb.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, duId) != 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 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
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 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
807 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
809 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
815 }/* End of BuildAndSendDUUpdateAck*/
817 /*******************************************************************
819 * @brief deallocating the memory of F1reset msg
823 * Function : FreeF1ResetReq
826 * - freeing memory of F1reset request msg
832 * ****************************************************************/
833 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
836 Reset_t *f1ResetMsg = NULLP;
840 if(f1apMsg->choice.initiatingMessage)
842 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
843 if(f1ResetMsg->protocolIEs.list.array)
845 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
847 if(f1ResetMsg->protocolIEs.list.array[idx])
849 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
852 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
854 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
856 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
859 /*******************************************************************
861 * @brief build ansld ans send f1reset msg
865 * Function : BuildAndSendF1ResetReq
867 * Functionality: build and send f1reset msg
869 * @return ROK - success
872 * ****************************************************************/
873 uint8_t BuildAndSendF1ResetReq()
875 uint8_t elementCnt=0;
877 uint8_t ret= RFAILED;
878 Reset_t *f1ResetMsg = NULLP;
879 F1AP_PDU_t *f1apMsg = NULLP;
880 asn_enc_rval_t encRetVal;
881 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
884 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
887 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
890 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
891 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
892 if(f1apMsg->choice.initiatingMessage == NULLP)
894 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
897 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
898 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
899 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
901 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
904 f1ResetMsg->protocolIEs.list.count = elementCnt;
905 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
907 /* Initialize the F1Reset members */
908 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
909 if(f1ResetMsg->protocolIEs.list.array == NULLP)
911 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
914 for(idx=0; idx<elementCnt; idx++)
916 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
917 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
919 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
926 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
927 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
928 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
929 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
933 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
934 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
935 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
936 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
937 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
941 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
942 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
943 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
944 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
945 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
947 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
949 /* Encode the F1SetupRequest type as APER */
950 memset(encBuf, 0, ENC_BUF_MAX_LEN);
952 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
956 if(encRetVal.encoded == ENCODE_FAIL)
958 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
959 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
964 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
965 for(idx=0; idx< encBufSize; idx++)
967 DU_LOG("%x",encBuf[idx]);
971 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
972 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
974 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
982 FreeF1ResetReq(f1apMsg);
986 /*******************************************************************
988 * @brief Fills Radio Bearer Config
992 * Function : fillSrbCfg
994 * Functionality: Fills Radio Bearer Config
996 * @params[in] SRB_ToAddModList *
998 * @return ROK - success
1001 * ****************************************************************/
1002 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
1006 if(bearerCfg != NULLP)
1009 bearerCfg->list.count = elementCnt;
1010 bearerCfg->list.size =\
1011 elementCnt * sizeof(SRB_ToAddMod_t *);
1012 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
1013 if(bearerCfg->list.array != NULLP)
1015 for(idx = 0; idx < elementCnt; idx++)
1017 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
1018 if(bearerCfg->list.array[idx] == NULLP)
1020 for(ieId = 0; ieId < idx; ieId++)
1022 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
1024 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1034 bearerCfg->list.array[idx]->srb_Identity = srbId;
1039 /*******************************************************************
1041 * @brief Fills Master CellGroup Info
1045 * Function : fillMasterCellGroup
1047 * Functionality: Fills Master Cell Group IE
1049 * @params[in] RRCSetup_IEs_t *
1051 * @return ROK - success
1054 * ****************************************************************/
1056 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
1059 masterCellGroup->buf = NULLP;
1060 if(ueCb->f1apMsgDb.duToCuContainer.buf)
1062 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
1063 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1064 if(masterCellGroup->buf != NULLP)
1066 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1070 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1081 /*******************************************************************
1083 * @brief Fills RRC setup IE
1087 * Function : fillRRCSetupIE
1089 * Functionality: Fills RRC Setup IE
1091 * @params[in] RRCSetup_IEs_t *
1093 * @return ROK - success
1096 * ****************************************************************/
1098 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1103 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1104 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1106 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1110 ret = fillMasterCellGroup(ueCb, &rrcSetupIE->masterCellGroup);
1114 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1120 /*******************************************************************
1122 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1126 * Function : fillDlCcchRrcMsg
1128 * Functionality: Fills DL DCCCH Message required for
1129 * DLRRCMessageTransfer
1131 * @params[in] RRCContainer_t *rrcContainer
1133 * @return ROK - success
1136 * ****************************************************************/
1138 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1142 DL_CCCH_Message_t dl_CCCH_Msg;
1143 asn_enc_rval_t encRetVal;
1145 if(rrcContainer != NULLP)
1147 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1149 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1150 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1152 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1153 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1154 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1156 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1157 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1158 RRCSetup__criticalExtensions_PR_rrcSetup;
1160 /* Fill RRC Setup IE */
1161 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1162 sizeof(RRCSetup_IEs_t));
1163 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1165 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1169 /* encode DL-CCCH message into RRC Container */
1170 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1171 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1173 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1174 /* Encode results */
1175 if(encRetVal.encoded == ENCODE_FAIL)
1177 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1178 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1183 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1184 for(int i = 0; i< encBufSize; i++)
1186 DU_LOG("%x",encBuf[i]);
1188 rrcContainer->size = encBufSize;
1189 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1190 if(rrcContainer->buf != NULLP)
1192 memset(rrcContainer->buf, 0, encBufSize);
1193 for(idx2 = 0; idx2 < encBufSize; idx2++)
1195 rrcContainer->buf[idx2] = encBuf[idx2];
1207 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1213 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1219 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1225 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1230 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1232 uint8_t idx, ied, elementCnt;
1235 qosFlow->list.count = elementCnt;
1236 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1237 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1238 if(qosFlow->list.array != NULLP)
1240 for(idx = 0; idx < elementCnt; idx++)
1242 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1243 if(qosFlow->list.array[idx] == NULLP)
1245 for(ied = 0; ied < idx; ied++)
1247 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1249 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1255 *qosFlow->list.array[idx] = 9;
1259 /*******************************************************************
1261 * @brief Fills CN Assoc for Drb to Add/Mod List
1265 * Function : fillCnAssoc
1267 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1269 * @params[in] struct DRB_ToAddMod__cnAssociation *
1271 * @return ROK - success
1274 * ****************************************************************/
1276 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1280 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1281 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1283 cnAssoc->choice.eps_BearerIdentity = 5;
1285 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1287 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1288 if(cnAssoc->choice.sdap_Config)
1290 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1291 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1292 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1293 cnAssoc->choice.sdap_Config->defaultDRB = true;
1294 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1295 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1296 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1297 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1298 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1300 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1304 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1305 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1311 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1318 /*******************************************************************
1320 * @brief Fills Radio Bearer Config for Drb
1324 * Function : fillDrbCfg
1326 * Functionality: Fills Radio Bearer Config for Drb
1328 * @params[in] drbId, DRB_ToAddModList *
1330 * @return ROK - success
1333 * ****************************************************************/
1334 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1336 uint8_t idx, ied, ret, elementCnt;
1342 drbCfg->list.count = elementCnt;
1343 drbCfg->list.size =\
1344 elementCnt * sizeof(DRB_ToAddMod_t *);
1345 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1346 if(drbCfg->list.array != NULLP)
1348 for(idx = 0; idx < elementCnt; idx++)
1350 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1351 if(drbCfg->list.array[idx] == NULLP)
1353 for(ied = 0; ied < idx; ied++)
1355 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1357 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1367 /* CN ASSOCIATION */
1368 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1369 if(drbCfg->list.array[idx]->cnAssociation)
1371 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1374 drbCfg->list.array[idx]->drb_Identity = drbId;
1379 /*******************************************************************
1381 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1385 * Function : fillRrcReconfigIE
1387 * Functionality: Fills RRC Reconfig Message required for
1388 * DLRRCMessageTransfer
1390 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1392 * @return ROK - success
1395 * ****************************************************************/
1397 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1400 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1401 if(rrcReconfigMsg->radioBearerConfig)
1403 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1404 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1406 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1411 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1412 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1414 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1417 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1418 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1419 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1425 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1426 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1432 /*******************************************************************
1434 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1438 * Function : fillDlDcchRrcMsg
1440 * Functionality: Fills DL DCCH Message required for
1441 * DLRRCMessageTransfer
1443 * @params[in] RRCContainer_t *rrcContainer
1445 * @return ROK - success
1448 * ****************************************************************/
1450 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1454 DL_DCCH_Message_t dl_DCCH_Msg;
1455 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1456 asn_enc_rval_t encRetVal;
1458 if(rrcContainer != NULLP)
1460 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1462 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1463 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1465 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1466 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1467 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1469 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1470 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1471 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1472 /* Fill RRC Reconfig IE */
1473 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1474 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1475 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1476 criticalExtensions.choice.rrcReconfiguration != NULLP)
1478 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1479 criticalExtensions.choice.rrcReconfiguration);
1483 /* encode DL-DCCH message into RRC Container */
1484 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1485 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1487 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1488 /* Encode results */
1489 if(encRetVal.encoded == ENCODE_FAIL)
1491 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1492 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1497 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1498 for(int i = 0; i< encBufSize; i++)
1500 DU_LOG("%x",encBuf[i]);
1502 rrcContainer->size = encBufSize;
1503 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1504 if(rrcContainer->buf != NULLP)
1506 memset(rrcContainer->buf, 0, encBufSize);
1507 for(idx2 = 0; idx2 < encBufSize; idx2++)
1509 rrcContainer->buf[idx2] = encBuf[idx2];
1516 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1521 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1527 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1533 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1539 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1545 /*******************************************************************
1547 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1551 * Function : BuildDLRRCContainer
1553 * Functionality: Builds RRC Container IE required for
1554 * DLRRCMessageTransfer
1558 * @return ROK - success
1561 * ****************************************************************/
1563 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1565 uint8_t ret, bufLen;
1568 if(rrcMsgType == RRC_SETUP)
1570 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1572 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1574 else if(rrcMsgType == REGISTRATION_ACCEPT)
1576 /*Hardcoded RRC Container from reference logs*/
1577 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1579 rrcContainer->size = bufLen;
1580 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1581 if(rrcContainer->buf != NULLP)
1583 memset(rrcContainer->buf, 0, bufLen);
1584 memcpy(rrcContainer->buf, buf, bufLen);
1588 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1592 else if(rrcMsgType == RRC_RECONFIG)
1594 /*Hardcoded RRC Container from reference logs*/
1596 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1597 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1598 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1599 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1600 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1601 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1602 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1603 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1604 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1605 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1606 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1607 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1608 0x00, 0x00, 0x00, 0x00};
1610 rrcContainer->size = bufLen;
1611 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1612 if(rrcContainer->buf != NULLP)
1614 memset(rrcContainer->buf, 0, bufLen);
1615 memcpy(rrcContainer->buf, buf, bufLen);
1619 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1627 /*******************************************************************
1629 * @brief Frees the DLRRCMessageTransfer
1633 * Function : freeDlRrcMessageTransfer
1635 * Functionality: Frees the DLRRCMessageTransfer
1639 * @return ROK - success
1642 * ****************************************************************/
1643 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1646 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1650 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1651 if(dlRRCMsg->protocolIEs.list.array)
1654 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1655 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1656 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1658 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1660 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1662 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1666 /*******************************************************************
1668 * @brief Builds and sends the DLRRCMessageTransfer
1672 * Function : BuildAndSendDLRRCMessageTransfer
1674 * Functionality: Constructs the DL RRC Message Transfer and sends
1675 * it to the CU through SCTP.
1679 * @return ROK - success
1682 * ****************************************************************/
1683 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1685 uint8_t elementCnt = 0;
1688 F1AP_PDU_t *f1apMsg = NULLP;
1689 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1690 asn_enc_rval_t encRetVal; /* Encoder return value */
1692 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1694 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1695 if(f1apMsg == NULLP)
1697 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1701 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1702 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1703 if(f1apMsg->choice.initiatingMessage == NULLP)
1705 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1706 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1710 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1711 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1712 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1713 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1716 dlRRCMsg->protocolIEs.list.count = elementCnt;
1717 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1719 /* Initialize the F1Setup members */
1720 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1721 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1723 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1724 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1725 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1729 for(idx=0; idx<elementCnt; idx++)
1731 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1732 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1734 for(ieId=0; ieId<idx; ieId++)
1736 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1738 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1739 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1740 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1745 /* GNB CU UE F1AP ID */
1747 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1748 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1749 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1750 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1752 /* GNB DU UE F1AP ID */
1754 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1755 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1756 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1757 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1761 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1762 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1763 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1764 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1768 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1769 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1770 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1771 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1773 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1775 /* Encode the F1SetupRequest type as APER */
1776 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1778 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1780 /* Encode results */
1781 if(encRetVal.encoded == ENCODE_FAIL)
1783 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1784 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1789 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1790 for(int i=0; i< encBufSize; i++)
1792 DU_LOG("%x",encBuf[i]);
1797 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1799 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1802 freeDlRrcMessageTransfer(f1apMsg);
1804 }/* End of BuildAndSendDLRRCMessageTransfer */
1806 /*******************************************************************
1808 * @brief Function to set the Dl RRC Msg Type
1812 * Function : setDlRRCMsgType
1814 * Functionality: Constructs the UE Setup Response and sends
1815 * it to the DU through SCTP.
1819 * @return ROK - success
1822 * ****************************************************************/
1824 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1826 uint8_t rrcMsgType = 0;
1827 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1830 rrcMsgType = RRC_SETUP;
1832 case REGISTRATION_ACCEPT:
1833 rrcMsgType = REGISTRATION_ACCEPT;
1835 case UE_CONTEXT_SETUP_REQ:
1836 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1838 case SECURITY_MODE_COMPLETE:
1839 rrcMsgType = SECURITY_MODE_COMPLETE;
1842 rrcMsgType = RRC_RECONFIG;
1844 case UE_CONTEXT_MOD_REQ:
1845 rrcMsgType = UE_CONTEXT_MOD_REQ;
1853 /*******************************************************************
1855 * @brief Function to build Initial UL RRC Message
1859 * Function : procInitULRRCMsg
1861 * Functionality: Function to build Initial UL RRC Message
1865 * @return ROK - success
1868 * ****************************************************************/
1870 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
1872 uint8_t idx, rrcMsgType, gnbDuUeF1apId;
1874 uint32_t nrCellId, crnti;
1878 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1880 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1882 duDb = getDuDb(duId);
1883 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1885 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1887 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1889 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1890 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1893 case ProtocolIE_ID_id_NRCGI:
1894 nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >>
1895 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused;
1896 cellCb = getCellCb(duDb, nrCellId);
1901 case ProtocolIE_ID_id_C_RNTI:
1902 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
1903 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
1905 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
1906 memset(ueCb, 0, sizeof(CuUeCb));
1907 ueCb->cellCb = cellCb;
1908 ueCb->crnti = crnti;
1909 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
1910 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
1913 cellCb->ueCb[cellCb->numUe] = ueCb;
1918 case ProtocolIE_ID_id_RRCContainer:
1921 case ProtocolIE_ID_id_DUtoCURRCContainer:
1923 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
1924 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1926 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1927 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
1928 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
1929 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
1931 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
1932 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
1933 ueCb->f1apMsgDb.duToCuContainer.size);
1938 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1945 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1952 ueCb->f1apMsgDb.dlRrcMsgCount++;
1953 rrcMsgType = setDlRRCMsgType(ueCb);
1954 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
1959 /*******************************************************************
1961 * @brief Builds Nrcgi
1965 * Function : BuildNrcgi
1967 * Functionality: Building the PLMN ID and NR Cell id
1969 * @params[in] NRCGI_t *nrcgi
1970 * @return ROK - success
1973 * ****************************************************************/
1974 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
1977 uint8_t unused_bits = 4;
1978 uint8_t byteSize = 5;
1979 uint8_t val = nrCellId << unused_bits;
1981 /* Allocate Buffer Memory */
1982 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1983 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1984 if(nrcgi->pLMN_Identity.buf == NULLP)
1988 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1994 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1995 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1996 if(nrcgi->nRCellIdentity.buf == NULLP)
2000 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
2004 /*******************************************************************
2006 * @brief Builds Special cell list for UE Setup Request
2010 * Function : BuildSplCellList
2012 * Functionality: Constructs the Special Cell list for UESetReq
2014 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2016 * @return ROK - success
2019 * ****************************************************************/
2020 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2026 spCellLst->list.count = cellCnt;
2027 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2028 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2029 if(spCellLst->list.array == NULLP)
2033 for(idx=0; idx<cellCnt; idx++)
2035 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2036 if(spCellLst->list.array[idx] == NULLP)
2042 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2043 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2044 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2046 /* Special Cell ID -NRCGI */
2047 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2052 /*Special Cell Index*/
2053 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2055 }/* End of BuildSplCellList*/
2057 /*******************************************************************
2059 * @brief Builds SRBS to be setup
2063 * Function : BuildSRBSetup
2065 * Functionality: Constructs the SRB's for UESetReq
2067 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2069 * @return ROK - success
2072 * ****************************************************************/
2073 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2079 srbSet->list.count = srbCnt;
2080 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2081 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2082 if(srbSet->list.array == NULLP)
2087 for(idx=0; idx<srbCnt; idx++)
2089 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2090 if(srbSet->list.array[idx] == NULLP)
2097 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2098 srbSet->list.array[idx]->criticality = Criticality_ignore;
2099 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2100 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2102 }/* End of BuildSRBSetup*/
2104 /*******************************************************************
2106 * @brief Builds QOS Info for DRB Setum Item
2110 * Function : BuildQOSInfo
2112 * Functionality: Constructs the QOS Info for DRB Setup Item
2114 * @params[in] QoSInformation_t *qosinfo
2115 * int16_t pduSessionID
2117 * @return ROK - success
2120 * ****************************************************************/
2121 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
2122 int16_t pduSessionID)
2124 uint8_t elementCnt = 0, qosCntIdx = 0;
2125 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2127 /* NonDynamic5QIDescriptor */
2128 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2129 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2130 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2135 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2136 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2138 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2141 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2142 sizeof(AveragingWindow_t));
2143 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2148 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2149 /*MaxDataBurstVolume*/
2150 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2151 sizeof(MaxDataBurstVolume_t));
2152 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2157 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2159 /*nRGRAN Allocation Retention Priority*/
2160 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2161 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2162 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2164 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2165 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2167 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2171 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2172 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2176 elementCnt = NUM_QOS_EXT;
2177 qosIeExt->list.count = elementCnt;
2178 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2180 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2181 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2183 if(qosIeExt->list.array == NULLP)
2185 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2189 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2191 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2192 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2194 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2197 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2198 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2199 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2200 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2201 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2202 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2203 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2208 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2213 }/*End of BuildQOSInfo*/
2215 /*******************************************************************
2217 * @brief Builds SNSSAI
2221 * Function : BuildSNSSAI
2223 * Functionality: Constructs the SNSSAI For DRB list
2225 * @params[in] SNSSAI_t *snssai
2226 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2228 * @return ROK - success
2231 * ****************************************************************/
2232 uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
2236 snssai->sST.size = sizeof(uint8_t);
2237 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2238 if(snssai->sST.buf == NULLP)
2242 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2244 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2245 if(snssai->sD == NULLP)
2249 snssai->sD->size = 3*sizeof(uint8_t);
2250 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2251 if(snssai->sD->buf == NULLP)
2255 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2257 }/*End of BuildSNSSAI*/
2259 /*******************************************************************
2261 * @brief Builds the flow map.
2265 * Function : BuildFlowsMap
2267 * Functionality: Constructs the flowmap For DRB list
2269 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2271 * @return ROK - success
2274 * ****************************************************************/
2275 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2277 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2280 flowMap->list.count = flowCnt;
2281 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2282 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2283 if(flowMap->list.array == NULLP)
2285 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2288 for(idx=0; idx<flowCnt; idx++)
2290 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2291 if(flowMap->list.array[idx] == NULLP)
2293 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2298 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2299 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2300 actionType, INVALID_PDU_SESSION_ID);
2303 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2307 }/*End of BuildFlowsMap*/
2309 /*******************************************************************
2311 * @brief Builds the Uplink Tunnel Info
2315 * Function : BuildULTnlInfo
2317 * Functionality: Constructs the UL TnlInfo For DRB list
2319 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2321 * @return ROK - success
2324 * ****************************************************************/
2325 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2330 ulInfo->list.count = ulCnt;
2331 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2332 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2333 if(ulInfo->list.array == NULLP)
2335 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2338 for(idx=0; idx<ulCnt; idx++)
2340 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2341 if(ulInfo->list.array[idx] == NULLP)
2343 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2348 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2349 UPTransportLayerInformation_PR_gTPTunnel;
2351 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2352 sizeof(GTPTunnel_t));
2353 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2355 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2358 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2359 transportLayerAddress.size = 4*sizeof(uint8_t);
2360 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2361 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2362 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2363 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2364 transportLayerAddress.buf == NULLP)
2366 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2369 /* NOTE: Below IP address must be changed if running on different IP configuration */
2370 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2371 transportLayerAddress.buf[0] = 192;
2372 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2373 transportLayerAddress.buf[1] = 168;
2374 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2375 transportLayerAddress.buf[2] = 130;
2376 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2377 transportLayerAddress.buf[3] = 82;
2378 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2379 transportLayerAddress.bits_unused = 0;
2381 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2382 = 4 * sizeof(uint8_t);
2383 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2384 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2385 gTPTunnel->gTP_TEID.size);
2386 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2389 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2392 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2393 gTP_TEID.buf[0] = 0;
2394 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2395 gTP_TEID.buf[1] = 0;
2396 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2397 gTP_TEID.buf[2] = 0;
2398 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2399 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2402 }/*End of BuildULTnlInfo*/
2404 /*******************************************************************
2406 * @brief Builds DRBS to be setup
2410 * Function : BuildDRBSetup
2412 * Functionality: Constructs the DRB's for UESetReq
2414 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2416 * @return ROK - success
2419 * ****************************************************************/
2420 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2422 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2423 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2424 DRBs_ToBeSetup_Item_t *drbSetItem;
2426 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2427 drbSet->list.count = drbCnt;
2428 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2429 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2430 if(drbSet->list.array == NULLP)
2432 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2435 for(idx=0; idx<drbCnt; idx++)
2437 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2438 if(drbSet->list.array[idx] == NULLP)
2440 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2444 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2445 drbSet->list.array[idx]->criticality = Criticality_ignore;
2446 drbSet->list.array[idx]->value.present = \
2447 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2448 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2450 drbSetItem->dRBID = idx + 1;
2452 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2453 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2454 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2456 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2459 drbSetItem->qoSInformation.choice.choice_extension->id = \
2460 ProtocolIE_ID_id_DRB_Information;
2461 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2463 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2464 QoSInformation_ExtIEs__value_PR_DRB_Information;
2465 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2466 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2467 ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
2468 if(BuildQOSInforet != ROK)
2470 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2474 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2475 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0]);
2476 if(BuildSNSSAIret != ROK)
2478 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2481 /*Flows mapped to DRB List*/
2482 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2483 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2484 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2485 if(BuildFlowsMapret != ROK)
2487 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2490 /*ULUPTNLInformation To Be Setup List*/
2491 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2492 if(BuildULTnlInforet != ROK)
2494 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2498 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2501 }/* End of BuildDRBSetup*/
2503 /*******************************************************************
2505 * @brief Deallocating memory of function BuildAndSendUESetReq
2509 * Function : FreeNrcgi
2511 * Functionality: Deallocating memory for function BuildNrcgi
2513 * @params[in] NRCGI_t *nrcgi
2517 *******************************************************************/
2518 void FreeNrcgi(NRCGI_t *nrcgi)
2520 if(nrcgi->pLMN_Identity.buf != NULLP)
2522 if(nrcgi->nRCellIdentity.buf != NULLP)
2524 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2526 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2529 /*******************************************************************
2531 * @brief Deallocating memory of function BuildAndSendUESetReq
2535 * Function : FreeSplCellList
2537 * Functionality: Deallocating memory for function BuildSplCellList
2539 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2544 * *****************************************************************/
2545 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2548 if(spCellLst->list.array != NULLP)
2550 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2552 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2554 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2556 if(spCellLst->list.array[cellidx]!=NULLP)
2558 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2561 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2564 /*******************************************************************
2566 * @brief Deallocating memory of function BuildAndSendUESetReq
2570 * Function : FreeSRBSetup
2572 * Functionality: Deallocating memory for function BuildSRBSetup
2574 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2579 * ******************************************************************/
2580 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2583 if(srbSet->list.array != NULLP)
2585 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2587 if(srbSet->list.array[srbidx]!=NULLP)
2589 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2592 CU_FREE(srbSet->list.array,srbSet->list.size);
2595 /*******************************************************************
2597 * @brief Deallocating memory of function BuildAndSendUESetReq
2601 * Function : FreeQOSInfo
2603 * Functionality: Deallocating memory for function BuildQOSInfo
2605 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2609 * ****************************************************************/
2610 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2612 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2613 uint8_t qosCntIdx = 0;
2615 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2617 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2619 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2621 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2622 sizeof(MaxDataBurstVolume_t));
2624 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2625 sizeof(AveragingWindow_t));
2627 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2628 sizeof(NonDynamic5QIDescriptor_t));
2630 if(drbQos->iE_Extensions)
2632 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2633 if(qosIeExt->list.array != NULLP)
2635 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2637 if(qosIeExt->list.array[qosCntIdx])
2639 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2642 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2645 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2648 /*******************************************************************
2650 * @brief Deallocating memory of function BuildAndSendUESetReq
2654 * Function : FreeULTnlInfo
2656 * Functionality: Deallocating memory for function BuildULTnlInfo
2658 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2663 * ****************************************************************/
2664 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2667 if(ulInfo->list.array != NULLP)
2669 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2671 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2673 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2675 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2676 transportLayerAddress.buf != NULLP)
2678 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2681 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2682 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2683 gTPTunnel->gTP_TEID.size);
2685 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2686 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2687 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2689 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2690 sizeof(GTPTunnel_t));
2693 if(ulInfo->list.array[ulidx]!=NULLP)
2695 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2698 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2701 /*******************************************************************
2703 * @brief Deallocating memory for BuildAndSendUESetReq
2707 * Function : FreeDRBSetup
2709 * Functionality: Deallocating memory for BuildDRBSetup
2711 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2715 * ****************************************************************/
2716 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2718 DRBs_ToBeSetup_Item_t *drbSetItem;
2719 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2721 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
2723 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
2724 if(drbSet->list.array != NULLP)
2726 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2728 if(drbSet->list.array[drbidx] != NULLP)
2730 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2731 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2733 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2734 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2736 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2737 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2739 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2740 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2742 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2744 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2746 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2748 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2749 flows_Mapped_To_DRB_List.list.array != NULLP)
2751 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2752 flows_Mapped_To_DRB_List.list.count; flowidx++)
2754 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2755 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2757 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2758 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2759 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2761 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2762 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2763 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2765 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2766 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2767 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2769 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2770 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2772 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2773 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2774 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2775 sizeof(MaxDataBurstVolume_t));
2777 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2778 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2779 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2781 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2782 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2783 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2786 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2787 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2789 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2790 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2793 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2794 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2795 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2797 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2798 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2800 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2801 sizeof(OCTET_STRING_t));
2803 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2804 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2806 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2807 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2809 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2810 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2812 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2813 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2815 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2816 iE_Extensions != NULLP)
2818 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
2819 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
2820 if(qosIeExt->list.array != NULLP)
2822 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2824 if(qosIeExt->list.array[qosCntIdx] != NULLP)
2826 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2829 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2831 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2832 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2835 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2837 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2840 CU_FREE(drbSet->list.array,drbSet->list.size);
2845 /*******************************************************************
2847 * @brief Free the UE Setup Request
2851 * Function : FreeUeContextSetupReq
2853 * Functionality: Deallocate the memory of BuildUESetReq
2855 * @params[in] F1AP_PDU_t *f1apMsg
2860 * ****************************************************************/
2861 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2864 UEContextSetupRequest_t *ueSetReq = NULLP;
2866 if(f1apMsg != NULLP)
2868 if(f1apMsg->choice.initiatingMessage != NULLP)
2870 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2871 if(ueSetReq->protocolIEs.list.array != NULLP)
2873 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2875 if(ueSetReq->protocolIEs.list.array[idx])
2877 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2879 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2881 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2883 case ProtocolIE_ID_id_SpCell_ID:
2884 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2886 case ProtocolIE_ID_id_ServCellIndex:
2888 case ProtocolIE_ID_id_SpCellULConfigured:
2890 case ProtocolIE_ID_id_CUtoDURRCInformation:
2891 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2893 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2894 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2896 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2897 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2899 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2900 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2902 case ProtocolIE_ID_id_RRCContainer:
2903 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2905 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2906 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2910 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2914 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
2916 for(ieId=0; ieId<idx; ieId++)
2918 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2920 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2923 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2925 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2927 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2931 /**Filling cell group info **/
2932 /*******************************************************************
2934 * @brief Build Control resource set to add/modify list
2938 * Function : BuildControlRSetToAddModList
2940 * Functionality: Build Control resource set to add/modify list
2943 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2945 * @return ROK - success
2948 * ****************************************************************/
2949 uint8_t BuildControlRSetToAddModList
2951 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2956 uint8_t numBytes, bitsUnused;
2957 struct ControlResourceSet *controlRSet;
2958 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2959 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2962 controlRSetList->list.count = elementCnt;
2963 controlRSetList->list.size = \
2964 elementCnt * sizeof(struct ControlResourceSet *);
2966 controlRSetList->list.array = NULLP;
2967 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2968 if(!controlRSetList->list.array)
2970 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2974 for(idx = 0; idx < elementCnt; idx++)
2976 controlRSetList->list.array[idx] = NULLP;
2977 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2978 if(!controlRSetList->list.array[idx])
2980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2986 controlRSet = controlRSetList->list.array[idx];
2987 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2989 /* Values harcoded according to our design:
2992 * Bit string stored ff0000000000
2996 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2997 controlRSet->frequencyDomainResources.buf = NULLP;
2998 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2999 controlRSet->frequencyDomainResources.size);
3000 if(!controlRSet->frequencyDomainResources.buf)
3002 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3006 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3007 coreset0EndPrb = CORESET0_END_PRB;
3008 coreset1StartPrb = coreset0EndPrb + 6;
3009 coreset1NumPrb = CORESET1_NUM_PRB;
3010 /* calculate the PRBs */
3011 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3012 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3013 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3015 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3016 controlRSet->cce_REG_MappingType.present = \
3017 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3019 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3020 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3021 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3022 controlRSet->tci_PresentInDCI = NULLP;
3024 uint8_t tciStateIdx;
3026 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3027 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3028 if(!controlRset->tci_StatesPDCCH_ToAddList)
3030 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3035 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3036 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3037 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3038 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3039 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3045 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3047 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3048 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3050 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3057 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3059 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3060 if(!controlRset->tci_PresentInDCI)
3062 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3066 *(controlRset->tci_PresentInDCI);
3069 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3070 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3071 if(!controlRSet->pdcch_DMRS_ScramblingID)
3073 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3076 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3079 } /* End BuildControlRSetToAddModList */
3081 /*******************************************************************
3083 * @brief Build search space to add/modify list
3087 * Function : BuildSearchSpcToAddModList
3089 * Functionality: Build search space to add/modify list
3092 * @return ROK - success
3095 * ****************************************************************/
3096 uint8_t BuildSearchSpcToAddModList
3098 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3106 struct SearchSpace *searchSpc;
3109 searchSpcList->list.count = elementCnt;
3110 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3112 searchSpcList->list.array = NULLP;
3113 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3114 if(!searchSpcList->list.array)
3116 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3120 for(idx = 0; idx < elementCnt; idx++)
3122 searchSpcList->list.array[idx] = NULLP;
3123 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3124 if(!searchSpcList->list.array[idx])
3126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3132 searchSpc = searchSpcList->list.array[idx];
3134 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3136 searchSpc->controlResourceSetId = NULLP;
3137 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3138 if(!searchSpc->controlResourceSetId)
3140 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3143 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3145 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3146 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3147 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3148 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3150 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3153 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3154 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3156 searchSpc->duration = NULLP;
3157 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3158 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3159 if(!searchSpc->monitoringSymbolsWithinSlot)
3161 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3165 /* Values taken from reference logs :
3168 * Bit string stores 8000
3173 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3174 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3175 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3176 searchSpc->monitoringSymbolsWithinSlot->size);
3177 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3179 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3184 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3185 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3186 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3187 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3189 searchSpc->nrofCandidates = NULLP;
3190 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3191 if(!searchSpc->nrofCandidates)
3193 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3197 searchSpc->nrofCandidates->aggregationLevel1 = \
3198 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3199 searchSpc->nrofCandidates->aggregationLevel2 = \
3200 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3201 searchSpc->nrofCandidates->aggregationLevel4 = \
3202 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3203 searchSpc->nrofCandidates->aggregationLevel8 = \
3204 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3205 searchSpc->nrofCandidates->aggregationLevel16 = \
3206 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3208 searchSpc->searchSpaceType = NULLP;
3209 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3210 if(!searchSpc->searchSpaceType)
3212 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3216 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3218 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3219 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3220 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3221 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3223 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3226 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3227 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3230 }/* End BuildSearchSpcToAddModList */
3232 /*******************************************************************
3234 * @brief Builds BWP DL dedicated PDCCH config
3238 * Function : BuildBWPDlDedPdcchCfg
3240 * Functionality: Builds BWP DL dedicated PDCCH config
3242 * @params[in] struct PDCCH_Config *pdcchCfg
3244 * @return ROK - success
3247 * ****************************************************************/
3248 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3250 pdcchCfg->controlResourceSetToAddModList = NULLP;
3251 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3252 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3253 if(!pdcchCfg->controlResourceSetToAddModList)
3255 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3259 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3264 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3266 pdcchCfg->searchSpacesToAddModList = NULLP;
3267 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3268 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3269 if(!pdcchCfg->searchSpacesToAddModList)
3271 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3275 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3280 pdcchCfg->searchSpacesToReleaseList = NULLP;
3281 pdcchCfg->downlinkPreemption = NULLP;
3282 pdcchCfg->tpc_PUSCH = NULLP;
3283 pdcchCfg->tpc_PUCCH = NULLP;
3284 pdcchCfg->tpc_SRS = NULLP;
3289 /*******************************************************************
3291 * @brief Builds DMRS DL PDSCH Mapping type A
3295 * Function : BuildDMRSDLPdschMapTypeA
3297 * Functionality: Builds DMRS DL PDSCH Mapping type A
3300 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3301 * @return ROK - success
3304 * ****************************************************************/
3305 uint8_t BuildDMRSDLPdschMapTypeA
3307 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3310 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3311 dmrsDlCfg->choice.setup = NULLP;
3312 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3313 if(!dmrsDlCfg->choice.setup)
3315 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3319 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3320 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3321 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3322 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3324 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3327 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3329 dmrsDlCfg->choice.setup->maxLength = NULLP;
3330 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3331 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3332 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3337 /*******************************************************************
3339 * @brief Builds TCI states to add/modify list
3343 * Function : BuildTCIStatesToAddModList
3345 * Functionality:Builds TCI states to add/modify list
3348 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3350 * @return ROK - success
3353 * ****************************************************************/
3354 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3359 /*******************************************************************
3361 * @brief Builds PDSCH time domain allocation list
3365 * Function : BuildPdschTimeDomAllocList
3367 * Functionality: Builds PDSCH time domain allocation list
3370 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3372 * @return ROK - success
3375 * ****************************************************************/
3376 uint8_t BuildPdschTimeDomAllocList
3378 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3383 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3385 timeDomAllocList->present = \
3386 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3388 timeDomAllocList->choice.setup = NULLP;
3389 CU_ALLOC(timeDomAllocList->choice.setup, \
3390 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3391 if(!timeDomAllocList->choice.setup)
3393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3398 timeDomAllocList->choice.setup->list.count = elementCnt;
3399 timeDomAllocList->choice.setup->list.size = \
3400 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3402 timeDomAllocList->choice.setup->list.array = NULLP;
3403 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3404 timeDomAllocList->choice.setup->list.size);
3405 if(!timeDomAllocList->choice.setup->list.array)
3407 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3411 for(idx = 0; idx < elementCnt; idx++)
3413 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3414 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3415 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3416 if(!timeDomAllocList->choice.setup->list.array[idx])
3418 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3424 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3425 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3426 if(!timeDomAlloc->k0)
3428 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3431 *(timeDomAlloc->k0) = 0;
3432 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3433 timeDomAlloc->startSymbolAndLength = 66;
3436 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3437 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3438 if(!timeDomAlloc->k0)
3440 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3443 *(timeDomAlloc->k0) = 1;
3444 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3445 timeDomAlloc->startSymbolAndLength = 66;
3450 /*******************************************************************
3452 * @brief Builds PDSCH PRB Bundling type
3456 * Function : BuildPdschPrbBundlingType
3458 * Functionality: Builds PDSCH PRB Bundling type
3461 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3463 * @return ROK - success
3466 * ****************************************************************/
3467 uint8_t BuildPdschPrbBundlingType
3469 struct PDSCH_Config__prb_BundlingType *prbBndlType
3472 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3474 prbBndlType->choice.staticBundling = NULLP;
3475 CU_ALLOC(prbBndlType->choice.staticBundling, \
3476 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3477 if(!prbBndlType->choice.staticBundling)
3479 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3482 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3487 /*******************************************************************
3489 * @brief Builds BWP DL dedicated PDSCH config
3493 * Function : BuildBWPDlDedPdschCfg
3495 * Functionality: Builds BWP DL dedicated PDSCH config
3497 * @params[in] struct PDSCH_Config *pdschCfg
3499 * @return ROK - success
3502 * ****************************************************************/
3503 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3505 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3507 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3508 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3509 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3510 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3512 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3516 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3521 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3522 pdschCfg->tci_StatesToAddModList = NULLP;
3523 pdschCfg->tci_StatesToReleaseList = NULLP;
3524 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3526 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3527 if(!pdschCfg->tci_StatesToAddModList)
3529 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3532 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3538 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3540 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3541 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3542 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3543 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3545 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3548 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3552 pdschCfg->pdsch_AggregationFactor = NULLP;
3553 pdschCfg->rateMatchPatternToAddModList = NULLP;
3554 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3555 pdschCfg->rateMatchPatternGroup1 = NULLP;
3556 pdschCfg->rateMatchPatternGroup2 = NULLP;
3557 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3558 pdschCfg->mcs_Table = NULLP;
3560 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3561 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3562 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3564 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3567 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3569 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3574 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3575 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3576 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3577 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3578 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3579 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3580 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3585 /*******************************************************************
3587 * @brief Builds intitial DL BWP
3590 * Function : BuildInitialDlBWP
3592 * Functionality: Builds intitial DL BWP in spCellCfgDed
3594 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3596 * @return ROK - success
3599 * ****************************************************************/
3600 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3602 dlBwp->pdcch_Config = NULLP;
3603 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3604 if(!dlBwp->pdcch_Config)
3606 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3609 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3611 dlBwp->pdcch_Config->choice.setup = NULLP;
3612 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3613 if(!dlBwp->pdcch_Config->choice.setup)
3615 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3618 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3623 dlBwp->pdsch_Config = NULLP;
3624 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3625 if(!dlBwp->pdsch_Config)
3627 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3630 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3632 dlBwp->pdsch_Config->choice.setup = NULLP;
3633 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3634 if(!dlBwp->pdsch_Config->choice.setup)
3636 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3640 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3645 dlBwp->sps_Config = NULLP;
3646 dlBwp->radioLinkMonitoringConfig = NULLP;
3650 /*******************************************************************
3652 * @brief Builds DMRS UL Pusch Mapping type A
3656 * Function : BuildDMRSULPuschMapTypeA
3658 * Functionality: Builds DMRS UL Pusch Mapping type A
3661 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3662 * @return ROK - success
3665 * ****************************************************************/
3666 uint8_t BuildDMRSULPuschMapTypeA
3668 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3671 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3672 dmrsUlCfg->choice.setup= NULLP;
3673 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3674 if(!dmrsUlCfg->choice.setup)
3676 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3680 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3681 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3682 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3683 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3685 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3688 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3690 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3691 dmrsUlCfg->choice.setup->maxLength = NULLP;
3692 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3693 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3694 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3695 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3697 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3701 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3702 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3704 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3706 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3709 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3711 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3712 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3716 /*******************************************************************
3718 * @brief Build PUSCH time domain allocation list
3722 * Function : BuildPuschTimeDomAllocList
3724 * Functionality: Build PUSCH time domain allocation list
3727 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3729 * @return ROK - success
3732 * ****************************************************************/
3733 uint8_t BuildPuschTimeDomAllocList
3735 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3740 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3742 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3743 timeDomAllocList->choice.setup = NULLP;
3744 CU_ALLOC(timeDomAllocList->choice.setup, \
3745 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3746 if(!timeDomAllocList->choice.setup)
3748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3753 timeDomAllocList->choice.setup->list.count = elementCnt;
3754 timeDomAllocList->choice.setup->list.size = \
3755 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3756 timeDomAllocList->choice.setup->list.array = NULLP;
3757 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3758 timeDomAllocList->choice.setup->list.size);
3759 if(!timeDomAllocList->choice.setup->list.array)
3761 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3765 for(idx = 0; idx < elementCnt; idx++)
3767 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3768 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3769 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3770 if(!timeDomAllocList->choice.setup->list.array[idx])
3772 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3778 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3779 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3780 if(!timeDomAlloc->k2)
3782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3785 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3786 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3787 timeDomAlloc->startSymbolAndLength = 66;
3790 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3791 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3792 if(!timeDomAlloc->k2)
3794 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3797 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3798 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3799 timeDomAlloc->startSymbolAndLength = 66;
3804 /*******************************************************************
3806 * @brief Builds BWP UL dedicated PUSCH Config
3810 * Function : BuildBWPUlDedPuschCfg
3813 * Builds BWP UL dedicated PUSCH Config
3815 * @params[in] : PUSCH_Config_t *puschCfg
3817 * @return ROK - success
3820 * ****************************************************************/
3821 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3823 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3824 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3825 if(!puschCfg->dataScramblingIdentityPUSCH)
3827 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3830 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3832 puschCfg->txConfig = NULLP;
3833 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3834 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3835 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3836 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3838 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3842 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3847 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3848 puschCfg->pusch_PowerControl = NULLP;
3849 puschCfg->frequencyHopping = NULLP;
3850 puschCfg->frequencyHoppingOffsetLists = NULLP;
3851 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3853 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3854 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3855 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3856 if(!puschCfg->pusch_TimeDomainAllocationList)
3858 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3862 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3867 puschCfg->pusch_AggregationFactor = NULLP;
3868 puschCfg->mcs_Table = NULLP;
3869 puschCfg->mcs_TableTransformPrecoder = NULLP;
3870 puschCfg->transformPrecoder = NULLP;
3871 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3872 if(!puschCfg->transformPrecoder)
3874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3877 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3879 puschCfg->codebookSubset = NULLP;
3880 puschCfg->maxRank = NULLP;
3881 puschCfg->rbg_Size = NULLP;
3882 puschCfg->uci_OnPUSCH = NULLP;
3883 puschCfg->tp_pi2BPSK = NULLP;
3888 /*******************************************************************
3890 * @brief Builds BWP UL dedicated PUCCH Config
3894 * Function : BuildBWPUlDedPucchCfg
3897 * Builds BWP UL dedicated PUCCH Config
3899 * @params[in] : PUCCH_Config_t *pucchCfg
3901 * @return ROK - success
3904 * ****************************************************************/
3905 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3907 uint8_t arrIdx, elementCnt;
3908 uint8_t rsrcIdx, rsrcSetIdx;
3909 PUCCH_ResourceSet_t *rsrcSet = NULLP;
3910 PUCCH_Resource_t *rsrc = NULLP;
3914 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
3915 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
3916 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
3917 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
3918 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
3920 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
3923 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
3924 rsrcSet->pucch_ResourceSetId = 1;
3926 rsrcSet->resourceList.list.count = elementCnt;
3927 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
3928 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
3929 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
3931 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
3934 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
3938 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
3939 pucchCfg->resourceToAddModList->list.count = elementCnt;
3940 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
3941 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
3942 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
3944 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
3947 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
3948 rsrc->pucch_ResourceId = 1;
3949 rsrc->startingPRB = 0;
3950 rsrc->format.present = PUCCH_Resource__format_PR_format1;
3951 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
3952 rsrc->format.choice.format1->initialCyclicShift = 0;
3953 rsrc->format.choice.format1->nrofSymbols = 4;
3954 rsrc->format.choice.format1->startingSymbolIndex = 0;
3955 rsrc->format.choice.format1->timeDomainOCC = 0;
3958 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
3959 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
3960 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
3961 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
3962 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
3965 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3966 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3968 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3973 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3974 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3975 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3976 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3978 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3982 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3984 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3985 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3987 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3993 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
3994 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
3999 /*******************************************************************
4001 * @brief Fills SRS resource to add/modify list
4005 * Function : BuildSrsRsrcAddModList
4007 * Functionality: Fills SRS resource to add/modify list
4010 * @return ROK - success
4013 * ****************************************************************/
4014 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4020 resourceList->list.count = elementCnt;
4021 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4022 resourceList->list.array = NULLP;
4023 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4024 if(!resourceList->list.array)
4026 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4030 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4032 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4033 if(!resourceList->list.array[rsrcIdx])
4035 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4041 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4042 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4043 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4045 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4046 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4047 sizeof(struct SRS_Resource__transmissionComb__n2));
4048 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4050 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4053 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4054 = SRS_COMB_OFFSET_N2;
4055 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4056 = SRS_CYCLIC_SHIFT_N2;
4058 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
4060 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4061 SRS_Resource__resourceMapping__nrofSymbols_n1;
4062 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4063 SRS_Resource__resourceMapping__repetitionFactor_n1;
4065 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4066 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4067 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4068 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4069 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4070 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4071 SRS_Resource__groupOrSequenceHopping_neither;
4073 /* Setting resource type to aperiodic for intergration purposes */
4074 resourceList->list.array[rsrcIdx]->resourceType.present = \
4075 SRS_Resource__resourceType_PR_aperiodic;
4076 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4077 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4078 sizeof(struct SRS_Resource__resourceType__aperiodic));
4079 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4081 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4084 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4089 /*******************************************************************
4091 * @brief Build SRS resource set Add/mod list
4095 * Function : BuildSrsRsrcSetAddModList
4097 * Functionality: Build SRS resource set Add/mod list
4100 * @return ROK - success
4103 * ****************************************************************/
4104 uint8_t BuildSrsRsrcSetAddModList
4106 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4112 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4115 rsrcSetList->list.count = elementCnt;
4116 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4117 rsrcSetList->list.array = NULLP;
4118 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4119 if(!rsrcSetList->list.array)
4121 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4125 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4127 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4128 if(!rsrcSetList->list.array[rSetIdx])
4130 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4136 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4138 /* Fill Resource Id list in resource set */
4139 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4140 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4141 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4142 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4144 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4149 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4150 rsrcIdList->list.count = elementCnt;
4151 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4152 rsrcIdList->list.array = NULLP;
4153 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4154 if(!rsrcIdList->list.array)
4156 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4160 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4162 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4163 if(!rsrcIdList->list.array[rsrcIdx])
4165 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4171 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4173 /* Fill resource type */
4174 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4175 SRS_ResourceSet__resourceType_PR_aperiodic;
4177 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4178 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4179 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4180 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4182 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4185 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4186 = APERIODIC_SRS_RESRC_TRIGGER;
4188 /* TODO : Fill values for below IEs as expected by Viavi */
4189 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4190 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4193 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4194 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4195 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4196 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4197 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4202 /*******************************************************************
4204 * @brief Builds BWP UL dedicated SRS Config
4208 * Function : BuildBWPUlDedSrsCfg
4210 * Functionality: Builds BWP UL dedicated SRS Config
4212 * @params[in] SRS Config
4213 * @return ROK - success
4216 * ****************************************************************/
4217 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4219 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4220 srsCfg->srs_ResourceSetToAddModList = NULLP;
4221 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4222 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4223 if(!srsCfg->srs_ResourceSetToAddModList)
4225 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4228 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4233 srsCfg->srs_ResourceToReleaseList = NULLP;
4235 /* Resource to Add/Modify list */
4236 srsCfg->srs_ResourceToAddModList = NULLP;
4237 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4238 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4239 if(!srsCfg->srs_ResourceToAddModList)
4241 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4245 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4250 srsCfg->tpc_Accumulation = NULLP;
4255 /*******************************************************************
4257 * @brief Builds inital UL BWP
4261 * Function : BuildInitialUlBWP
4263 * Functionality: Builds initial UL BWP
4265 * @params[in] BWP_UplinkDedicated_t *ulBwp
4266 * @return ROK - success
4269 * ****************************************************************/
4270 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4272 ulBwp->pucch_Config = NULLP;
4273 ulBwp->pucch_Config = NULLP;
4274 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4275 if(!ulBwp->pucch_Config)
4277 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4281 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4282 ulBwp->pucch_Config->choice.setup = NULLP;
4283 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4284 if(!ulBwp->pucch_Config->choice.setup)
4286 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4290 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4295 /* Fill BWP UL dedicated PUSCH config */
4296 ulBwp->pusch_Config = NULLP;
4297 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4298 if(!ulBwp->pusch_Config)
4300 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4304 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4305 ulBwp->pusch_Config->choice.setup = NULLP;
4306 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4307 if(!ulBwp->pusch_Config->choice.setup)
4309 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4313 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4318 ulBwp->configuredGrantConfig = NULLP;
4320 /* Fill BPW UL dedicated SRS config */
4321 ulBwp->srs_Config = NULLP;
4322 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4323 if(!ulBwp->srs_Config)
4325 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4329 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4330 ulBwp->srs_Config->choice.setup = NULLP;
4331 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4332 if(!ulBwp->srs_Config->choice.setup)
4334 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4338 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4343 ulBwp->beamFailureRecoveryConfig = NULLP;
4348 /*******************************************************************
4350 * @brief Builds Pusch Serving cell Config
4354 * Function : BuildPuschSrvCellCfg
4356 * Functionality: Builds Pusch Serving cell Config
4358 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4360 * @return ROK - success
4363 * ****************************************************************/
4364 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4366 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4367 puschCfg->choice.setup = NULLP;
4368 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4369 if(!puschCfg->choice.setup)
4371 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4375 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4376 puschCfg->choice.setup->rateMatching = NULLP;
4377 puschCfg->choice.setup->xOverhead = NULLP;
4378 puschCfg->choice.setup->ext1 = NULLP;
4379 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4380 if(!puschCfg->choice.setup->ext1)
4382 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4386 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4387 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4388 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4390 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4393 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4395 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4396 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4397 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4399 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4402 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4406 /*******************************************************************
4408 * @brief Builds UL config
4411 * Function : BuildUlCfg
4413 * Functionality: Builds UL config in spCellCfgDed
4415 * @params[in] UplinkConfig_t *ulCfg
4417 * @return ROK - success
4420 * ****************************************************************/
4421 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4423 ulCfg->initialUplinkBWP = NULLP;
4424 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4425 if(!ulCfg->initialUplinkBWP)
4427 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4431 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4436 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4437 ulCfg->uplinkBWP_ToAddModList = NULLP;
4438 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4439 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4440 if(!ulCfg->firstActiveUplinkBWP_Id)
4442 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4445 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4447 ulCfg->pusch_ServingCellConfig = NULLP;
4448 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4449 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4450 if(!ulCfg->pusch_ServingCellConfig)
4452 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4456 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4461 ulCfg->carrierSwitching = NULLP;
4462 ulCfg->ext1 = NULLP;
4466 /*******************************************************************
4468 * @brief Builds PDSCH serving cell config
4471 * Function : BuildPdschSrvCellCfg
4473 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4475 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4477 * @return ROK - success
4480 * ****************************************************************/
4481 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4483 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4484 pdschCfg->choice.setup = NULLP;
4485 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4486 if(!pdschCfg->choice.setup)
4488 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4492 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4493 pdschCfg->choice.setup->xOverhead = NULLP;
4494 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4495 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4496 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4498 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4501 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4502 pdschCfg->choice.setup->pucch_Cell = NULLP;
4503 pdschCfg->choice.setup->ext1 = NULLP;
4508 /*******************************************************************
4510 * @brief Builds CSI Meas config
4513 * Function : BuildCsiMeasCfg
4515 * Functionality: Builds CSI Meas config in spCellCfgDed
4517 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4519 * @return ROK - success
4522 * ****************************************************************/
4523 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4529 /*******************************************************************
4531 * @brief Builds Spcell config dedicated
4534 * Function : BuildSpCellCfgDed
4536 * Functionality: Builds sp cell config dedicated in spCellCfg
4538 * @params[in] ServingCellConfig_t srvCellCfg
4540 * @return ROK - success
4543 * ****************************************************************/
4544 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4546 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4548 srvCellCfg->initialDownlinkBWP = NULLP;
4549 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4550 if(!srvCellCfg->initialDownlinkBWP)
4552 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4556 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4558 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4561 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4562 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4564 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4565 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4566 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4568 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4571 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4573 srvCellCfg->bwp_InactivityTimer = NULLP;
4575 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4576 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4577 if(!srvCellCfg->defaultDownlinkBWP_Id)
4579 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4582 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4584 srvCellCfg->uplinkConfig = NULLP;
4585 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4586 if(!srvCellCfg->uplinkConfig)
4588 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4592 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4594 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4597 srvCellCfg->supplementaryUplink = NULLP;
4598 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4600 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4601 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4602 if(!srvCellCfg->pdsch_ServingCellConfig)
4604 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4608 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4610 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4614 srvCellCfg->csi_MeasConfig = NULLP;
4616 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4617 if(!srvCellCfg->csi_MeasConfig)
4619 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4623 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4625 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4629 srvCellCfg->sCellDeactivationTimer = NULLP;
4630 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4631 srvCellCfg->tag_Id = TAG_ID;
4632 srvCellCfg->dummy = NULLP;
4633 srvCellCfg->pathlossReferenceLinking = NULLP;
4634 srvCellCfg->servingCellMO = NULLP;
4635 srvCellCfg->ext1 = NULLP;
4639 /*******************************************************************
4641 * @brief Builds Spcell config
4645 * Function : BuildSpCellCfg
4647 * Functionality: Builds sp cell config in DuToCuRrcContainer
4649 * @params[in] SpCellConfig_t spCellCfg
4651 * @return ROK - success
4654 * ****************************************************************/
4655 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4658 spCellCfg->servCellIndex = NULLP;
4659 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4660 if(!spCellCfg->servCellIndex)
4662 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4665 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4667 spCellCfg->reconfigurationWithSync = NULLP;
4668 spCellCfg->rlf_TimersAndConstants = NULLP;
4669 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4670 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4671 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4673 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4676 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4678 spCellCfg->spCellConfigDedicated = NULLP;
4679 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4680 if(!spCellCfg->spCellConfigDedicated)
4682 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4685 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4687 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4692 /*******************************************************************
4694 * @brief Builds Phy cell group config
4698 * Function : BuildPhyCellGrpCfg
4700 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4702 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4704 * @return ROK - success
4707 * ****************************************************************/
4708 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4710 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4711 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4713 phyCellGrpCfg->p_NR_FR1 = NULLP;
4714 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4715 if(!phyCellGrpCfg->p_NR_FR1)
4717 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4720 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4721 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4722 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4723 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4724 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4725 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4726 phyCellGrpCfg->cs_RNTI = NULLP;
4727 phyCellGrpCfg->ext1 = NULLP;
4728 phyCellGrpCfg->ext2 = NULLP;
4733 /*******************************************************************
4735 * @brief Builds tag config
4739 * Function : BuildTagConfig
4741 * Functionality: Builds tag config in MacCellGroupConfig
4743 * @params[in] TAG_Config *tag_Config
4745 * @return ROK - success
4748 * ****************************************************************/
4749 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4751 struct TAG_Config__tag_ToAddModList *tagList;
4752 uint8_t idx, elementCnt;
4754 tagConfig->tag_ToReleaseList = NULLP;
4755 tagConfig->tag_ToAddModList = NULLP;
4756 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4757 if(!tagConfig->tag_ToAddModList)
4759 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4763 elementCnt = 1; //ODU_VALUE_ONE;
4764 tagList = tagConfig->tag_ToAddModList;
4765 tagList->list.count = elementCnt;
4766 tagList->list.size = elementCnt * sizeof(struct TAG *);
4768 tagList->list.array = NULLP;
4769 CU_ALLOC(tagList->list.array, tagList->list.size);
4770 if(!tagList->list.array)
4772 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4776 for(idx=0; idx<tagList->list.count; idx++)
4778 tagList->list.array[idx] = NULLP;
4779 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4780 if(!tagList->list.array[idx])
4782 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4788 tagList->list.array[idx]->tag_Id = TAG_ID;
4789 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4794 /*******************************************************************
4796 * @brief Builds PHR Config
4800 * Function : BuildPhrConfig
4802 * Functionality: Builds phrConfig in MacCellGroupConfig
4804 * @params[in] PHR Config *
4806 * @return ROK - success
4809 * ****************************************************************/
4810 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4813 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4814 phrConfig->choice.setup = NULLP;
4815 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4816 if(!phrConfig->choice.setup)
4818 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4822 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4823 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4824 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4825 phrConfig->choice.setup->multiplePHR = false;
4826 phrConfig->choice.setup->dummy = false;
4827 phrConfig->choice.setup->phr_Type2OtherCell = false;
4828 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4833 /*******************************************************************
4835 * @brief Builds BSR Config
4839 * Function : BuildBsrConfig
4841 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4843 * @params[in] BSR_Config *bsrConfig
4845 * @return ROK - success
4848 * ****************************************************************/
4849 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4851 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4852 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4853 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4858 /*******************************************************************
4860 * @brief Builds scheduling request config
4864 * Function : BuildSchedulingReqConfig
4866 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4868 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4870 * @return ROK - success
4873 * ****************************************************************/
4874 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4876 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4877 uint8_t idx, elementCnt;
4879 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4880 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4881 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4882 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4884 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4888 elementCnt = 1; //ODU_VALUE_ONE;
4889 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4890 schReqList->list.count = elementCnt;
4891 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4893 schReqList->list.array = NULLP;
4894 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4895 if(!schReqList->list.array)
4897 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4901 for(idx=0;idx<schReqList->list.count; idx++)
4903 schReqList->list.array[idx] = NULLP;
4904 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4905 if(!schReqList->list.array[idx])
4907 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4913 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4915 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4916 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4917 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4919 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4922 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4923 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4924 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4928 /*******************************************************************
4930 * @brief Builds Mac cell group config
4934 * Function : BuildMacCellGrpCfg
4936 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4938 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4940 * @return ROK - success
4943 * ****************************************************************/
4944 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4946 macCellGrpCfg->drx_Config = NULLP;
4947 macCellGrpCfg->schedulingRequestConfig = NULLP;
4948 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4949 if(!macCellGrpCfg->schedulingRequestConfig)
4951 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4955 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4957 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4961 macCellGrpCfg->bsr_Config = NULLP;
4962 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4963 if(!macCellGrpCfg->bsr_Config)
4965 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4969 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4971 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4975 macCellGrpCfg->tag_Config = NULLP;
4976 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4977 if(!macCellGrpCfg->tag_Config)
4979 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4983 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4985 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4989 macCellGrpCfg->phr_Config = NULLP;
4990 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4991 if(!macCellGrpCfg->phr_Config)
4993 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4997 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4999 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5003 macCellGrpCfg->skipUplinkTxDynamic = false;
5004 macCellGrpCfg->ext1 = NULLP;
5008 /*******************************************************************
5010 * @brief Frees memeory allocated for SearchSpcToAddModList
5014 * Function : FreeSearchSpcToAddModList
5016 * Functionality: Deallocating memory of SearchSpcToAddModList
5018 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5022 4221 * ****************************************************************/
5023 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5027 struct SearchSpace *searchSpc=NULLP;
5029 if(searchSpcList->list.array)
5031 if(searchSpcList->list.array[idx2])
5033 searchSpc = searchSpcList->list.array[idx2];
5034 if(searchSpc->controlResourceSetId)
5036 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5038 if(searchSpc->monitoringSymbolsWithinSlot)
5040 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5042 if(searchSpc->nrofCandidates)
5044 if(searchSpc->searchSpaceType)
5046 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5047 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5048 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5049 SearchSpace__searchSpaceType));
5051 CU_FREE(searchSpc->nrofCandidates,
5052 sizeof(struct SearchSpace__nrofCandidates));
5054 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5055 searchSpc->monitoringSymbolsWithinSlot->size);
5057 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5058 sizeof(BIT_STRING_t));
5060 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5061 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5063 CU_FREE(searchSpc->controlResourceSetId,
5064 sizeof(ControlResourceSetId_t));
5067 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5069 CU_FREE(searchSpcList->list.array[idx1],
5070 sizeof(struct SearchSpace));
5072 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5075 /*******************************************************************
5077 * @brief Frees memory allocated for PdschTimeDomAllocList
5081 * Function : FreePdschTimeDomAllocList
5083 * Functionality: Deallocating memory of PdschTimeDomAllocList
5085 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5089 4221 * ****************************************************************/
5090 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5094 if(timeDomAllocList->choice.setup)
5096 if(timeDomAllocList->choice.setup->list.array)
5098 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5100 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5101 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5103 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5104 timeDomAllocList->choice.setup->list.size);
5106 CU_FREE(timeDomAllocList->choice.setup,\
5107 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5110 /*******************************************************************
5112 * @brief Frees memory allocated for PuschTimeDomAllocList
5116 * Function : FreePuschTimeDomAllocList
5118 * Functionality: Deallocating memory of PuschTimeDomAllocList
5120 * @params[in] PUSCH_Config_t *puschCfg
5124 ***********************************************************************/
5125 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5129 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5131 if(puschCfg->pusch_TimeDomainAllocationList)
5133 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5134 if(timeDomAllocList_t->choice.setup)
5136 if(timeDomAllocList_t->choice.setup->list.array)
5138 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5139 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5141 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5142 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5144 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5145 timeDomAllocList_t->choice.setup->list.size);
5147 CU_FREE(timeDomAllocList_t->choice.setup, \
5148 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5150 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5151 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5152 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5157 /*******************************************************************
5159 * @brief Frees memory allocated for Dedicated PUCCH config
5163 * Function : FreeBWPUlDedPucchCfg
5165 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5167 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5171 * ****************************************************************/
5172 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5174 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5175 PUCCH_Config_t *pucchCfg = NULLP;
5176 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5177 PUCCH_Resource_t *rsrc = NULLP;
5181 if(ulBwpPucchCfg->choice.setup)
5183 pucchCfg = ulBwpPucchCfg->choice.setup;
5185 //Free resource set list
5186 if(pucchCfg->resourceSetToAddModList)
5188 if(pucchCfg->resourceSetToAddModList->list.array)
5190 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5192 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5193 if(rsrcSet->resourceList.list.array)
5195 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5197 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5199 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5201 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5203 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5205 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5208 //Free resource list
5209 if(pucchCfg->resourceToAddModList)
5211 if(pucchCfg->resourceToAddModList->list.array)
5213 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5215 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5216 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5217 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5219 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5221 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5225 if(pucchCfg->format1)
5227 if(pucchCfg->format1->choice.setup)
5229 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5230 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5232 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5236 if(pucchCfg->dl_DataToUL_ACK)
5238 if(pucchCfg->dl_DataToUL_ACK->list.array)
5240 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5242 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5244 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5246 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5249 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5251 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5255 /*******************************************************************
5257 * @brief Frees memory allocated for InitialUlBWP
5261 * Function : FreeInitialUlBWP
5263 * Functionality: Deallocating memory of InitialUlBWP
5265 * @params[in] BWP_UplinkDedicated_t *ulBwp
5269 * ****************************************************************/
5270 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5272 uint8_t rSetIdx, rsrcIdx;
5273 SRS_Config_t *srsCfg = NULLP;
5274 PUSCH_Config_t *puschCfg = NULLP;
5275 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5276 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5277 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5278 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5280 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5282 if(ulBwp->pusch_Config)
5284 if(ulBwp->pusch_Config->choice.setup)
5286 puschCfg=ulBwp->pusch_Config->choice.setup;
5287 if(puschCfg->dataScramblingIdentityPUSCH)
5289 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5291 FreePuschTimeDomAllocList(puschCfg);
5292 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5293 if(dmrsUlCfg->choice.setup)
5295 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5297 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5299 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5301 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5302 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5304 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5307 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5309 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5310 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5312 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5314 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5316 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5318 /* Free SRS-Config */
5319 if(ulBwp->srs_Config)
5321 if(ulBwp->srs_Config->choice.setup)
5323 srsCfg = ulBwp->srs_Config->choice.setup;
5325 /* Free Resource Set to add/mod list */
5326 if(srsCfg->srs_ResourceSetToAddModList)
5328 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5329 if(rsrcSetList->list.array)
5333 /* Free SRS resource Id list in this SRS resource set */
5334 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5336 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5338 if(rsrcIdList->list.array)
5340 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5342 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5344 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5346 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5347 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5350 /* Free resource type info for this SRS resource set */
5351 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5352 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5354 /* Free memory for each resource set */
5355 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5357 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5359 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5361 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5362 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5365 /* Free resource to add/modd list */
5366 if(srsCfg->srs_ResourceToAddModList)
5368 resourceList = srsCfg->srs_ResourceToAddModList;
5369 if(resourceList->list.array)
5372 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5373 sizeof(struct SRS_Resource__transmissionComb__n2));
5374 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5375 sizeof(struct SRS_Resource__resourceType__aperiodic));
5377 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5379 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5381 CU_FREE(resourceList->list.array, resourceList->list.size);
5383 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5384 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5387 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5389 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5393 /*******************************************************************
5395 * @brief Frees memory allocated for initialUplinkBWP
5399 * Function : FreeinitialUplinkBWP
5401 * Functionality: Deallocating memory of initialUplinkBWP
5403 * @params[in] UplinkConfig_t *ulCfg
5408 * ****************************************************************/
5409 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5411 BWP_UplinkDedicated_t *ulBwp=NULLP;
5412 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5414 if(ulCfg->initialUplinkBWP)
5416 ulBwp=ulCfg->initialUplinkBWP;
5417 if(ulCfg->firstActiveUplinkBWP_Id)
5419 if(ulCfg->pusch_ServingCellConfig)
5421 puschCfg=ulCfg->pusch_ServingCellConfig;
5422 if(puschCfg->choice.setup)
5424 if(puschCfg->choice.setup->ext1)
5426 CU_FREE(puschCfg->choice.setup->ext1->\
5427 processingType2Enabled,sizeof(BOOLEAN_t));
5428 CU_FREE(puschCfg->choice.setup->ext1->\
5429 maxMIMO_Layers,sizeof(long));
5430 CU_FREE(puschCfg->choice.setup->ext1, \
5431 sizeof(struct PUSCH_ServingCellConfig__ext1));
5433 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5435 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5437 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5439 FreeInitialUlBWP(ulBwp);
5440 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5443 /*******************************************************************
5445 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5449 * Function : FreeBWPDlDedPdschCfg
5451 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5453 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5458 * ****************************************************************/
5459 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5461 struct PDSCH_Config *pdschCfg=NULLP;
5462 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5463 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5464 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5466 if(dlBwp->pdsch_Config->choice.setup)
5468 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5469 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5471 if(pdschCfg->pdsch_TimeDomainAllocationList)
5473 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5474 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5476 prbBndlType=&pdschCfg->prb_BundlingType;
5477 CU_FREE(prbBndlType->choice.staticBundling,\
5478 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5479 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5481 FreePdschTimeDomAllocList(timeDomAllocList);
5482 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5483 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5485 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5486 if(dmrsDlCfg->choice.setup)
5488 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5490 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5492 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5493 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5495 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5498 /*******************************************************************
5500 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5504 * Function : FreeBWPDlDedPdcchCfg
5506 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5508 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5513 * ****************************************************************/
5514 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5518 struct PDCCH_Config *pdcchCfg=NULLP;
5519 struct ControlResourceSet *controlRSet=NULLP;
5520 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5522 if(dlBwp->pdcch_Config->choice.setup)
5524 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5525 if(pdcchCfg->controlResourceSetToAddModList)
5527 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5528 if(controlRSetList->list.array)
5530 controlRSet = controlRSetList->list.array[idx2];
5533 if(controlRSet->frequencyDomainResources.buf)
5535 if(controlRSet->pdcch_DMRS_ScramblingID)
5537 if(pdcchCfg->searchSpacesToAddModList)
5539 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5540 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5541 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5543 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5545 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5546 controlRSet->frequencyDomainResources.size);
5549 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5551 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5553 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5555 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5556 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5558 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5561 /*******************************************************************
5563 * @brief Builds RLC Config
5567 * Function : BuildRlcConfig
5569 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5571 * @params[in] RLC_Config *rlcConfig
5573 * @return ROK - success
5576 * ****************************************************************/
5577 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5580 rlcConfig->present = RLC_Config_PR_am;
5582 rlcConfig->choice.am = NULLP;
5583 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5584 if(!rlcConfig->choice.am)
5586 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5591 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5592 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5593 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5595 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5598 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5599 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5600 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5601 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5602 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5605 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5606 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5607 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5609 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5612 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5613 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5614 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5619 /*******************************************************************
5621 * @brief Builds MAC LC Config
5625 * Function : BuildMacLCConfig
5627 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5629 * @params[in] struct LogicalChannelConfig macLcConfig
5631 * @return ROK - success
5634 * ****************************************************************/
5635 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5638 macLcConfig->ul_SpecificParameters = NULLP;
5639 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5640 if(!macLcConfig->ul_SpecificParameters)
5642 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5646 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5647 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5648 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5649 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5650 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5651 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5652 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5654 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5655 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5656 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5658 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5661 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5663 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5664 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5665 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5667 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5670 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5672 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5673 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5674 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5678 /*******************************************************************
5680 * @brief Builds RLC Bearer to Add/Mod list
5684 * Function :BuildRlcBearerToAddModList
5686 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5688 * @params[in] rlc_BearerToAddModList
5690 * @return ROK - success
5693 * ****************************************************************/
5694 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5696 uint8_t idx, elementCnt;
5699 rlcBearerList->list.count = elementCnt;
5700 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5702 rlcBearerList->list.array = NULLP;
5703 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5704 if(!rlcBearerList->list.array)
5706 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5710 for(idx=0; idx<rlcBearerList->list.count; idx++)
5712 rlcBearerList->list.array[idx] = NULLP;
5713 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5714 if(!rlcBearerList->list.array[idx])
5716 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5722 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5724 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5725 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5727 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5731 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5732 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5734 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5735 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5736 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5737 if(!rlcBearerList->list.array[idx]->rlc_Config)
5739 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5743 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5745 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5749 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5750 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5751 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5753 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5757 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5759 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5766 /*******************************************************************
5768 * @brief Free memory allocated for CellGroupConfig
5772 * Function : FreeMemCellGrpCfg
5774 * Functionality: Deallocating memory of CellGroupConfig
5776 * @params[in] pointer to CellGroupConfigRrc_t
5778 * @return ROK - success
5781 ******************************************************************/
5782 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5785 SpCellConfig_t *spCellCfg=NULLP;
5786 ServingCellConfig_t *srvCellCfg=NULLP;
5787 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5788 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5789 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5790 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5791 struct RLC_Config *rlcConfig=NULLP;
5792 struct LogicalChannelConfig *macLcConfig=NULLP;
5793 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5794 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5795 struct TAG_Config *tagConfig=NULLP;
5796 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5797 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5798 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5800 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5803 if(rlcBearerList->list.array)
5805 for(idx=0; idx<rlcBearerList->list.count; idx++)
5807 if(rlcBearerList->list.array[idx])
5809 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5810 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5813 if(rlcConfig->choice.am)
5815 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5816 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5817 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5819 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5821 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5824 if(macLcConfig->ul_SpecificParameters)
5826 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5827 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5828 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5830 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5832 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5835 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5837 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5840 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5843 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5844 if(schedulingRequestConfig)
5846 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5849 if(schReqList->list.array)
5851 for(idx=0;idx<schReqList->list.count; idx++)
5853 if(schReqList->list.array[idx])
5855 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5856 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5859 CU_FREE(schReqList->list.array, schReqList->list.size);
5861 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5862 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5863 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5865 if(macCellGrpCfg->bsr_Config)
5867 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5869 tagConfig = macCellGrpCfg->tag_Config;
5872 tagList = tagConfig->tag_ToAddModList;
5875 if(tagList->list.array)
5877 for(idx=0; idx<tagList->list.count; idx++)
5879 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5881 CU_FREE(tagList->list.array, tagList->list.size);
5883 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5885 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5888 phrConfig = macCellGrpCfg->phr_Config;
5891 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5892 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5895 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5898 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5901 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5902 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5905 spCellCfg = cellGrpCfg->spCellConfig;
5908 if(spCellCfg->servCellIndex)
5910 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5912 if(spCellCfg->spCellConfigDedicated)
5914 srvCellCfg = spCellCfg->spCellConfigDedicated;
5915 if(srvCellCfg->initialDownlinkBWP)
5917 dlBwp = srvCellCfg->initialDownlinkBWP;
5918 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5920 if(srvCellCfg->defaultDownlinkBWP_Id)
5922 if(srvCellCfg->uplinkConfig)
5924 if(srvCellCfg->pdsch_ServingCellConfig)
5926 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5927 if(pdschCfg->choice.setup)
5929 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5930 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5932 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5933 ServingCellConfig__pdsch_ServingCellConfig));
5935 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5936 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5938 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5940 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5942 if(dlBwp->pdcch_Config)
5944 if(dlBwp->pdsch_Config)
5946 FreeBWPDlDedPdschCfg(dlBwp);
5947 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5949 FreeBWPDlDedPdcchCfg(dlBwp);
5950 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5952 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5954 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5956 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5958 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5960 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5965 /*******************************************************************
5967 * @brief Fills CellGroupConfig
5971 * Function : fillCellGrpCfg
5973 * Functionality: Fills CellGroupConfig
5975 * @params[in] pointer to CellGroupConfigRrc_t
5977 * @return ROK - success
5980 ******************************************************************/
5982 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5984 uint8_t ret = RFAILED;
5985 CellGroupConfigRrc_t cellGrpCfg;
5986 asn_enc_rval_t encRetVal;
5990 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5992 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5993 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5994 if(!cellGrpCfg.rlc_BearerToAddModList)
5996 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5999 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
6001 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6005 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6006 cellGrpCfg.mac_CellGroupConfig = NULLP;
6007 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6008 if(!cellGrpCfg.mac_CellGroupConfig)
6010 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6013 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6015 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6019 cellGrpCfg.physicalCellGroupConfig = NULLP;
6020 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6021 if(!cellGrpCfg.physicalCellGroupConfig)
6023 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6026 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6028 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6032 cellGrpCfg.spCellConfig = NULLP;
6033 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6034 if(!cellGrpCfg.spCellConfig)
6036 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6039 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6041 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6045 cellGrpCfg.sCellToAddModList = NULLP;
6046 cellGrpCfg.sCellToReleaseList = NULLP;
6047 cellGrpCfg.ext1 = NULLP;
6049 /* encode cellGrpCfg into duToCuRrcContainer */
6050 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6051 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6053 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6054 /* Encode results */
6055 if(encRetVal.encoded == ENCODE_FAIL)
6057 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6058 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6063 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6064 for(int i=0; i< encBufSize; i++)
6066 DU_LOG("%x",encBuf[i]);
6070 cellGrp->size = encBufSize;
6071 CU_ALLOC(cellGrp->buf, cellGrp->size);
6074 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6077 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6081 FreeMemCellGrpCfg(&cellGrpCfg);
6085 /*******************************************************************
6087 * @brief Free UE Capability RAT container
6091 * Function : freeUeCapRatCont
6094 * Free UE Capability RAT conatiner
6097 * @return ROK - success
6100 * ****************************************************************/
6101 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6104 FeatureSets_t *featureSets;
6106 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6108 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6110 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6111 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6113 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6116 if(ueNrCap->featureSets)
6118 featureSets = ueNrCap->featureSets;
6119 if(featureSets->featureSetsDownlinkPerCC)
6121 if(featureSets->featureSetsDownlinkPerCC->list.array)
6123 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6125 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6126 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6127 sizeof(ModulationOrder_t));
6128 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6130 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6132 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6135 if(featureSets->featureSetsUplinkPerCC)
6137 if(featureSets->featureSetsUplinkPerCC->list.array)
6139 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6141 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6143 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6144 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6145 sizeof(ModulationOrder_t));
6146 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6149 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6151 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6153 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6157 /*******************************************************************
6159 * @brief Free UE capability RAT container list
6163 * Function : freeUeCapRatContList
6165 * Functionality: Free UE capability RAT container list
6168 * @return ROK - success
6171 * ****************************************************************/
6172 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6175 if(ueCapablityList->list.array)
6177 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6179 if(ueCapablityList->list.array[idx])
6180 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6182 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6186 /*******************************************************************
6188 * @brief Fill feature sets
6192 * Function : fillFeatureSets
6194 * Functionality: Fill feature sets
6197 * @return ROK - success
6200 * ****************************************************************/
6201 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6203 uint8_t idx, elementCnt;
6205 featureSets->featureSetsDownlink = NULLP;
6206 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6207 if(!featureSets->featureSetsDownlinkPerCC)
6209 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6214 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6215 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6216 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6217 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6219 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6223 for(idx = 0; idx < elementCnt; idx++)
6225 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6226 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6228 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6234 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6235 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6236 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6237 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6238 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6240 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6241 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6243 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6246 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6248 featureSets->featureSetsUplink = NULLP;
6249 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6250 if(!featureSets->featureSetsUplinkPerCC)
6252 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6257 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6258 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6259 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6260 if(!featureSets->featureSetsUplinkPerCC->list.array)
6262 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6266 for(idx = 0; idx < elementCnt; idx++)
6268 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6269 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6271 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6277 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6278 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6279 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6280 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6281 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6282 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6284 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6285 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6287 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6290 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6295 /*******************************************************************
6297 * @brief Fill UE capability RAT container
6301 * Function : fillUeCapRatCont
6303 * Functionality: Fill UE capability RAT container
6305 * @params[in] UE Capability RAT container buffer
6306 * @return ROK - success
6309 * ****************************************************************/
6310 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6313 uint8_t idx, elementCnt;
6314 asn_enc_rval_t encRetVal;
6315 UE_NR_Capability_t ueNrCap;
6319 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6321 /* Filling PDCP parameters */
6322 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6323 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6324 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6325 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6326 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6327 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6328 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6329 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6330 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6331 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6332 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6333 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6334 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6335 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6336 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6337 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6338 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6340 ueNrCap.rlc_Parameters = NULLP;
6341 ueNrCap.mac_Parameters = NULLP;
6343 /* Filling PHY parameters */
6344 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6345 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6346 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6347 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6348 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6350 /* Filling RF parameters */
6352 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6353 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6354 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6355 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6357 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6362 for(idx = 0; idx < elementCnt; idx++)
6364 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6365 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6375 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6376 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6377 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6379 ueNrCap.measAndMobParameters = NULLP;
6380 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6381 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6382 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6383 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6384 ueNrCap.featureSets = NULLP;
6386 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6387 if(!ueNrCap.featureSets)
6389 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6394 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6396 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6401 ueNrCap.featureSetCombinations = NULLP;
6402 ueNrCap.lateNonCriticalExtension = NULLP;
6403 ueNrCap.nonCriticalExtension = NULLP;
6405 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6406 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6407 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6409 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6411 /* Encode results */
6412 if(encRetVal.encoded == ENCODE_FAIL)
6414 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6415 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6420 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6421 for(int i=0; i< encBufSize; i++)
6423 DU_LOG("%x",encBuf[i]);
6427 ueCapRatContBuf->size = encBufSize;
6428 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6429 if(!ueCapRatContBuf->buf)
6431 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6434 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6438 freeUeCapRatCont(&ueNrCap);
6442 /*******************************************************************
6444 * @brief Fill UE Capability RAT container list
6448 * Function : fillUeCapRatContList
6450 * Functionality: Fill UE Capability RAT container list
6453 * @params[in] UE capability RAT container list buffer
6454 * @return ROK - success
6457 * ****************************************************************/
6458 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6460 uint8_t ret = RFAILED;
6461 uint8_t idx, elementCnt;
6462 asn_enc_rval_t encRetVal;
6463 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6468 ueCapablityList.list.count = elementCnt;
6469 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6471 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6472 if(!ueCapablityList.list.array)
6474 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6479 for(idx=0; idx<elementCnt; idx++)
6481 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6482 if(ueCapablityList.list.array[idx] == NULLP)
6484 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6490 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6491 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6493 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6494 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6495 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6497 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6498 &ueCapablityList, PrepFinalEncBuf, encBuf);
6500 /* Encode results */
6501 if(encRetVal.encoded == ENCODE_FAIL)
6503 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6504 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6509 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6510 for(int i=0; i< encBufSize; i++)
6512 DU_LOG("%x",encBuf[i]);
6516 ueCapablityListBuf->size = encBufSize;
6517 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6518 if(!ueCapablityListBuf->buf)
6520 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6523 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6527 freeUeCapRatContList(&ueCapablityList);
6531 /*******************************************************************
6533 * @brief Fills CuToDuContainer
6537 * Function : fillCuToDuContainer
6539 * Functionality: Fills CuToDuContainer
6541 * @params[in] pointer to CUtoDURRCInformation_t
6543 * @return ROK - success
6546 ******************************************************************/
6548 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6550 uint8_t elementCnt = 0;
6552 uint8_t idx, idx2, rrcBufLen;
6554 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6555 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6557 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6560 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6562 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6563 if(rrcMsg->iE_Extensions)
6566 rrcMsg->iE_Extensions->list.count = elementCnt;
6567 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6569 /* Initialize the CUtoDURRCInformation_ExtIEs */
6570 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6572 if(rrcMsg->iE_Extensions->list.array == NULLP)
6574 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6578 for(idx=0; idx<elementCnt; idx++)
6580 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6581 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6583 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
6588 /* Filling CellGroupConfig_t IE */
6589 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6590 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6591 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6592 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6593 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6598 /*******************************************************************
6600 * @brief Free CuToDuContainer
6604 * Function : FreeCuToDuInfo
6606 * Functionality: Free CuToDuContainer
6608 * @params[in] pointer to CUtoDURRCInformation_t
6610 * @return ROK - success
6613 ******************************************************************/
6615 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6619 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6621 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6622 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6623 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6625 if(rrcMsg->iE_Extensions)
6627 if(rrcMsg->iE_Extensions->list.array)
6629 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6631 if(rrcMsg->iE_Extensions->list.array[idx])
6633 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6635 case ProtocolIE_ID_id_CellGroupConfig:
6636 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6638 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6639 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6644 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6645 rrcMsg->iE_Extensions->list.array[idx]->id);
6651 for(idx2 = 0; idx2 < idx; idx2++)
6653 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6655 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6659 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6662 /*******************************************************************
6664 * @brief Builds and sends the UE Setup Request
6668 * Function : BuildAndSendUeContextSetupReq
6670 * Functionality: Constructs the UE Setup Request and sends
6671 * it to the CU through SCTP.
6675 * @return ROK - success
6678 * ****************************************************************/
6679 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer)
6682 uint8_t SplCellListret;
6683 uint8_t SrbSetupret;
6685 uint8_t idx, bufLen;
6687 F1AP_PDU_t *f1apMsg = NULLP;
6688 UEContextSetupRequest_t *ueSetReq = NULLP;
6689 asn_enc_rval_t encRetVal; /* Encoder return value */
6690 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6691 uint8_t ret= RFAILED;
6695 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6697 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6698 if(f1apMsg == NULLP)
6700 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6704 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6705 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6706 if(f1apMsg->choice.initiatingMessage == NULLP)
6708 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6712 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
6713 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6714 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
6716 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6719 ueSetReq->protocolIEs.list.count = elementCnt;
6720 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6722 /* Initialize the UESetup members */
6723 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6725 if(ueSetReq->protocolIEs.list.array == NULLP)
6727 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6731 for(idx1=0; idx1<elementCnt; idx1++)
6733 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6734 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6742 /*GNB CU UE F1AP ID*/
6743 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6744 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6745 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6746 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
6748 /*GNB DU UE F1AP ID*/
6750 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6751 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6752 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6753 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
6757 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
6758 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6759 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
6760 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, ueCb->cellCb->nrCellId);
6766 /*Served Cell Index*/
6768 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
6769 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6770 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
6771 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
6773 /*CellULConfigured*/
6775 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
6776 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6777 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
6778 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
6780 /*CUtoDURRCContainer*/
6782 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
6783 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6784 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6785 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6790 /*Special Cells to be SetupList*/
6792 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
6793 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6794 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6795 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6796 if(SplCellListret != ROK)
6801 /*SRBs To Be Setup List*/
6803 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6804 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6805 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6806 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6807 if(SrbSetupret != ROK)
6812 /*DRBs to Be Setup List*/
6814 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6815 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6816 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6817 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6822 /* RRC Container for security mode */
6824 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6825 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6826 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer;
6828 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6830 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6831 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6832 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6833 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6835 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6838 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6839 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6841 /* RRC delivery status request */
6843 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6844 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6845 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6846 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
6848 /* Bit Rate hardcoded as in reference logs */
6850 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6851 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6852 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
6854 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6856 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6857 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6858 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6859 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6861 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6864 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6865 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6867 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6869 /* Encode the F1SetupRequest type as APER */
6870 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6872 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6874 /* Encode results */
6875 if(encRetVal.encoded == ENCODE_FAIL)
6877 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6878 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6883 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6884 for(int i=0; i< encBufSize; i++)
6886 DU_LOG("%x",encBuf[i]);
6891 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
6893 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6899 FreeUeContextSetupReq(f1apMsg);
6902 }/* End of BuildAndSendUeContextSetupReq*/
6904 /**********************************************************************
6905 * @brief Function to extractTeId received in UE context setup Response
6909 * Function : extractTeId
6912 * - Function to extract TeId
6915 * @return ROK - success
6918 **********************************************************************/
6919 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6923 GTPTunnel_t *gtpDl = NULLP;
6925 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6927 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6929 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6931 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6932 if(gtpDl->gTP_TEID.size > 0)
6934 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6937 DU_LOG("\nERROR --> EGTP: No TeId received");
6945 /****************************************************************
6946 * @brief Function to add Drb tunnels
6950 * Function : addDrbTunnels
6953 * - Function to add Drb tunnels
6956 * @return ROK - success
6959 * ****************************************************************/
6960 uint8_t addDrbTunnels(uint8_t teId)
6965 if(teId > MAX_TEID || teId < MIN_TEID)
6967 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6969 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6970 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6971 tnlEvt.lclTeid = teId;
6972 tnlEvt.remTeid = teId;
6973 ret = cuEgtpTnlMgmtReq(tnlEvt);
6976 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6981 /****************************************************************
6982 * @brief Function to process Drb Setup List
6986 * Function : procDrbSetupList
6989 * - Function to process DRB Setup List
6992 * @return ROK - success
6995 * ****************************************************************/
6996 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
7000 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
7002 if(drbSetupList != NULLP)
7004 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
7006 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
7007 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
7009 /* extracting teId */
7010 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
7013 if(addDrbTunnels(teId)== ROK)
7015 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
7026 /****************************************************************
7027 * @brief Function to process Ue Context Setup Response
7031 * Function : procUeContextSetupResponse
7034 * - Function to process Ue Context Setup Response
7037 * @return ROK - success
7040 * ****************************************************************/
7041 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
7043 uint8_t idx, duUeF1apId;
7046 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
7048 duDb = getDuDb(duId);
7049 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
7051 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
7053 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
7055 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7057 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7058 ueCb = &duDb->ueCb[duUeF1apId-1];
7061 case ProtocolIE_ID_id_DRBs_Setup_List:
7063 /* Adding Tunnels for successful DRB */
7064 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
7070 ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7074 /****************************************************************
7075 * @brief Function to process Ul Rrc Msg received from DU
7079 * Function : procUlRrcMsg
7082 * - Function to process Ul Rrc Msg received from DU
7085 * @return ROK - success
7088 * ****************************************************************/
7090 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
7092 uint8_t idx, ret, srbId, rrcMsgType;
7093 uint8_t cuUeF1apId, duUeF1apId;
7094 uint8_t *rrcContainer = NULLP;
7095 uint16_t rrcContLen;
7098 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
7101 duDb = getDuDb(duId);
7102 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
7104 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
7106 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
7108 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7110 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
7113 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7115 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7118 case ProtocolIE_ID_id_SRBID:
7119 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
7122 case ProtocolIE_ID_id_RRCContainer:
7124 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
7125 CU_ALLOC(rrcContainer, rrcContLen);
7128 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
7131 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
7136 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
7143 ueCb = &duDb->ueCb[duUeF1apId-1];
7144 ueCb->f1apMsgDb.dlRrcMsgCount++;
7145 rrcMsgType = setDlRRCMsgType(ueCb);
7146 if(rrcMsgType == REGISTRATION_ACCEPT)
7148 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
7149 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
7151 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
7153 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
7154 ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer);
7156 if(rrcMsgType == SECURITY_MODE_COMPLETE)
7158 /* To trigger the DL RRC Msg for RRC Reconfig */
7159 ueCb->f1apMsgDb.dlRrcMsgCount++;
7160 rrcMsgType = setDlRRCMsgType(ueCb);
7161 if(rrcMsgType == RRC_RECONFIG)
7163 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
7164 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
7167 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
7169 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
7170 BuildAndSendUeContextModificationReq(duId, ueCb);
7176 /****************************************************************
7177 * @brief Build And Send F1ResetAck
7181 * Function : FreeF1ResetAck
7184 * - Build And Send F1ResetRSP
7187 * @return ROK - success
7190 * ****************************************************************/
7191 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7194 ResetAcknowledge_t *f1ResetAck;
7198 if(f1apMsg->choice.successfulOutcome)
7200 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7202 if(f1ResetAck->protocolIEs.list.array)
7204 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7206 if(f1ResetAck->protocolIEs.list.array[idx])
7208 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7211 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7213 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7215 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7219 /****************************************************************
7220 * @brief Build And Send F1ResetAck
7224 * Function : BuildAndSendF1ResetAck
7227 * - Build And Send F1ResetRSP
7230 * @return ROK - success
7233 * ****************************************************************/
7235 uint8_t BuildAndSendF1ResetAck()
7238 uint8_t elementCnt = 0;
7239 uint8_t ret = RFAILED;
7240 F1AP_PDU_t *f1apMsg = NULL;
7241 ResetAcknowledge_t *f1ResetAck = NULLP;
7242 asn_enc_rval_t encRetVal;
7243 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
7246 /* Allocate the memory for F1ResetRequest_t */
7247 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7248 if(f1apMsg == NULLP)
7250 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7254 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7256 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7257 if(f1apMsg->choice.successfulOutcome == NULLP)
7259 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7263 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
7264 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7265 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7266 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7270 f1ResetAck->protocolIEs.list.count = elementCnt;
7271 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7273 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7274 if(f1ResetAck->protocolIEs.list.array == NULLP)
7276 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
7280 for(idx=0; idx<elementCnt; idx++)
7282 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7283 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7290 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7291 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7292 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7293 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7295 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7297 /* Encode the F1SetupRequest type as UPER */
7298 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7300 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7302 /* Check encode results */
7303 if(encRetVal.encoded == ENCODE_FAIL)
7305 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
7306 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7311 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
7312 for(int i=0; i< encBufSize; i++)
7314 DU_LOG("%x",encBuf[i]);
7319 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
7320 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
7322 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7330 FreeF1ResetAck(f1apMsg);
7334 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7338 if(ulInfo->list.array)
7340 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7342 if(ulInfo->list.array[arrIdx])
7344 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7346 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7348 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7350 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7351 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7352 gTPTunnel->gTP_TEID.size);
7354 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7355 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7356 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7358 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7359 sizeof(GTPTunnel_t));
7361 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7364 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7368 /*******************************************************************
7370 * @brief Deletes the EGTP tunnel
7374 * Function : deleteEgtpTunnel
7376 * Functionality: Deletes the EGTP tunnel
7378 * @params[in] uint8_t *buf
7380 * @return ROK - success
7383 * ****************************************************************/
7384 uint8_t deleteEgtpTunnel(uint8_t *buf)
7389 teIdStringToInt(buf, &teId);
7390 if(teId > MAX_TEID || teId < MIN_TEID)
7392 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7395 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7396 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7397 tnlEvt.lclTeid = teId;
7398 tnlEvt.remTeid = teId;
7399 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7401 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7406 /*******************************************************************
7408 * @brief Builds the Uplink Tunnel Info
7412 * Function : BuildUlTnlInfoforSetupMod
7414 * Functionality: Constructs the UL TnlInfo For DRB list
7416 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7418 * @return ROK - success
7421 * ****************************************************************/
7422 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7428 ulInfo->list.count = ulCnt;
7429 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7430 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7431 if(ulInfo->list.array == NULLP)
7433 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7436 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7438 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7439 if(ulInfo->list.array[arrIdx] == NULLP)
7441 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7447 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7448 UPTransportLayerInformation_PR_gTPTunnel;
7451 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7452 sizeof(GTPTunnel_t));
7453 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7455 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7458 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7459 transportLayerAddress.size = 4*sizeof(uint8_t);
7460 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7461 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7462 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7463 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7464 transportLayerAddress.buf == NULLP)
7466 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7470 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7471 transportLayerAddress.buf[0] = 192;
7472 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7473 transportLayerAddress.buf[1] = 168;
7474 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7475 transportLayerAddress.buf[2] = 130;
7476 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7477 transportLayerAddress.buf[3] = 82;
7478 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7479 transportLayerAddress.bits_unused = 0;
7482 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7483 = 4 * sizeof(uint8_t);
7484 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7485 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7486 gTPTunnel->gTP_TEID.size);
7487 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7490 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7493 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7494 gTP_TEID.buf[0] = 0;
7495 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7496 gTP_TEID.buf[1] = 0;
7497 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7498 gTP_TEID.buf[2] = 0;
7499 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7501 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7502 * fetched based on the Drb Id */
7504 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
7505 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
7506 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
7510 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7511 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
7514 }/*End of BuildULTnlInfo*/
7516 /*******************************************************************
7518 * @brief freeing the DRB item
7522 * Function : FreeDrbItem
7524 * Functionality: freeing the DRB item
7526 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7528 * @return ROK - success
7531 * ****************************************************************/
7533 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7536 SNSSAI_t *snssai =NULLP;
7537 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7539 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7540 switch(drbItem->qoSInformation.present)
7542 case QoSInformation_PR_NOTHING:
7544 case QoSInformation_PR_eUTRANQoS:
7546 if(drbItem->qoSInformation.choice.eUTRANQoS)
7548 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7552 case QoSInformation_PR_choice_extension:
7554 if(drbItem->qoSInformation.choice.choice_extension)
7556 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7558 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7561 CU_FREE(snssai->sST.buf,snssai->sST.size);
7567 CU_FREE(snssai->sD->buf,snssai->sD->size);
7569 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7572 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7573 if(flowMap->list.array)
7575 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7577 if(flowMap->list.array[arrIdx] )
7579 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7580 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7583 CU_FREE(flowMap->list.array,flowMap->list.size);
7586 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7592 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7593 if(drbItem->uLConfiguration)
7595 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7599 /*******************************************************************
7601 * @brief filling the DRB setup Mod item
7605 * Function : FillDrbItemToSetupMod
7607 * Functionality: filling the DRB setup Mod item
7610 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7612 * @return ROK - success
7615 * ****************************************************************/
7617 uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7622 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
7625 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7627 switch(drbItem->qoSInformation.present)
7629 case QoSInformation_PR_NOTHING:
7633 case QoSInformation_PR_eUTRANQoS:
7636 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7637 if(drbItem->qoSInformation.choice.eUTRANQoS)
7639 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7642 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7643 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7644 PriorityLevel_no_priority;
7646 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7647 Pre_emptionCapability_may_trigger_pre_emption;
7649 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7650 Pre_emptionVulnerability_pre_emptable;
7654 case QoSInformation_PR_choice_extension:
7656 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7657 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7659 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7663 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7664 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7665 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7666 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7667 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
7670 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7675 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7676 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1]);
7679 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7683 /*Flows mapped to DRB List*/
7684 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7685 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7686 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7689 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7695 /*ULUPTNLInformation To Be Setup List*/
7696 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
7697 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7700 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7705 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7709 /*******************************************************************
7711 * @brief Builds the DRB to be Setup Mod ItemIes
7715 * Function : FillDrbItemList
7717 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7719 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7721 * @return ROK - success
7724 * ****************************************************************/
7726 uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7728 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7729 drbItemIe->criticality = Criticality_reject;
7730 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7732 if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7734 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7739 /*******************************************************************
7741 * @brief free the DRB to be Setup Mod list
7745 * Function : FreeDrbToBeSetupModList
7747 * Functionality: free the DRB to be Setup Mod list
7749 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7751 * @return ROK - success
7754 * ****************************************************************/
7755 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7758 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7760 if(drbSet->list.array)
7762 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7764 if(drbSet->list.array[arrIdx] != NULLP)
7768 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7769 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7771 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7774 CU_FREE(drbSet->list.array, drbSet->list.size);
7779 /*******************************************************************
7781 * @brief Builds the DRB to be Setup Mod list
7785 * Function : BuildDrbToBeSetupList
7787 * Functionality: Constructs the DRB to be Setup Mod list
7789 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7791 * @return ROK - success
7794 * ****************************************************************/
7796 uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
7802 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7803 drbSet->list.count = drbCnt;
7804 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7805 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7806 if(drbSet->list.array == NULLP)
7808 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7812 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7814 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7815 if(drbSet->list.array[arrIdx] == NULLP)
7817 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7821 ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7824 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7831 /*******************************************************************
7833 * @brief Filling the DRB to be modified item
7837 * Function : FillDrbToBeModItem
7839 * Functionality: filling the DRB to be modified item
7841 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7843 * @return ROK - success
7846 * ****************************************************************/
7848 uint8_t FillDrbToBeModItem(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
7853 drbItem->dRBID = DRB2 + arrIdx;
7856 drbItem->qoSInformation = NULLP;
7857 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7858 if(drbItem->qoSInformation != NULLP)
7860 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7862 switch(drbItem->qoSInformation->present)
7864 case QoSInformation_PR_NOTHING:
7868 case QoSInformation_PR_eUTRANQoS:
7871 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7872 if(drbItem->qoSInformation->choice.eUTRANQoS)
7874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7877 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7878 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7879 PriorityLevel_no_priority;
7881 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7882 Pre_emptionCapability_may_trigger_pre_emption;
7884 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7885 Pre_emptionVulnerability_pre_emptable;
7889 case QoSInformation_PR_choice_extension:
7891 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7892 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7894 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7898 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7899 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7900 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7901 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7902 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
7905 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7910 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7911 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0]);
7914 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7918 /*Flows mapped to DRB List*/
7919 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7920 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7921 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7924 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7931 /*ULUPTNLInformation To Be Setup List*/
7932 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
7933 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7936 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7942 /*******************************************************************
7944 * @brief Builds the DRB to be modified Item IE
7948 * Function : FillDrbToBeModItemList
7950 * Functionality: Constructs the DRB to be modified Mod Item Ies
7952 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7954 * @return ROK - success
7957 * ****************************************************************/
7959 uint8_t FillDrbToBeModItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7961 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7962 drbItemIe->criticality = Criticality_reject;
7963 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7964 if(FillDrbToBeModItem(ueId, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7966 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7973 /*******************************************************************
7975 * @brief Builds the DRB to be modified list
7979 * Function : BuildDrbToBeModList
7981 * Functionality: Constructs the DRB to be modified list
7983 * @params[in] DRBs_ToBeModified_List_t *drbSet
7985 * @return ROK - success
7988 * ****************************************************************/
7990 uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
7996 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
7997 drbSet->list.count = drbCnt;
7998 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
7999 CU_ALLOC(drbSet->list.array, drbSet->list.size);
8000 if(drbSet->list.array == NULLP)
8002 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
8005 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
8007 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8008 if(drbSet->list.array[arrIdx] == NULLP)
8010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
8014 ret = FillDrbToBeModItemList(ueId, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
8017 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
8024 /*******************************************************************
8026 * @brief freeing the DRB item
8030 * Function : FreeModifiedDrbItem
8032 * Functionality: freeing the DRB 2 item
8034 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
8036 * @return ROK - success
8039 * ****************************************************************/
8041 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
8044 SNSSAI_t *snssai =NULLP;
8045 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
8047 if(drbItem->qoSInformation != NULLP)
8049 switch(drbItem->qoSInformation->present)
8051 case QoSInformation_PR_NOTHING:
8053 case QoSInformation_PR_eUTRANQoS:
8055 if(drbItem->qoSInformation->choice.eUTRANQoS)
8057 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
8061 case QoSInformation_PR_choice_extension:
8063 if(drbItem->qoSInformation->choice.choice_extension)
8065 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
8067 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
8070 CU_FREE(snssai->sST.buf,snssai->sST.size);
8076 CU_FREE(snssai->sD->buf,snssai->sD->size);
8078 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
8081 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
8082 if(flowMap->list.array)
8084 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
8086 if(flowMap->list.array[arrIdx] )
8088 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
8089 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
8092 CU_FREE(flowMap->list.array,flowMap->list.size);
8095 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
8101 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
8102 if(drbItem->uLConfiguration)
8104 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
8108 /*******************************************************************
8110 * @brief free the DRB to be modfified list
8114 * Function : FreeDrbToBeModifiedList
8116 * Functionality: free the DRB to be Setup Mod list
8118 * @params[in] FreeDrbToBeModifiedList_t *drbSet
8120 * @return ROK - success
8123 * ****************************************************************/
8124 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
8127 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
8129 if(drbSet->list.array)
8131 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
8133 if(drbSet->list.array[arrIdx] != NULLP)
8135 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
8136 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
8137 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8140 CU_FREE(drbSet->list.array, drbSet->list.size);
8145 /*******************************************************************
8147 * @brief free the UeContextModification Request
8151 * Function : FreeUeContextModicationRequest
8153 * Functionality : deallocation of memory allocated in UeContextModiification
8156 * @params[in] F1AP_PDU_t *f1apMsg
8160 * ****************************************************************/
8161 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
8163 uint8_t arrIdx =0 , ieId=0;
8164 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
8168 if(f1apMsg->choice.initiatingMessage)
8170 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8171 if(UeContextModifyReq->protocolIEs.list.array)
8173 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
8175 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
8177 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
8180 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8182 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8184 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
8186 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8187 choice.DRBs_ToBeSetupMod_List);
8190 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
8192 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8193 choice.DRBs_ToBeSetupMod_List);
8198 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
8201 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
8203 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8205 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8209 /*******************************************************************
8211 * @brief Builds the Ue Context Modification Req
8215 * Function : BuildAndSendUeContextModificationReq
8217 * Functionality: Constructs the Ue Context Modification Req
8221 * @return ROK - success
8224 * ****************************************************************/
8225 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb)
8228 uint8_t elementCnt = 0;
8229 uint8_t ret = RFAILED;
8230 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
8231 F1AP_PDU_t *f1apMsg = NULLP;
8232 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
8234 asn_enc_rval_t encRetVal;
8235 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
8239 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8240 if(f1apMsg == NULLP)
8242 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8246 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8248 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8249 if(f1apMsg->choice.initiatingMessage == NULLP)
8251 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8254 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
8255 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8256 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
8258 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8261 ueContextModifyReq->protocolIEs.list.count = elementCnt;
8262 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
8264 /* Initialize the UE context modification members */
8265 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
8266 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
8268 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8272 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8274 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
8275 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
8277 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8284 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8285 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8286 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8287 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8288 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8291 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8292 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8293 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
8294 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8295 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8297 /* DRB to be setup list */
8299 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
8300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8302 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
8303 ret = BuildDrbToBeSetupList(ueCb->gnbCuUeF1apId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8304 value.choice.DRBs_ToBeSetupMod_List));
8306 /* DRB to be modified list */
8308 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
8309 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8310 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8311 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
8312 ret = BuildDrbToBeModifiedList(ueCb->gnbCuUeF1apId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8313 value.choice.DRBs_ToBeModified_List));
8315 /* TODO: DRB to be release list */
8321 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8323 /* Encode the F1SetupRequest type as APER */
8324 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8326 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
8328 /* Encode results */
8329 if(encRetVal.encoded == ENCODE_FAIL)
8331 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8332 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8337 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8338 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8340 DU_LOG("%x",encBuf[ieIdx]);
8344 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
8345 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
8347 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8355 FreeUeContextModicationRequest(f1apMsg);
8359 /*****************************************************************i
8361 * @brief Free memory allocated for UE Context Release Command
8365 * Function : FreeUeContextReleaseCommand
8368 * - Free memory allocated for UE Context Release Command
8370 * @params[in] F1AP_PDU_t *f1apMsg
8373 * *************************************************************/
8374 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8377 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8381 if(f1apMsg->choice.initiatingMessage)
8383 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8384 if(ueReleaseCommand->protocolIEs.list.array)
8386 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8388 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8390 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8392 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8394 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8397 /*******************************************************************
8399 * @brief Builds the Ue Context Release Command
8403 * Function : BuildAndSendUeContextReleaseCommand
8405 * Functionality: Constructs the Ue Context Release Command
8409 * @return ROK - success
8412 * ****************************************************************/
8413 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
8415 bool memAllocFailed = false;
8416 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8417 F1AP_PDU_t *f1apMsg = NULLP;
8418 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8420 asn_enc_rval_t encRetVal;
8421 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8425 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8426 if(f1apMsg == NULLP)
8428 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8432 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8434 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8435 if(f1apMsg->choice.initiatingMessage == NULLP)
8437 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8440 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8441 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8442 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8444 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8447 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8448 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8450 /* Initialize the UE context modification members */
8451 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8452 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8454 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8458 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8460 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8461 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8463 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8464 memAllocFailed = true;
8469 if(memAllocFailed == true)
8474 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8475 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8476 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8477 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8478 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8481 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8482 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8483 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8484 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8485 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8488 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8489 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8490 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8491 UEContextReleaseCommandIEs__value_PR_Cause;
8492 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8493 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8494 CauseRadioNetwork_normal_release;
8496 /* RRC Container for RRC release */
8498 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8499 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8500 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8501 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8502 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8504 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8505 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8506 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8507 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8509 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8512 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8513 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8515 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8517 /* Encode the UE Context Release Command type as APER */
8518 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8520 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8523 /* Encode results */
8524 if(encRetVal.encoded == ENCODE_FAIL)
8526 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8527 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8532 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8533 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8535 DU_LOG("%x",encBuf[ieIdx]);
8539 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
8540 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
8542 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8550 FreeUeContextReleaseCommand(f1apMsg);
8553 /*******************************************************************
8555 * @brief process Ue context release request
8559 * Function : procUeContextReleaseReq
8562 * - process Ue context release request
8564 * @params[in] F1AP_PDU_t *f1apMsg
8565 * @return ROK - success
8568 * ****************************************************************/
8569 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
8571 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8573 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8574 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8576 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8578 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8580 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8582 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8585 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8587 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8595 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
8597 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8602 /*******************************************************************
8604 * @brief processing of Gnb-DU config update
8608 * Function : procGnbDuUpdate
8611 * - processing of Gnb-DU config update
8613 * @params[in] F1AP_PDU_t *f1apMsg
8614 * @return ROK - success
8617 * ****************************************************************/
8618 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
8620 bool cellToBeDelete = false;
8621 uint8_t ieIdx = 0, ueIdx = 0;
8625 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8627 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8628 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8630 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8632 case ProtocolIE_ID_id_TransactionID:
8634 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8636 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8638 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
8639 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
8640 Served_Cells_To_Delete_List.list.array[0];
8641 cellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\
8642 deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused;
8643 cellToBeDelete = true;
8646 case ProtocolIE_ID_id_gNB_DU_ID:
8650 if(BuildAndSendDUUpdateAck(duId) != ROK)
8652 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8656 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
8657 * commented this trigger for now */
8659 if(cellToBeDelete == false)
8661 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8662 if(BuildAndSendF1ResetReq() != ROK)
8664 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8669 if(cellToBeDelete == true)
8671 duDb = getDuDb(duId);
8672 cellCb = getCellCb(duDb, cellId);
8673 for(ueIdx = 0; ueIdx < cellCb->numUe; ueIdx++)
8675 CU_FREE(cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.buf, cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.size);
8676 memset(cellCb->ueCb[ueIdx], 0, sizeof(CuUeCb));
8683 /*******************************************************************
8685 * @brief storing slice list in CU database
8689 * Function : buildSliceList
8692 * - storing slice list in CU database
8694 * @params[in] SliceSupportList_t *sliceSupportList
8695 * @return ROK - success
8698 * ****************************************************************/
8699 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8701 uint8_t sliceListIdx = 0;
8703 if(sliceSupportList)
8705 if(sliceSupportList->list.array)
8707 cuCb.numSnssaiSupported = sliceSupportList->list.count;
8708 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8710 if(sliceSupportList->list.array[sliceListIdx])
8712 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
8713 if(cuCb.snssaiList[sliceListIdx] == NULLP)
8715 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8718 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8720 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8721 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8723 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8725 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
8726 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8727 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8736 /****************************************************************
8737 * @brief Function to process Drb Setup Mod List
8741 * Function : procDrbSetupModList
8744 * - Function to process DRB Setup Mod List
8747 * @return ROK - success
8750 * ****************************************************************/
8751 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8755 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8757 if(drbSetupList != NULLP)
8759 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8761 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8762 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8764 /* extracting teId */
8765 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8768 if(addDrbTunnels(teId)== ROK)
8770 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8781 /*******************************************************************
8783 * @brief processing of GNB_DU_Served_Cells Plmn list information
8787 * Function : procServedCellPlmnList
8790 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8793 * @params[in] F1AP_PDU_t *f1apMsg
8794 * @return ROK - success
8797 * ****************************************************************/
8798 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8800 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8801 ProtocolExtensionContainer_4624P3_t **ieExtend;
8803 if(srvPlmn->list.array)
8805 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8807 if(srvPlmn->list.array[srvPlmnIdx])
8809 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8812 if((*ieExtend)->list.array)
8814 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8816 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8818 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8820 case ProtocolIE_ID_id_TAISliceSupportList:
8822 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8823 extensionValue.choice.SliceSupportList) != ROK)
8825 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8840 /****************************************************************
8841 * @brief Function to process Ue Context Modification Response
8845 * Function : procUeContextModificationResponse
8848 * - Function to process Ue Context Modification Response
8851 * @return ROK - success
8854 * ****************************************************************/
8855 uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
8857 uint8_t idx, duUeF1apId;
8858 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8859 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8861 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8863 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8865 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8867 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8870 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8872 /* Adding Tunnels for successful DRB */
8873 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8882 /*******************************************************************
8884 * @brief processing of F1 setup request
8888 * Function : procF1SetupReq
8891 * - processing of F1 setup request
8893 * @params[in] F1AP_PDU_t *f1apMsg
8894 * @return ROK - success
8897 * ****************************************************************/
8898 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
8900 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
8901 uint32_t duId, cellId;
8903 CuCellCb *cellCb = NULLP;
8904 BIT_STRING_t nrcellIdentity;
8905 F1SetupRequest_t *f1SetupReq = NULLP;
8906 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8907 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8909 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8910 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8912 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8914 case ProtocolIE_ID_id_gNB_DU_ID:
8916 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
8917 duDb = getDuDb(duId);
8920 duDb = &cuCb.duInfo[cuCb.numDu];
8921 memset(duDb, 0, sizeof(DuDb));
8930 case ProtocolIE_ID_id_gNB_DU_Name:
8932 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
8935 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8937 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8938 if(duServedCell->list.array)
8940 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8942 if(duServedCell->list.array[plmnidx])
8944 switch(duServedCell->list.array[plmnidx]->id)
8946 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8948 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8949 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8950 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
8952 cellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused;
8953 cellCb = getCellCb(duDb, cellId);
8956 cellCb = &duDb->cellCb[duDb->numCells];
8957 memset(cellCb, 0, sizeof(CuCellCb));
8958 cellCb->nrCellId = cellId;
8971 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
8975 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
8979 /*******************************************************************
8981 * @brief Handles received F1AP message and sends back response
8985 * Function : F1APMsgHdlr
8988 * - Decodes received F1AP control message
8989 * - Prepares response message, encodes and sends to SCTP
8992 * @return ROK - success
8995 * ****************************************************************/
8996 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
9002 F1AP_PDU_t *f1apMsg = NULLP;
9003 asn_dec_rval_t rval; /* Decoder return value */
9004 F1AP_PDU_t f1apasnmsg ;
9006 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
9007 ODU_PRINT_MSG(mBuf, 0,0);
9009 /* Copy mBuf into char array to decode it */
9010 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
9011 CU_ALLOC(recvBuf, (Size)recvBufLen);
9013 if(recvBuf == NULLP)
9015 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
9018 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
9020 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
9024 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
9025 for(i=0; i< recvBufLen; i++)
9027 DU_LOG("%x",recvBuf[i]);
9030 /* Decoding flat buffer into F1AP messsage */
9031 f1apMsg = &f1apasnmsg;
9032 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
9034 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
9035 CU_FREE(recvBuf, (Size)recvBufLen);
9037 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9039 DU_LOG("\nERROR --> F1AP : ASN decode failed");
9043 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9045 switch(f1apMsg->present)
9047 case F1AP_PDU_PR_initiatingMessage:
9049 switch(f1apMsg->choice.initiatingMessage->value.present)
9051 case InitiatingMessage__value_PR_Reset:
9053 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
9054 BuildAndSendF1ResetAck();
9058 case InitiatingMessage__value_PR_F1SetupRequest:
9060 DU_LOG("\nINFO --> F1AP : F1 setup request received");
9061 procF1SetupReq(duId, f1apMsg);
9065 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
9067 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
9068 procGnbDuUpdate(*duId, f1apMsg);
9071 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
9073 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
9074 procInitULRRCMsg(*duId, f1apMsg);
9077 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
9079 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
9080 procUlRrcMsg(*duId, f1apMsg);
9084 case InitiatingMessage__value_PR_RRCDeliveryReport:
9086 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
9089 case InitiatingMessage__value_PR_UEContextReleaseRequest:
9091 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
9092 procUeContextReleaseReq(*duId, f1apMsg);
9097 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
9098 f1apMsg->choice.initiatingMessage->value.present);
9101 }/* End of switch(initiatingMessage) */
9105 case F1AP_PDU_PR_successfulOutcome:
9107 switch(f1apMsg->choice.successfulOutcome->value.present)
9109 case SuccessfulOutcome__value_PR_ResetAcknowledge:
9111 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
9114 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
9116 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
9117 procUeContextSetupResponse(*duId, f1apMsg);
9120 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
9122 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
9123 procUeContextModificationResponse(f1apMsg);
9126 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
9128 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
9133 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
9134 f1apMsg->choice.successfulOutcome->value.present);
9137 }/* End of switch(successfulOutcome) */
9142 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
9145 }/* End of switch(f1apMsg->present) */
9147 } /* End of F1APMsgHdlr */
9149 /**********************************************************************
9151 **********************************************************************/