1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
29 #include "ProtocolIE-SingleContainer.h"
31 #include "ModulationOrder.h"
33 #include "UE-CapabilityRAT-Container.h"
34 #include "UE-CapabilityRAT-ContainerList.h"
35 #include "UE-CapabilityRAT-ContainerListRRC.h"
36 #include "SupportedBandwidth.h"
37 #include "FeatureSetUplinkPerCC.h"
38 #include "FeatureSetDownlinkPerCC.h"
39 #include "FeatureSets.h"
40 #include "RF-Parameters.h"
41 #include "UE-NR-Capability.h"
42 #include "ProtocolExtensionContainer.h"
43 #include "CellGroupConfigRrc.h"
44 #include "MAC-CellGroupConfig.h"
45 #include "SchedulingRequestConfig.h"
46 #include "SchedulingRequestToAddMod.h"
47 #include "BSR-Config.h"
48 #include "TAG-Config.h"
50 #include "PHR-Config.h"
51 #include "RLC-Config.h"
52 #include "UL-AM-RLC.h"
53 #include "DL-AM-RLC.h"
54 #include "LogicalChannelConfig.h"
55 #include "RLC-BearerConfig.h"
56 #include "PhysicalCellGroupConfig.h"
57 #include "SpCellConfig.h"
58 #include "ServingCellConfig.h"
59 #include "ControlResourceSet.h"
60 #include "SearchSpace.h"
61 #include "PDCCH-Config.h"
62 #include "PDSCH-TimeDomainResourceAllocation.h"
63 #include "PDSCH-TimeDomainResourceAllocationList.h"
64 #include "DMRS-DownlinkConfig.h"
65 #include "PDSCH-Config.h"
66 #include "BWP-DownlinkDedicated.h"
67 #include "PUSCH-TimeDomainResourceAllocation.h"
68 #include "PUSCH-TimeDomainResourceAllocationList.h"
69 #include "DMRS-UplinkConfig.h"
70 #include "PUSCH-Config.h"
71 #include "SRS-ResourceId.h"
72 #include "SRS-Resource.h"
73 #include "SRS-ResourceSet.h"
74 #include "SRS-Config.h"
75 #include "BWP-UplinkDedicated.h"
76 #include "PUSCH-ServingCellConfig.h"
77 #include "UplinkConfig.h"
78 #include "PDSCH-ServingCellConfig.h"
79 #include "EUTRANQoS.h"
80 #include "GBR-QosInformation.h"
81 #include "DRBs-ToBeSetupMod-List.h"
82 #include "DRBs-ToBeSetupMod-Item.h"
84 /* MACRO for CUtoDURRCInformation */
86 #define FREQ_DOM_RSRC_SIZE 6
87 #define CORESET0_END_PRB 48
88 #define CORESET1_NUM_PRB 24
89 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
90 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
91 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
92 #define PDCCH_SRCH_SPC_TWO_ID 2
94 #define SCRAMBLING_ID NR_PCI
95 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
96 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
97 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
98 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
99 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
100 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
101 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
102 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
103 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
105 /* MACRO Ddefine for PDSCH Configuration */
107 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
108 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
109 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
110 #define PDSCH_NUM_HARQ_PROC 5
111 #define PDSCH_MAPPING_TYPE_A 0
112 #define PDSCH_MAPPING_TYPE_B 1
114 /* MACRO Define for PUSCH Configuration */
117 #define PUSCH_MSG3_DELTA_PREAMBLE 0
118 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
119 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
120 #define PUSCH_MAX_MIMO_LAYERS 1
121 #define PUSCH_PROCESS_TYPE2_ENABLED false
122 #define PUSCH_MAPPING_TYPE_A 0
123 #define PUSCH_MAPPING_TYPE_B 1
125 /* MACRO defines for SRC config */
126 #define SRS_RSRC_ID 1
127 #define SRS_RSET_ID 1
128 #define SRS_COMB_OFFSET_N2 0
129 #define SRS_CYCLIC_SHIFT_N2 0
130 #define SRS_FREQ_DOM_POS 0
131 #define SRS_FREQ_DOM_SHIFT 0
136 #define APERIODIC_SRS_RESRC_TRIGGER 1
138 /* Macro definitions for DUtoCuRrcContainer */
139 #define CELL_GRP_ID 1
141 #define SR_PROHIBIT_TMR 5
142 #define SR_TRANS_MAX 2
143 #define PERIODIC_BSR_TMR 2
144 #define RETX_BSR_TMR 5
145 #define SR_DELAY_TMR 6
147 #define TIME_ALIGNMENT_TMR 7
148 #define PHR_PERIODIC_TMR 7
149 #define PHR_PROHIBHIT_TMR 0
150 #define PHR_PWR_FACTOR_CHANGE 3
151 #define PHR_MODE_OTHER_CG 0
154 #define SN_FIELD_LEN 0
155 #define T_POLL_RETRANSMIT 8
158 #define MAX_RETX_THRESHOLD 5
159 #define T_REASSEMBLY 8
160 #define T_STATUS_PROHIBHIT 7
161 #define MAC_LC_PRIORITY 1
162 #define PRIORTISIED_BIT_RATE 15
163 #define BUCKET_SIZE_DURATION 5
166 #define PDSCH_HARQ_ACK_CODEBOOK 1
167 #define SERV_CELL_IDX 0
168 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
169 #define ACTIVE_DL_BWP_ID 0
170 #define ACTIVE_UL_BWP_ID 0
171 #define SCRAMBLING_ID NR_PCI
172 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
173 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
174 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
175 /*******************************************************************
177 * @brief Sends F1 msg over SCTP
181 * Function : SendF1APMsg
183 * Functionality: Sends F1 msg over SCTP
185 * @params[in] Region region
187 * @return ROK - success
190 * ****************************************************************/
191 S16 SendF1APMsg(Region region, Pool pool)
193 Buffer *mBuf = NULLP;
195 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
197 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
199 ODU_PRINT_MSG(mBuf, 0,0);
201 if(sctpSend(mBuf) != ROK)
203 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
204 ODU_PUT_MSG_BUF(mBuf);
210 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
211 ODU_PUT_MSG_BUF(mBuf);
214 ODU_PUT_MSG_BUF(mBuf);
218 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
225 /*******************************************************************
227 * @brief Builds NRCell ID
231 * Function : BuildNrCellId
233 * Functionality: Building the NR Cell ID
235 * @params[in] BIT_STRING_t *nrcell
236 * @return ROK - success
239 * ****************************************************************/
241 S16 BuildNrCellId(BIT_STRING_t *nrcell)
243 memset(nrcell->buf, 0, nrcell->size);
245 nrcell->bits_unused = 4;
246 nrcell->size = 5 * sizeof(uint8_t);
250 /********************************************************************
252 * @brief Builds and sends the F1SetupResponse
256 * Function : BuildAndSendF1SetupRsp
258 * Functionality: Constructs the F1SetupResponse message and sends
259 * it back to the DU through SCTP.
261 * @params[in] void **buf,Buffer to which encoded pattern is written into
262 * @params[in] int *size,size of buffer
264 * @return ROK - success
267 * ****************************************************************/
268 S16 BuildAndSendF1SetupRsp()
271 uint8_t elementCnt,cellCnt;
272 F1AP_PDU_t *f1apMsg = NULL;
273 F1SetupResponse_t *f1SetupRsp;
274 GNB_CU_Name_t *cuName;
275 Cells_to_be_Activated_List_t *cellToActivate;
276 RRC_Version_t *rrcVer;
277 asn_enc_rval_t encRetVal;
278 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
280 /* Allocate the memory for F1SetupRequest_t */
281 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
284 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
287 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
289 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
290 if(f1apMsg->choice.successfulOutcome == NULLP)
292 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
293 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
297 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
298 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
299 f1apMsg->choice.successfulOutcome->value.present = \
300 SuccessfulOutcome__value_PR_F1SetupResponse;
301 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
304 f1SetupRsp->protocolIEs.list.count = elementCnt;
305 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
307 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
308 elementCnt * sizeof(F1SetupResponseIEs_t *));
309 if(f1SetupRsp->protocolIEs.list.array == NULLP)
311 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
312 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
313 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
317 for(idx=0; idx<elementCnt; idx++)
319 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
320 sizeof(F1SetupResponseIEs_t));
321 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
323 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
324 elementCnt * sizeof(F1SetupResponseIEs_t *));
325 CU_FREE(f1apMsg->choice.successfulOutcome, \
326 sizeof(SuccessfulOutcome_t));
327 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
334 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
335 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
336 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
337 F1SetupResponseIEs__value_PR_TransactionID;
338 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
343 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
344 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
345 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
346 F1SetupResponseIEs__value_PR_GNB_CU_Name;
347 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
348 cuName->size = sizeof(cuCfgParams.cuName);
350 CU_ALLOC(cuName->buf, sizeof(cuName->size));
351 if(cuName->buf == NULLP)
353 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
355 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
356 sizeof(F1SetupResponseIEs_t));
358 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
359 elementCnt * sizeof(F1SetupResponseIEs_t *));
360 CU_FREE(f1apMsg->choice.successfulOutcome,\
361 sizeof(SuccessfulOutcome_t));
362 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
365 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
367 /*Cells to be activated list*/
369 f1SetupRsp->protocolIEs.list.array[idx]->id = \
370 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
371 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
372 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
373 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
374 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
375 Cells_to_be_Activated_List;
377 cellToActivate->list.count = cellCnt;
378 cellToActivate->list.size = \
379 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
380 CU_ALLOC(cellToActivate->list.array,\
381 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
382 if(cellToActivate->list.array == NULLP)
384 CU_FREE(cuName->buf, sizeof(cuName->size));
385 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
387 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
388 sizeof(F1SetupResponseIEs_t));
390 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
391 elementCnt * sizeof(F1SetupResponseIEs_t *));
392 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
393 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
396 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
398 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
399 if(cellToActivate->list.array[ieIdx] == NULLP)
401 CU_FREE(cellToActivate->list.array,\
402 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
403 CU_FREE(cuName->buf, sizeof(cuName->size));
404 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
406 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
407 sizeof(F1SetupResponseIEs_t));
409 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
410 elementCnt * sizeof(F1SetupResponseIEs_t *));
411 CU_FREE(f1apMsg->choice.successfulOutcome, \
412 sizeof(SuccessfulOutcome_t));
413 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
417 cellToActivate->list.array[0]->id = \
418 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
419 cellToActivate->list.array[0]->criticality = Criticality_ignore;
420 cellToActivate->list.array[0]->value.present = \
421 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
422 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
423 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
424 CU_ALLOC(cellToActivate->list.array[0]->\
425 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
427 if(cellToActivate->list.array[0]->value.choice.\
428 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
431 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
433 CU_FREE(cellToActivate->list.array[ieIdx],\
434 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
437 CU_FREE(cellToActivate->list.array,\
438 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
439 CU_FREE(cuName->buf, sizeof(cuName->size));
440 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
442 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
443 sizeof(F1SetupResponseIEs_t));
445 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
446 elementCnt * sizeof(F1SetupResponseIEs_t *));
447 CU_FREE(f1apMsg->choice.successfulOutcome, \
448 sizeof(SuccessfulOutcome_t));
449 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
452 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
453 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
454 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
455 nRCGI.nRCellIdentity.size = 5;
456 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
457 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
459 if(cellToActivate->list.array[0]->value.choice.\
460 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
462 CU_FREE(cellToActivate->list.array[0]->\
463 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
465 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
467 CU_FREE(cellToActivate->list.array[ieIdx],\
468 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
471 CU_FREE(cellToActivate->list.array,\
472 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
473 CU_FREE(cuName->buf, sizeof(cuName->size));
474 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
476 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
477 sizeof(F1SetupResponseIEs_t));
479 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
480 elementCnt * sizeof(F1SetupResponseIEs_t *));
481 CU_FREE(f1apMsg->choice.successfulOutcome, \
482 sizeof(SuccessfulOutcome_t));
483 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
486 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
489 f1SetupRsp->protocolIEs.list.array[idx]->id = \
490 ProtocolIE_ID_id_GNB_CU_RRC_Version;
491 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
492 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
493 F1SetupResponseIEs__value_PR_RRC_Version;
494 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
495 rrcVer->latest_RRC_Version.size = RRC_SIZE;
497 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
498 if(rrcVer->latest_RRC_Version.buf == NULLP)
500 CU_FREE(cuName->buf, sizeof(cuName->size));
501 for(ieIdx=0; ieIdx<elementCnt; idx++)
503 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
504 sizeof(F1SetupResponseIEs_t));
506 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
507 elementCnt * sizeof(F1SetupResponseIEs_t *));
508 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
509 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
513 /* Need to check RRC Version */
514 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
515 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
516 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
517 if(rrcVer->iE_Extensions == NULLP)
519 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
520 CU_FREE(cuName->buf, sizeof(cuName->size));
521 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
523 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
524 sizeof(F1SetupResponseIEs_t));
526 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
527 elementCnt * sizeof(F1SetupResponseIEs_t *));
528 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
529 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
532 rrcVer->iE_Extensions->list.count = 1;
533 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
534 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
535 sizeof(struct RRC_Version_ExtIEs *));
536 if(rrcVer->iE_Extensions->list.array == NULLP)
538 CU_FREE(rrcVer->iE_Extensions,\
539 sizeof(ProtocolExtensionContainer_4624P81_t));
540 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
541 CU_FREE(cuName->buf, sizeof(cuName->size));
542 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
544 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
545 sizeof(F1SetupResponseIEs_t));
547 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
548 elementCnt * sizeof(F1SetupResponseIEs_t *));
549 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
550 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
553 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
554 sizeof(struct RRC_Version_ExtIEs));
555 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
557 CU_FREE(rrcVer->iE_Extensions->list.array,\
558 sizeof(struct RRC_Version_ExtIEs *));
559 CU_FREE(rrcVer->iE_Extensions,\
560 sizeof(ProtocolExtensionContainer_4624P81_t));
561 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
562 CU_FREE(cuName->buf, sizeof(cuName->size));
563 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
565 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
566 sizeof(F1SetupResponseIEs_t));
568 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
569 elementCnt * sizeof(F1SetupResponseIEs_t *));
570 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
571 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
574 rrcVer->iE_Extensions->list.array[0]->id = \
575 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
576 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
577 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
578 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
579 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
580 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
581 CU_ALLOC(rrcVer->iE_Extensions->list.\
582 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
584 if(rrcVer->iE_Extensions->list.\
585 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
587 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
588 sizeof(struct RRC_Version_ExtIEs));
589 CU_FREE(rrcVer->iE_Extensions->list.array,\
590 sizeof(struct RRC_Version_ExtIEs *));
591 CU_FREE(rrcVer->iE_Extensions,\
592 sizeof(ProtocolExtensionContainer_4624P81_t));
593 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
594 CU_FREE(cuName->buf, sizeof(cuName->size));
595 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
597 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
598 sizeof(F1SetupResponseIEs_t));
600 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
601 elementCnt * sizeof(F1SetupResponseIEs_t *));
602 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
603 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
606 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
607 Latest_RRC_Version_Enhanced.buf[0] = 0;
608 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
609 Latest_RRC_Version_Enhanced.buf[1] = 5;
610 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
611 Latest_RRC_Version_Enhanced.buf[2] = 15;
613 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
615 /* Encode the F1SetupRequest type as UPER */
616 memset(encBuf, 0, ENC_BUF_MAX_LEN);
618 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
621 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
622 CU_FREE(cuName->buf, sizeof(cuName->size));
623 for(idx=0; idx<elementCnt; idx++)
625 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
627 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
628 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
629 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
631 /* Check encode results */
632 if(encRetVal.encoded == ENCODE_FAIL)
634 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
635 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
640 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
641 for(int i=0; i< encBufSize; i++)
643 DU_LOG("%x",encBuf[i]);
648 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
650 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
655 }/* End of BuildAndSendF1SetupRsp */
657 /*******************************************************************
659 * @brief Builds and sends the DUUpdateAcknowledge
663 * Function : BuildAndSendDUUpdateAck
665 * Functionality: Constructs the DU Update Acknowledge message and sends
666 * it to the DU through SCTP.
668 * @params[in] void **buf,Buffer to which encoded pattern is written into
669 * @params[in] int *size,size of buffer
671 * @return ROK - success
674 * ****************************************************************/
676 S16 BuildAndSendDUUpdateAck()
680 F1AP_PDU_t *f1apMsg = NULL;
681 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
682 asn_enc_rval_t enRetVal; /* Encoder return value */
684 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
686 /* Allocate the memory for F1SetupRequest_t */
687 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
690 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
694 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
696 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
697 if(f1apMsg->choice.successfulOutcome == NULLP)
699 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
700 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
704 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
705 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
706 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
707 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
710 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
711 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
713 /* Initialize the F1Setup members */
714 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
715 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
717 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
718 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
719 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
723 for(idx=0; idx<elementCnt; idx++)
725 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
726 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
728 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
729 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
730 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
737 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
738 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
739 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
740 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
742 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
744 /* Encode the F1SetupRequest type as UPER */
745 memset(encBuf, 0, ENC_BUF_MAX_LEN);
747 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
750 for(idx=0; idx<elementCnt; idx++)
752 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
754 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
755 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
756 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
758 /* Checking encode results */
759 if(enRetVal.encoded == ENCODE_FAIL)
761 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
766 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
767 for(int i=0; i< encBufSize; i++)
769 DU_LOG("%x",encBuf[i]);
774 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
776 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
782 }/* End of BuildAndSendDUUpdateAck*/
783 /*******************************************************************
785 * @brief deallocating the memory of F1reset msg
789 * Function : FreeF1ResetReq
792 * - freeing memory of F1reset request msg
798 * ****************************************************************/
799 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
802 Reset_t *f1ResetMsg = NULLP;
806 if(f1apMsg->choice.initiatingMessage)
808 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
809 if(f1ResetMsg->protocolIEs.list.array)
811 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
813 if(f1ResetMsg->protocolIEs.list.array[idx])
815 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
818 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
820 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
822 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
825 /*******************************************************************
827 * @brief build ansld ans send f1reset msg
831 * Function : BuildAndSendF1ResetReq
833 * Functionality: build and send f1reset msg
835 * @return ROK - success
838 * ****************************************************************/
839 uint8_t BuildAndSendF1ResetReq()
841 uint8_t elementCnt=0;
843 uint8_t ret= RFAILED;
844 Reset_t *f1ResetMsg = NULLP;
845 F1AP_PDU_t *f1apMsg = NULLP;
846 asn_enc_rval_t encRetVal;
847 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
850 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
853 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
856 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
857 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
858 if(f1apMsg->choice.initiatingMessage == NULLP)
860 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
863 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
864 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
865 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
867 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
870 f1ResetMsg->protocolIEs.list.count = elementCnt;
871 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
873 /* Initialize the F1Reset members */
874 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
875 if(f1ResetMsg->protocolIEs.list.array == NULLP)
877 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
880 for(idx=0; idx<elementCnt; idx++)
882 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
883 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
885 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
892 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
893 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
894 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
895 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
899 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
900 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
901 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
902 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
903 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
907 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
908 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
909 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
910 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
911 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
913 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
915 /* Encode the F1SetupRequest type as APER */
916 memset(encBuf, 0, ENC_BUF_MAX_LEN);
918 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
922 if(encRetVal.encoded == ENCODE_FAIL)
924 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
925 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
930 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
931 for(idx=0; idx< encBufSize; idx++)
933 DU_LOG("%x",encBuf[idx]);
937 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
939 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
947 FreeF1ResetReq(f1apMsg);
951 /*******************************************************************
953 * @brief Fills Radio Bearer Config
957 * Function : fillSrbCfg
959 * Functionality: Fills Radio Bearer Config
961 * @params[in] SRB_ToAddModList *
963 * @return ROK - success
966 * ****************************************************************/
967 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
971 if(bearerCfg != NULLP)
974 bearerCfg->list.count = elementCnt;
975 bearerCfg->list.size =\
976 elementCnt * sizeof(SRB_ToAddMod_t *);
977 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
978 if(bearerCfg->list.array != NULLP)
980 for(idx = 0; idx < elementCnt; idx++)
982 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
983 if(bearerCfg->list.array[idx] == NULLP)
985 for(ieId = 0; ieId < idx; ieId++)
987 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
989 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
999 bearerCfg->list.array[idx]->srb_Identity = srbId;
1004 /*******************************************************************
1006 * @brief Fills Master CellGroup Info
1010 * Function : fillMasterCellGroup
1012 * Functionality: Fills Master Cell Group IE
1014 * @params[in] RRCSetup_IEs_t *
1016 * @return ROK - success
1019 * ****************************************************************/
1021 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1024 masterCellGroup->buf = NULLP;
1025 if(f1apMsgDb.duToCuContainer.buf)
1027 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1028 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1029 if(masterCellGroup->buf != NULLP)
1031 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1032 masterCellGroup->size);
1046 /*******************************************************************
1048 * @brief Fills RRC setup IE
1052 * Function : fillRRCSetupIE
1054 * Functionality: Fills RRC Setup IE
1056 * @params[in] RRCSetup_IEs_t *
1058 * @return ROK - success
1061 * ****************************************************************/
1063 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1068 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1069 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1071 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1075 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1079 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1085 /*******************************************************************
1087 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1091 * Function : fillDlCcchRrcMsg
1093 * Functionality: Fills DL DCCCH Message required for
1094 * DLRRCMessageTransfer
1096 * @params[in] RRCContainer_t *rrcContainer
1098 * @return ROK - success
1101 * ****************************************************************/
1103 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1107 DL_CCCH_Message_t dl_CCCH_Msg;
1108 asn_enc_rval_t encRetVal;
1110 if(rrcContainer != NULLP)
1112 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1114 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1115 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1117 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1118 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1119 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1121 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1122 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1123 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1124 /* Fill RRC Setup IE */
1125 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1126 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1127 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1128 criticalExtensions.choice.rrcSetup != NULLP)
1130 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1131 criticalExtensions.choice.rrcSetup);
1135 /* encode DL-CCCH message into RRC Container */
1136 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1137 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1139 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1140 /* Encode results */
1141 if(encRetVal.encoded == ENCODE_FAIL)
1143 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1144 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1149 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1150 for(int i = 0; i< encBufSize; i++)
1152 DU_LOG("%x",encBuf[i]);
1154 rrcContainer->size = encBufSize;
1155 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1156 if(rrcContainer->buf != NULLP)
1158 memset(rrcContainer->buf, 0, encBufSize);
1159 for(idx2 = 0; idx2 < encBufSize; idx2++)
1161 rrcContainer->buf[idx2] = encBuf[idx2];
1173 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1179 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1185 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1191 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1196 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1198 uint8_t idx, ied, elementCnt;
1201 qosFlow->list.count = elementCnt;
1202 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1203 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1204 if(qosFlow->list.array != NULLP)
1206 for(idx = 0; idx < elementCnt; idx++)
1208 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1209 if(qosFlow->list.array[idx] == NULLP)
1211 for(ied = 0; ied < idx; ied++)
1213 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1215 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1221 *qosFlow->list.array[idx] = 9;
1225 /*******************************************************************
1227 * @brief Fills CN Assoc for Drb to Add/Mod List
1231 * Function : fillCnAssoc
1233 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1235 * @params[in] struct DRB_ToAddMod__cnAssociation *
1237 * @return ROK - success
1240 * ****************************************************************/
1242 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1246 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1247 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1249 cnAssoc->choice.eps_BearerIdentity = 5;
1251 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1253 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1254 if(cnAssoc->choice.sdap_Config)
1256 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1257 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1258 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1259 cnAssoc->choice.sdap_Config->defaultDRB = true;
1260 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1261 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1262 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1263 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1264 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1266 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1270 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1271 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1277 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1284 /*******************************************************************
1286 * @brief Fills Radio Bearer Config for Drb
1290 * Function : fillDrbCfg
1292 * Functionality: Fills Radio Bearer Config for Drb
1294 * @params[in] drbId, DRB_ToAddModList *
1296 * @return ROK - success
1299 * ****************************************************************/
1300 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1302 uint8_t idx, ied, ret, elementCnt;
1308 drbCfg->list.count = elementCnt;
1309 drbCfg->list.size =\
1310 elementCnt * sizeof(DRB_ToAddMod_t *);
1311 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1312 if(drbCfg->list.array != NULLP)
1314 for(idx = 0; idx < elementCnt; idx++)
1316 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1317 if(drbCfg->list.array[idx] == NULLP)
1319 for(ied = 0; ied < idx; ied++)
1321 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1323 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1333 /* CN ASSOCIATION */
1334 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1335 if(drbCfg->list.array[idx]->cnAssociation)
1337 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1340 drbCfg->list.array[idx]->drb_Identity = drbId;
1345 /*******************************************************************
1347 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1351 * Function : fillRrcReconfigIE
1353 * Functionality: Fills RRC Reconfig Message required for
1354 * DLRRCMessageTransfer
1356 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1358 * @return ROK - success
1361 * ****************************************************************/
1363 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1366 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1367 if(rrcReconfigMsg->radioBearerConfig)
1369 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1370 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1372 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1377 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1378 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1380 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1383 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1384 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1385 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1391 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1392 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1398 /*******************************************************************
1400 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1404 * Function : fillDlDcchRrcMsg
1406 * Functionality: Fills DL DCCH Message required for
1407 * DLRRCMessageTransfer
1409 * @params[in] RRCContainer_t *rrcContainer
1411 * @return ROK - success
1414 * ****************************************************************/
1416 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1420 DL_DCCH_Message_t dl_DCCH_Msg;
1421 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1422 asn_enc_rval_t encRetVal;
1424 if(rrcContainer != NULLP)
1426 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1428 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1429 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1431 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1432 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1433 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1435 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1436 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1437 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1438 /* Fill RRC Reconfig IE */
1439 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1440 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1441 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1442 criticalExtensions.choice.rrcReconfiguration != NULLP)
1444 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1445 criticalExtensions.choice.rrcReconfiguration);
1449 /* encode DL-DCCH message into RRC Container */
1450 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1451 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1453 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1454 /* Encode results */
1455 if(encRetVal.encoded == ENCODE_FAIL)
1457 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1458 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1463 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1464 for(int i = 0; i< encBufSize; i++)
1466 DU_LOG("%x",encBuf[i]);
1468 rrcContainer->size = encBufSize;
1469 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1470 if(rrcContainer->buf != NULLP)
1472 memset(rrcContainer->buf, 0, encBufSize);
1473 for(idx2 = 0; idx2 < encBufSize; idx2++)
1475 rrcContainer->buf[idx2] = encBuf[idx2];
1482 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1487 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1493 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1499 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1505 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1511 /*******************************************************************
1513 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1517 * Function : BuildDLRRCContainer
1519 * Functionality: Builds RRC Container IE required for
1520 * DLRRCMessageTransfer
1524 * @return ROK - success
1527 * ****************************************************************/
1529 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1531 uint8_t ret, bufLen;
1534 if(rrcMsgType == RRC_SETUP)
1536 ret = fillDlCcchRrcMsg(rrcContainer);
1538 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1540 else if(rrcMsgType == REGISTRATION_ACCEPT)
1542 /*Hardcoded RRC Container from reference logs*/
1543 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1545 rrcContainer->size = bufLen;
1546 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1547 if(rrcContainer->buf != NULLP)
1549 memset(rrcContainer->buf, 0, bufLen);
1550 memcpy(rrcContainer->buf, buf, bufLen);
1553 else if(rrcMsgType == RRC_RECONFIG)
1555 /*Hardcoded RRC Container from reference logs*/
1557 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1558 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1559 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1560 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1561 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1562 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1563 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1564 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1565 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1566 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1567 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1568 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1569 0x00, 0x00, 0x00, 0x00};
1571 rrcContainer->size = bufLen;
1572 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1573 if(rrcContainer->buf != NULLP)
1575 memset(rrcContainer->buf, 0, bufLen);
1576 memcpy(rrcContainer->buf, buf, bufLen);
1583 /*******************************************************************
1585 * @brief Builds and sends the DLRRCMessageTransfer
1589 * Function : BuildAndSendDLRRCMessageTransfer
1591 * Functionality: Constructs the DL RRC Message Transfer and sends
1592 * it to the CU through SCTP.
1596 * @return ROK - success
1599 * ****************************************************************/
1600 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1602 uint8_t elementCnt = 0;
1605 F1AP_PDU_t *f1apMsg = NULLP;
1606 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1607 asn_enc_rval_t encRetVal; /* Encoder return value */
1609 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1611 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1612 if(f1apMsg == NULLP)
1614 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1618 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1619 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1620 sizeof(InitiatingMessage_t));
1621 if(f1apMsg->choice.initiatingMessage == NULLP)
1623 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1624 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1628 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1629 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1630 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1631 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1634 dlRRCMsg->protocolIEs.list.count = elementCnt;
1635 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1637 /* Initialize the F1Setup members */
1638 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1639 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1641 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1642 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1643 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1647 for(idx=0; idx<elementCnt; idx++)
1649 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1650 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1652 for(ieId=0; ieId<idx; ieId++)
1654 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1655 sizeof(DLRRCMessageTransferIEs_t));
1657 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1658 dlRRCMsg->protocolIEs.list.size);
1659 CU_FREE(f1apMsg->choice.initiatingMessage,\
1660 sizeof(InitiatingMessage_t));
1661 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1666 /* GNB CU UE F1AP ID */
1668 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1669 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1670 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1671 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1672 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1674 /* GNB DU UE F1AP ID */
1676 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1677 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1678 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1679 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1680 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1681 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1685 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1686 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1687 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1688 DLRRCMessageTransferIEs__value_PR_SRBID;
1689 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1693 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1694 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1695 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1696 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1697 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1699 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1701 /* Encode the F1SetupRequest type as APER */
1702 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1704 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1706 /* Encode results */
1707 if(encRetVal.encoded == ENCODE_FAIL)
1709 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1710 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1715 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1716 for(int i=0; i< encBufSize; i++)
1718 DU_LOG("%x",encBuf[i]);
1723 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1725 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1730 }/* End of BuildAndSendDLRRCMessageTransfer */
1732 /*******************************************************************
1734 * @brief Function to set the Dl RRC Msg Type
1738 * Function : setDlRRCMsgType
1740 * Functionality: Constructs the UE Setup Response and sends
1741 * it to the DU through SCTP.
1745 * @return ROK - success
1748 * ****************************************************************/
1750 uint8_t setDlRRCMsgType()
1752 uint8_t rrcMsgType = 0;
1753 switch(f1apMsgDb.dlRrcMsgCount)
1756 rrcMsgType = RRC_SETUP;
1758 case REGISTRATION_ACCEPT:
1759 rrcMsgType = REGISTRATION_ACCEPT;
1761 case UE_CONTEXT_SETUP_REQ:
1762 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1764 case SECURITY_MODE_COMPLETE:
1765 rrcMsgType = SECURITY_MODE_COMPLETE;
1768 rrcMsgType = RRC_RECONFIG;
1770 case UE_CONTEXT_MOD_REQ:
1771 rrcMsgType = UE_CONTEXT_MOD_REQ;
1779 /*******************************************************************
1781 * @brief Function to build Initial UL RRC Message
1785 * Function : procInitULRRCMsg
1787 * Functionality: Function to build Initial UL RRC Message
1791 * @return ROK - success
1794 * ****************************************************************/
1796 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1798 uint8_t idx, rrcMsgType;
1800 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1801 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1803 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1805 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1807 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1809 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1811 case ProtocolIE_ID_id_NRCGI:
1813 case ProtocolIE_ID_id_C_RNTI:
1815 case ProtocolIE_ID_id_RRCContainer:
1817 case ProtocolIE_ID_id_DUtoCURRCContainer:
1819 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1820 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1821 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1823 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1824 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1825 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1826 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1827 f1apMsgDb.duToCuContainer.size);
1828 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1830 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1831 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1832 .duToCuContainer.size);
1837 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1843 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1849 f1apMsgDb.dlRrcMsgCount++;
1850 rrcMsgType = setDlRRCMsgType();
1851 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1856 /*******************************************************************
1858 * @brief Builds Nrcgi
1862 * Function : BuildNrcgi
1864 * Functionality: Building the PLMN ID and NR Cell id
1866 * @params[in] NRCGI_t *nrcgi
1867 * @return ROK - success
1870 * ****************************************************************/
1871 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1874 uint8_t unused_bits = 4;
1875 uint8_t byteSize = 5;
1877 /* Allocate Buffer Memory */
1878 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1879 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1880 if(nrcgi->pLMN_Identity.buf == NULLP)
1884 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1890 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1891 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1892 if(nrcgi->nRCellIdentity.buf == NULLP)
1897 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1903 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1904 nrcgi->nRCellIdentity.buf[0] |= val;
1905 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1909 /*******************************************************************
1911 * @brief Builds Special cell list for UE Setup Request
1915 * Function : BuildSplCellList
1917 * Functionality: Constructs the Special Cell list for UESetReq
1919 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1921 * @return ROK - success
1924 * ****************************************************************/
1925 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1931 spCellLst->list.count = cellCnt;
1932 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1933 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1934 if(spCellLst->list.array == NULLP)
1938 for(idx=0; idx<cellCnt; idx++)
1940 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1941 if(spCellLst->list.array[idx] == NULLP)
1947 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1948 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1949 spCellLst->list.array[idx]->value.present =\
1950 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1951 /* Special Cell ID -NRCGI */
1952 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1957 /*Special Cell Index*/
1958 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1960 }/* End of BuildSplCellList*/
1962 /*******************************************************************
1964 * @brief Builds SRBS to be setup
1968 * Function : BuildSRBSetup
1970 * Functionality: Constructs the SRB's for UESetReq
1972 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1974 * @return ROK - success
1977 * ****************************************************************/
1978 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1983 srbSet->list.count = srbCnt;
1984 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1985 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1986 if(srbSet->list.array == NULLP)
1990 for(idx=0; idx<srbCnt; idx++)
1992 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1993 if(srbSet->list.array[idx] == NULLP)
1999 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2000 srbSet->list.array[idx]->criticality = Criticality_ignore;
2001 srbSet->list.array[idx]->value.present = \
2002 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2003 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2005 }/* End of BuildSRBSetup*/
2007 /*******************************************************************
2009 * @brief Builds QOS Info for DRB Setum Item
2013 * Function : BuildQOSInfo
2015 * Functionality: Constructs the QOS Info for DRB Setup Item
2017 * @params[in] QoSInformation_t *qosinfo
2019 * @return ROK - success
2022 * ****************************************************************/
2023 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2025 /* NonDynamic5QIDescriptor */
2026 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2027 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2028 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2033 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
2035 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2036 sizeof(AveragingWindow_t));
2037 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2042 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2043 /*MaxDataBurstVolume*/
2044 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2045 sizeof(MaxDataBurstVolume_t));
2046 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2051 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2053 /*nRGRAN Allocation Retention Priority*/
2054 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2055 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2056 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2059 }/*End of BuildQOSInfo*/
2061 /*******************************************************************
2063 * @brief Builds SNSSAI
2067 * Function : BuildSNSSAI
2069 * Functionality: Constructs the SNSSAI For DRB list
2071 * @params[in] SNSSAI_t *snssai
2073 * @return ROK - success
2076 * ****************************************************************/
2077 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2081 snssai->sST.size = sizeof(uint8_t);
2082 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2083 if(snssai->sST.buf == NULLP)
2087 snssai->sST.buf[0] = 3;
2089 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2090 if(snssai->sD == NULLP)
2094 snssai->sD->size = 3*sizeof(uint8_t);
2095 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2096 if(snssai->sD->buf == NULLP)
2100 snssai->sD->buf[0] = 3;
2101 snssai->sD->buf[1] = 6;
2102 snssai->sD->buf[2] = 9;
2104 }/*End of BuildSNSSAI*/
2106 /*******************************************************************
2108 * @brief Builds the flow map.
2112 * Function : BuildFlowsMap
2114 * Functionality: Constructs the flowmap For DRB list
2116 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2118 * @return ROK - success
2121 * ****************************************************************/
2122 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2128 flowMap->list.count = flowCnt;
2129 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2130 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2131 if(flowMap->list.array == NULLP)
2135 for(idx=0; idx<flowCnt; idx++)
2137 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2138 if(flowMap->list.array[idx] == NULLP)
2144 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2145 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2151 }/*End of BuildFlowsMap*/
2153 /*******************************************************************
2155 * @brief Builds the Uplink Tunnel Info
2159 * Function : BuildULTnlInfo
2161 * Functionality: Constructs the UL TnlInfo For DRB list
2163 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2165 * @return ROK - success
2168 * ****************************************************************/
2169 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2174 ulInfo->list.count = ulCnt;
2175 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2176 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2177 if(ulInfo->list.array == NULLP)
2181 for(idx=0; idx<ulCnt; idx++)
2183 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2184 if(ulInfo->list.array[idx] == NULLP)
2190 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2191 UPTransportLayerInformation_PR_gTPTunnel;
2193 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2194 sizeof(GTPTunnel_t));
2195 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2199 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2200 transportLayerAddress.size = 4*sizeof(uint8_t);
2201 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2202 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2203 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2204 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2205 transportLayerAddress.buf == NULLP)
2209 /* NOTE: Below IP address must be changed if running on different IP configuration */
2210 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2211 transportLayerAddress.buf[0] = 192;
2212 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2213 transportLayerAddress.buf[1] = 168;
2214 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2215 transportLayerAddress.buf[2] = 130;
2216 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2217 transportLayerAddress.buf[3] = 82;
2218 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2219 transportLayerAddress.bits_unused = 0;
2221 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2222 = 4 * sizeof(uint8_t);
2223 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2224 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2225 gTPTunnel->gTP_TEID.size);
2226 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2231 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2232 gTP_TEID.buf[0] = 0;
2233 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2234 gTP_TEID.buf[1] = 0;
2235 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2236 gTP_TEID.buf[2] = 0;
2237 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2238 gTP_TEID.buf[3] = 1;
2241 }/*End of BuildULTnlInfo*/
2243 /*******************************************************************
2245 * @brief Builds DRBS to be setup
2249 * Function : BuildDRBSetup
2251 * Functionality: Constructs the DRB's for UESetReq
2253 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2255 * @return ROK - success
2258 * ****************************************************************/
2259 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2261 uint8_t BuildQOSInforet;
2262 uint8_t BuildSNSSAIret;
2263 uint8_t BuildFlowsMapret;
2264 uint8_t BuildULTnlInforet;
2267 DRBs_ToBeSetup_Item_t *drbSetItem;
2269 drbSet->list.count = drbCnt;
2270 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2271 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2272 if(drbSet->list.array == NULLP)
2276 for(idx=0; idx<drbCnt; idx++)
2278 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2279 if(drbSet->list.array[idx] == NULLP)
2285 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2286 drbSet->list.array[idx]->criticality = Criticality_ignore;
2287 drbSet->list.array[idx]->value.present = \
2288 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2289 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2291 drbSetItem->dRBID = 1;
2293 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2294 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2295 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2299 drbSetItem->qoSInformation.choice.choice_extension->id = \
2300 ProtocolIE_ID_id_DRB_Information;
2301 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2303 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2304 QoSInformation_ExtIEs__value_PR_DRB_Information;
2305 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2306 choice_extension->value.choice.DRB_Information.dRB_QoS);
2307 if(BuildQOSInforet != ROK)
2312 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2313 choice_extension->value.choice.DRB_Information.sNSSAI);
2314 if(BuildSNSSAIret != ROK)
2318 /*Flows mapped to DRB List*/
2319 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2320 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2321 if(BuildFlowsMapret != ROK)
2325 /*ULUPTNLInformation To Be Setup List*/
2326 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2327 if(BuildULTnlInforet != ROK)
2332 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2334 /*UL Configuration*/
2335 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2336 if(drbSetItem->uLConfiguration == NULLP)
2340 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2342 }/* End of BuildDRBSetup*/
2344 /*******************************************************************
2346 * @brief Deallocating memory of function BuildAndSendUESetReq
2350 * Function : FreeNrcgi
2352 * Functionality: Deallocating memory for function BuildNrcgi
2354 * @params[in] NRCGI_t *nrcgi
2358 *******************************************************************/
2359 void FreeNrcgi(NRCGI_t *nrcgi)
2361 if(nrcgi->pLMN_Identity.buf != NULLP)
2363 if(nrcgi->nRCellIdentity.buf != NULLP)
2365 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2367 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2370 /*******************************************************************
2372 * @brief Deallocating memory of function BuildAndSendUESetReq
2376 * Function : FreeSplCellList
2378 * Functionality: Deallocating memory for function BuildSplCellList
2380 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2385 * *****************************************************************/
2386 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2389 if(spCellLst->list.array != NULLP)
2391 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2393 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2395 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2397 if(spCellLst->list.array[cellidx]!=NULLP)
2399 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2402 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2405 /*******************************************************************
2407 * @brief Deallocating memory of function BuildAndSendUESetReq
2411 * Function : FreeSRBSetup
2413 * Functionality: Deallocating memory for function BuildSRBSetup
2415 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2420 * ******************************************************************/
2421 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2424 if(srbSet->list.array != NULLP)
2426 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2428 if(srbSet->list.array[srbidx]!=NULLP)
2430 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2433 CU_FREE(srbSet->list.array,srbSet->list.size);
2436 /*******************************************************************
2438 * @brief Deallocating memory of function BuildAndSendUESetReq
2442 * Function : FreeQOSInfo
2444 * Functionality: Deallocating memory for function BuildQOSInfo
2446 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2450 * ****************************************************************/
2451 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2453 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2455 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2457 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2459 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2460 sizeof(MaxDataBurstVolume_t));
2462 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2463 sizeof(AveragingWindow_t));
2465 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2466 sizeof(NonDynamic5QIDescriptor_t));
2469 /*******************************************************************
2471 * @brief Deallocating memory of function BuildAndSendUESetReq
2475 * Function : FreeULTnlInfo
2477 * Functionality: Deallocating memory for function BuildULTnlInfo
2479 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2484 * ****************************************************************/
2485 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2488 if(ulInfo->list.array != NULLP)
2490 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2492 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2494 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2496 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2497 transportLayerAddress.buf != NULLP)
2499 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2502 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2503 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2504 gTPTunnel->gTP_TEID.size);
2506 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2507 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2508 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2510 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2511 sizeof(GTPTunnel_t));
2514 if(ulInfo->list.array[ulidx]!=NULLP)
2516 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2519 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2522 /*******************************************************************
2524 * @brief Deallocating memory for BuildAndSendUESetReq
2528 * Function : FreeDRBSetup
2530 * Functionality: Deallocating memory for BuildDRBSetup
2532 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2536 * ****************************************************************/
2537 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2539 DRBs_ToBeSetup_Item_t *drbSetItem;
2542 if(drbSet->list.array == NULLP)
2544 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2546 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2548 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2549 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2551 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2552 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2554 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2555 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2557 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2558 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2560 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2562 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2564 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2566 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2567 flows_Mapped_To_DRB_List.list.array != NULLP)
2569 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2570 flows_Mapped_To_DRB_List.list.count; flowidx++)
2572 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2573 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2575 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2576 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2577 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2579 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2580 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2581 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2583 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2584 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2585 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2587 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2588 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2590 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2591 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2592 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2593 sizeof(MaxDataBurstVolume_t));
2595 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2596 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2597 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2599 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2600 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2601 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2604 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2605 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2607 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2608 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2611 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2612 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2613 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2615 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2616 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2618 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2619 sizeof(OCTET_STRING_t));
2621 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2622 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2624 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2625 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2627 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2628 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2630 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2631 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2633 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2636 if(drbSet->list.array[drbidx]!=NULLP)
2638 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2641 CU_FREE(drbSet->list.array,drbSet->list.size);
2646 /*******************************************************************
2648 * @brief Free the UE Setup Request
2652 * Function : FreeUeContextSetupReq
2654 * Functionality: Deallocate the memory of BuildUESetReq
2656 * @params[in] F1AP_PDU_t *f1apMsg
2661 * ****************************************************************/
2662 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2665 UEContextSetupRequest_t *ueSetReq = NULLP;
2667 if(f1apMsg != NULLP)
2669 if(f1apMsg->choice.initiatingMessage != NULLP)
2671 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2672 if(ueSetReq->protocolIEs.list.array != NULLP)
2674 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2676 if(ueSetReq->protocolIEs.list.array[idx])
2678 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2680 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2682 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2684 case ProtocolIE_ID_id_SpCell_ID:
2685 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2687 case ProtocolIE_ID_id_ServCellIndex:
2689 case ProtocolIE_ID_id_SpCellULConfigured:
2691 case ProtocolIE_ID_id_CUtoDURRCInformation:
2692 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2694 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2695 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2697 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2698 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2700 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2701 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2703 case ProtocolIE_ID_id_RRCContainer:
2704 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2706 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2707 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2711 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2716 for(ieId=0; ieId<idx; ieId++)
2718 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2720 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2723 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2725 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2727 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2731 /**Filling cell group info **/
2732 /*******************************************************************
2734 * @brief Build Control resource set to add/modify list
2738 * Function : BuildControlRSetToAddModList
2740 * Functionality: Build Control resource set to add/modify list
2743 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2745 * @return ROK - success
2748 * ****************************************************************/
2749 uint8_t BuildControlRSetToAddModList
2751 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2756 uint8_t numBytes, bitsUnused;
2757 struct ControlResourceSet *controlRSet;
2758 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2759 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2762 controlRSetList->list.count = elementCnt;
2763 controlRSetList->list.size = \
2764 elementCnt * sizeof(struct ControlResourceSet *);
2766 controlRSetList->list.array = NULLP;
2767 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2768 if(!controlRSetList->list.array)
2770 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2774 for(idx = 0; idx < elementCnt; idx++)
2776 controlRSetList->list.array[idx] = NULLP;
2777 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2778 if(!controlRSetList->list.array[idx])
2780 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2786 controlRSet = controlRSetList->list.array[idx];
2787 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2789 /* Values harcoded according to our design:
2792 * Bit string stored ff0000000000
2796 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2797 controlRSet->frequencyDomainResources.buf = NULLP;
2798 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2799 controlRSet->frequencyDomainResources.size);
2800 if(!controlRSet->frequencyDomainResources.buf)
2802 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2806 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2807 coreset0EndPrb = CORESET0_END_PRB;
2808 coreset1StartPrb = coreset0EndPrb + 6;
2809 coreset1NumPrb = CORESET1_NUM_PRB;
2810 /* calculate the PRBs */
2811 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2812 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2813 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2815 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2816 controlRSet->cce_REG_MappingType.present = \
2817 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2819 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2820 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2821 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2822 controlRSet->tci_PresentInDCI = NULLP;
2824 uint8_t tciStateIdx;
2826 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2827 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2828 if(!controlRset->tci_StatesPDCCH_ToAddList)
2830 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2835 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2836 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2837 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2838 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2839 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2841 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2845 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2847 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2848 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2850 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2857 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2859 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2860 if(!controlRset->tci_PresentInDCI)
2862 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2866 *(controlRset->tci_PresentInDCI);
2869 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2870 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2871 if(!controlRSet->pdcch_DMRS_ScramblingID)
2873 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2876 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2879 } /* End BuildControlRSetToAddModList */
2881 /*******************************************************************
2883 * @brief Build search space to add/modify list
2887 * Function : BuildSearchSpcToAddModList
2889 * Functionality: Build search space to add/modify list
2892 * @return ROK - success
2895 * ****************************************************************/
2896 uint8_t BuildSearchSpcToAddModList
2898 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2906 struct SearchSpace *searchSpc;
2909 searchSpcList->list.count = elementCnt;
2910 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2912 searchSpcList->list.array = NULLP;
2913 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2914 if(!searchSpcList->list.array)
2916 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2920 for(idx = 0; idx < elementCnt; idx++)
2922 searchSpcList->list.array[idx] = NULLP;
2923 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2924 if(!searchSpcList->list.array[idx])
2926 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2932 searchSpc = searchSpcList->list.array[idx];
2934 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2936 searchSpc->controlResourceSetId = NULLP;
2937 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2938 if(!searchSpc->controlResourceSetId)
2940 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2943 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2945 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2946 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2947 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2948 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2950 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2953 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2954 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2956 searchSpc->duration = NULLP;
2957 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2958 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2959 if(!searchSpc->monitoringSymbolsWithinSlot)
2961 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2965 /* Values taken from reference logs :
2968 * Bit string stores 8000
2973 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2974 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2975 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2976 searchSpc->monitoringSymbolsWithinSlot->size);
2977 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2979 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2984 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2985 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2986 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2987 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2989 searchSpc->nrofCandidates = NULLP;
2990 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2991 if(!searchSpc->nrofCandidates)
2993 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2997 searchSpc->nrofCandidates->aggregationLevel1 = \
2998 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2999 searchSpc->nrofCandidates->aggregationLevel2 = \
3000 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3001 searchSpc->nrofCandidates->aggregationLevel4 = \
3002 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3003 searchSpc->nrofCandidates->aggregationLevel8 = \
3004 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3005 searchSpc->nrofCandidates->aggregationLevel16 = \
3006 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3008 searchSpc->searchSpaceType = NULLP;
3009 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3010 if(!searchSpc->searchSpaceType)
3012 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3016 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3018 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3019 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3020 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3021 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3023 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3026 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3027 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3030 }/* End BuildSearchSpcToAddModList */
3032 /*******************************************************************
3034 * @brief Builds BWP DL dedicated PDCCH config
3038 * Function : BuildBWPDlDedPdcchCfg
3040 * Functionality: Builds BWP DL dedicated PDCCH config
3042 * @params[in] struct PDCCH_Config *pdcchCfg
3044 * @return ROK - success
3047 * ****************************************************************/
3048 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3050 pdcchCfg->controlResourceSetToAddModList = NULLP;
3051 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3052 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3053 if(!pdcchCfg->controlResourceSetToAddModList)
3055 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3059 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3064 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3066 pdcchCfg->searchSpacesToAddModList = NULLP;
3067 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3068 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3069 if(!pdcchCfg->searchSpacesToAddModList)
3071 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3075 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3080 pdcchCfg->searchSpacesToReleaseList = NULLP;
3081 pdcchCfg->downlinkPreemption = NULLP;
3082 pdcchCfg->tpc_PUSCH = NULLP;
3083 pdcchCfg->tpc_PUCCH = NULLP;
3084 pdcchCfg->tpc_SRS = NULLP;
3089 /*******************************************************************
3091 * @brief Builds DMRS DL PDSCH Mapping type A
3095 * Function : BuildDMRSDLPdschMapTypeA
3097 * Functionality: Builds DMRS DL PDSCH Mapping type A
3100 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3101 * @return ROK - success
3104 * ****************************************************************/
3105 uint8_t BuildDMRSDLPdschMapTypeA
3107 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3110 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3111 dmrsDlCfg->choice.setup = NULLP;
3112 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3113 if(!dmrsDlCfg->choice.setup)
3115 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3119 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3120 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3121 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3122 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3124 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3127 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3129 dmrsDlCfg->choice.setup->maxLength = NULLP;
3130 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3131 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3132 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3137 /*******************************************************************
3139 * @brief Builds TCI states to add/modify list
3143 * Function : BuildTCIStatesToAddModList
3145 * Functionality:Builds TCI states to add/modify list
3148 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3150 * @return ROK - success
3153 * ****************************************************************/
3154 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3159 /*******************************************************************
3161 * @brief Builds PDSCH time domain allocation list
3165 * Function : BuildPdschTimeDomAllocList
3167 * Functionality: Builds PDSCH time domain allocation list
3170 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3172 * @return ROK - success
3175 * ****************************************************************/
3176 uint8_t BuildPdschTimeDomAllocList
3178 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3183 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3185 timeDomAllocList->present = \
3186 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3188 timeDomAllocList->choice.setup = NULLP;
3189 CU_ALLOC(timeDomAllocList->choice.setup, \
3190 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3191 if(!timeDomAllocList->choice.setup)
3193 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3198 timeDomAllocList->choice.setup->list.count = elementCnt;
3199 timeDomAllocList->choice.setup->list.size = \
3200 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3202 timeDomAllocList->choice.setup->list.array = NULLP;
3203 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3204 timeDomAllocList->choice.setup->list.size);
3205 if(!timeDomAllocList->choice.setup->list.array)
3207 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3211 for(idx = 0; idx < elementCnt; idx++)
3213 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3214 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3215 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3216 if(!timeDomAllocList->choice.setup->list.array[idx])
3218 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3224 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3226 timeDomAlloc->k0 = NULLP;
3227 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3228 timeDomAlloc->startSymbolAndLength = 53;
3233 /*******************************************************************
3235 * @brief Builds PDSCH PRB Bundling type
3239 * Function : BuildPdschPrbBundlingType
3241 * Functionality: Builds PDSCH PRB Bundling type
3244 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3246 * @return ROK - success
3249 * ****************************************************************/
3250 uint8_t BuildPdschPrbBundlingType
3252 struct PDSCH_Config__prb_BundlingType *prbBndlType
3255 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3257 prbBndlType->choice.staticBundling = NULLP;
3258 CU_ALLOC(prbBndlType->choice.staticBundling, \
3259 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3260 if(!prbBndlType->choice.staticBundling)
3262 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3265 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3270 /*******************************************************************
3272 * @brief Builds BWP DL dedicated PDSCH config
3276 * Function : BuildBWPDlDedPdschCfg
3278 * Functionality: Builds BWP DL dedicated PDSCH config
3280 * @params[in] struct PDSCH_Config *pdschCfg
3282 * @return ROK - success
3285 * ****************************************************************/
3286 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3288 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3290 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3291 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3292 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3293 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3295 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3299 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3304 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3305 pdschCfg->tci_StatesToAddModList = NULLP;
3306 pdschCfg->tci_StatesToReleaseList = NULLP;
3307 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3309 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3310 if(!pdschCfg->tci_StatesToAddModList)
3312 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3315 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3321 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3323 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3324 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3325 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3326 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3328 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3331 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3335 pdschCfg->pdsch_AggregationFactor = NULLP;
3336 pdschCfg->rateMatchPatternToAddModList = NULLP;
3337 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3338 pdschCfg->rateMatchPatternGroup1 = NULLP;
3339 pdschCfg->rateMatchPatternGroup2 = NULLP;
3340 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3341 pdschCfg->mcs_Table = NULLP;
3343 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3344 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3345 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3347 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3350 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3352 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3357 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3358 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3359 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3360 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3361 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3362 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3363 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3368 /*******************************************************************
3370 * @brief Builds intitial DL BWP
3373 * Function : BuildInitialDlBWP
3375 * Functionality: Builds intitial DL BWP in spCellCfgDed
3377 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3379 * @return ROK - success
3382 * ****************************************************************/
3383 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3385 dlBwp->pdcch_Config = NULLP;
3386 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3387 if(!dlBwp->pdcch_Config)
3389 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3392 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3394 dlBwp->pdcch_Config->choice.setup = NULLP;
3395 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3396 if(!dlBwp->pdcch_Config->choice.setup)
3398 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3401 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3406 dlBwp->pdsch_Config = NULLP;
3407 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3408 if(!dlBwp->pdsch_Config)
3410 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3413 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3415 dlBwp->pdsch_Config->choice.setup = NULLP;
3416 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3417 if(!dlBwp->pdsch_Config->choice.setup)
3419 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3423 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3428 dlBwp->sps_Config = NULLP;
3429 dlBwp->radioLinkMonitoringConfig = NULLP;
3433 /*******************************************************************
3435 * @brief Builds DMRS UL Pusch Mapping type A
3439 * Function : BuildDMRSULPuschMapTypeA
3441 * Functionality: Builds DMRS UL Pusch Mapping type A
3444 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3445 * @return ROK - success
3448 * ****************************************************************/
3449 uint8_t BuildDMRSULPuschMapTypeA
3451 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3454 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3455 dmrsUlCfg->choice.setup= NULLP;
3456 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3457 if(!dmrsUlCfg->choice.setup)
3459 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3463 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3464 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3465 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3466 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3468 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3471 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3473 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3474 dmrsUlCfg->choice.setup->maxLength = NULLP;
3475 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3476 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3477 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3478 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3480 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3484 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3485 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3487 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3489 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3492 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3494 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3495 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3499 /*******************************************************************
3501 * @brief Build PUSCH time domain allocation list
3505 * Function : BuildPuschTimeDomAllocList
3507 * Functionality: Build PUSCH time domain allocation list
3510 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3512 * @return ROK - success
3515 * ****************************************************************/
3516 uint8_t BuildPuschTimeDomAllocList
3518 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3523 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3525 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3526 timeDomAllocList->choice.setup = NULLP;
3527 CU_ALLOC(timeDomAllocList->choice.setup, \
3528 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3529 if(!timeDomAllocList->choice.setup)
3531 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3536 timeDomAllocList->choice.setup->list.count = elementCnt;
3537 timeDomAllocList->choice.setup->list.size = \
3538 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3539 timeDomAllocList->choice.setup->list.array = NULLP;
3540 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3541 timeDomAllocList->choice.setup->list.size);
3542 if(!timeDomAllocList->choice.setup->list.array)
3544 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3548 for(idx = 0; idx < elementCnt; idx++)
3550 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3551 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3552 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3553 if(!timeDomAllocList->choice.setup->list.array[idx])
3555 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3561 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3562 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3563 if(!timeDomAlloc->k2)
3565 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3568 *(timeDomAlloc->k2) = PUSCH_K2;
3569 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3570 timeDomAlloc->startSymbolAndLength = 27;
3574 /*******************************************************************
3576 * @brief Builds BWP UL dedicated PUSCH Config
3580 * Function : BuildBWPUlDedPuschCfg
3583 * Builds BWP UL dedicated PUSCH Config
3585 * @params[in] : PUSCH_Config_t *puschCfg
3587 * @return ROK - success
3590 * ****************************************************************/
3591 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3593 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3594 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3595 if(!puschCfg->dataScramblingIdentityPUSCH)
3597 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3600 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3602 puschCfg->txConfig = NULLP;
3603 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3604 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3605 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3606 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3608 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3612 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3617 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3618 puschCfg->pusch_PowerControl = NULLP;
3619 puschCfg->frequencyHopping = NULLP;
3620 puschCfg->frequencyHoppingOffsetLists = NULLP;
3621 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3623 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3624 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3625 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3626 if(!puschCfg->pusch_TimeDomainAllocationList)
3628 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3632 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3637 puschCfg->pusch_AggregationFactor = NULLP;
3638 puschCfg->mcs_Table = NULLP;
3639 puschCfg->mcs_TableTransformPrecoder = NULLP;
3640 puschCfg->transformPrecoder = NULLP;
3641 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3642 if(!puschCfg->transformPrecoder)
3644 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3647 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3649 puschCfg->codebookSubset = NULLP;
3650 puschCfg->maxRank = NULLP;
3651 puschCfg->rbg_Size = NULLP;
3652 puschCfg->uci_OnPUSCH = NULLP;
3653 puschCfg->tp_pi2BPSK = NULLP;
3658 /*******************************************************************
3660 * @brief Fills SRS resource to add/modify list
3664 * Function : BuildSrsRsrcAddModList
3666 * Functionality: Fills SRS resource to add/modify list
3669 * @return ROK - success
3672 * ****************************************************************/
3673 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3679 resourceList->list.count = elementCnt;
3680 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3681 resourceList->list.array = NULLP;
3682 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3683 if(!resourceList->list.array)
3685 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3689 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3691 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3692 if(!resourceList->list.array[rsrcIdx])
3694 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3700 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3701 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3702 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3704 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3705 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3706 sizeof(struct SRS_Resource__transmissionComb__n2));
3707 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3709 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3712 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3713 = SRS_COMB_OFFSET_N2;
3714 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3715 = SRS_CYCLIC_SHIFT_N2;
3717 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3719 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3720 SRS_Resource__resourceMapping__nrofSymbols_n1;
3721 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3722 SRS_Resource__resourceMapping__repetitionFactor_n1;
3724 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3725 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3726 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3727 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3728 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3729 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3730 SRS_Resource__groupOrSequenceHopping_neither;
3732 /* Setting resource type to aperiodic for intergration purposes */
3733 resourceList->list.array[rsrcIdx]->resourceType.present = \
3734 SRS_Resource__resourceType_PR_aperiodic;
3735 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3736 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3737 sizeof(struct SRS_Resource__resourceType__aperiodic));
3738 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3740 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3743 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3748 /*******************************************************************
3750 * @brief Build SRS resource set Add/mod list
3754 * Function : BuildSrsRsrcSetAddModList
3756 * Functionality: Build SRS resource set Add/mod list
3759 * @return ROK - success
3762 * ****************************************************************/
3763 uint8_t BuildSrsRsrcSetAddModList
3765 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3771 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3774 rsrcSetList->list.count = elementCnt;
3775 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3776 rsrcSetList->list.array = NULLP;
3777 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3778 if(!rsrcSetList->list.array)
3780 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3784 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3786 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3787 if(!rsrcSetList->list.array[rSetIdx])
3789 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3795 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3797 /* Fill Resource Id list in resource set */
3798 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3799 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3800 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3801 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3803 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3808 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3809 rsrcIdList->list.count = elementCnt;
3810 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3811 rsrcIdList->list.array = NULLP;
3812 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3813 if(!rsrcIdList->list.array)
3815 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3819 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3821 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3822 if(!rsrcIdList->list.array[rsrcIdx])
3824 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3830 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3832 /* Fill resource type */
3833 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3834 SRS_ResourceSet__resourceType_PR_aperiodic;
3836 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3837 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3838 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3839 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3841 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3844 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3845 = APERIODIC_SRS_RESRC_TRIGGER;
3847 /* TODO : Fill values for below IEs as expected by Viavi */
3848 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3849 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3852 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3853 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3854 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3855 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3856 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3861 /*******************************************************************
3863 * @brief Builds BWP UL dedicated SRS Config
3867 * Function : BuildBWPUlDedSrsCfg
3869 * Functionality: Builds BWP UL dedicated SRS Config
3871 * @params[in] SRS Config
3872 * @return ROK - success
3875 * ****************************************************************/
3876 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3878 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3879 srsCfg->srs_ResourceSetToAddModList = NULLP;
3880 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3881 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3882 if(!srsCfg->srs_ResourceSetToAddModList)
3884 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3887 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3892 srsCfg->srs_ResourceToReleaseList = NULLP;
3894 /* Resource to Add/Modify list */
3895 srsCfg->srs_ResourceToAddModList = NULLP;
3896 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3897 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3898 if(!srsCfg->srs_ResourceToAddModList)
3900 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3904 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3909 srsCfg->tpc_Accumulation = NULLP;
3914 /*******************************************************************
3916 * @brief Builds inital UL BWP
3920 * Function : BuildInitialUlBWP
3922 * Functionality: Builds initial UL BWP
3924 * @params[in] BWP_UplinkDedicated_t *ulBwp
3925 * @return ROK - success
3928 * ****************************************************************/
3929 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3931 ulBwp->pucch_Config = NULLP;
3933 /* Fill BWP UL dedicated PUSCH config */
3934 ulBwp->pusch_Config = NULLP;
3935 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3936 if(!ulBwp->pusch_Config)
3938 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3942 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3943 ulBwp->pusch_Config->choice.setup = NULLP;
3944 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3945 if(!ulBwp->pusch_Config->choice.setup)
3947 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3951 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3956 ulBwp->configuredGrantConfig = NULLP;
3958 /* Fill BPW UL dedicated SRS config */
3959 ulBwp->srs_Config = NULLP;
3960 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3961 if(!ulBwp->srs_Config)
3963 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3967 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3968 ulBwp->srs_Config->choice.setup = NULLP;
3969 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3970 if(!ulBwp->srs_Config->choice.setup)
3972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3976 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3981 ulBwp->beamFailureRecoveryConfig = NULLP;
3986 /*******************************************************************
3988 * @brief Builds Pusch Serving cell Config
3992 * Function : BuildPuschSrvCellCfg
3994 * Functionality: Builds Pusch Serving cell Config
3996 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3998 * @return ROK - success
4001 * ****************************************************************/
4002 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4004 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4005 puschCfg->choice.setup = NULLP;
4006 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4007 if(!puschCfg->choice.setup)
4009 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4013 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4014 puschCfg->choice.setup->rateMatching = NULLP;
4015 puschCfg->choice.setup->xOverhead = NULLP;
4016 puschCfg->choice.setup->ext1 = NULLP;
4017 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4018 if(!puschCfg->choice.setup->ext1)
4020 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4024 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4025 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4026 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4028 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4031 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4033 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4034 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4035 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4037 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4040 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4044 /*******************************************************************
4046 * @brief Builds UL config
4049 * Function : BuildUlCfg
4051 * Functionality: Builds UL config in spCellCfgDed
4053 * @params[in] UplinkConfig_t *ulCfg
4055 * @return ROK - success
4058 * ****************************************************************/
4059 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4061 ulCfg->initialUplinkBWP = NULLP;
4062 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4063 if(!ulCfg->initialUplinkBWP)
4065 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4069 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4074 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4075 ulCfg->uplinkBWP_ToAddModList = NULLP;
4076 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4077 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4078 if(!ulCfg->firstActiveUplinkBWP_Id)
4080 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4083 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4085 ulCfg->pusch_ServingCellConfig = NULLP;
4086 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4087 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4088 if(!ulCfg->pusch_ServingCellConfig)
4090 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4094 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4099 ulCfg->carrierSwitching = NULLP;
4100 ulCfg->ext1 = NULLP;
4104 /*******************************************************************
4106 * @brief Builds PDSCH serving cell config
4109 * Function : BuildPdschSrvCellCfg
4111 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4113 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4115 * @return ROK - success
4118 * ****************************************************************/
4119 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4121 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4122 pdschCfg->choice.setup = NULLP;
4123 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4124 if(!pdschCfg->choice.setup)
4126 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4130 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4131 pdschCfg->choice.setup->xOverhead = NULLP;
4132 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4133 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4134 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4136 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4139 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4140 pdschCfg->choice.setup->pucch_Cell = NULLP;
4141 pdschCfg->choice.setup->ext1 = NULLP;
4146 /*******************************************************************
4148 * @brief Builds CSI Meas config
4151 * Function : BuildCsiMeasCfg
4153 * Functionality: Builds CSI Meas config in spCellCfgDed
4155 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4157 * @return ROK - success
4160 * ****************************************************************/
4161 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4167 /*******************************************************************
4169 * @brief Builds Spcell config dedicated
4172 * Function : BuildSpCellCfgDed
4174 * Functionality: Builds sp cell config dedicated in spCellCfg
4176 * @params[in] ServingCellConfig_t srvCellCfg
4178 * @return ROK - success
4181 * ****************************************************************/
4182 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4184 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4186 srvCellCfg->initialDownlinkBWP = NULLP;
4187 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4188 if(!srvCellCfg->initialDownlinkBWP)
4190 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4194 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4196 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4199 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4200 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4202 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4203 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4204 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4206 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4209 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4211 srvCellCfg->bwp_InactivityTimer = NULLP;
4213 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4214 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4215 if(!srvCellCfg->defaultDownlinkBWP_Id)
4217 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4220 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4222 srvCellCfg->uplinkConfig = NULLP;
4223 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4224 if(!srvCellCfg->uplinkConfig)
4226 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4230 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4232 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4235 srvCellCfg->supplementaryUplink = NULLP;
4236 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4238 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4239 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4240 if(!srvCellCfg->pdsch_ServingCellConfig)
4242 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4246 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4248 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4252 srvCellCfg->csi_MeasConfig = NULLP;
4254 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4255 if(!srvCellCfg->csi_MeasConfig)
4257 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4261 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4263 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4267 srvCellCfg->sCellDeactivationTimer = NULLP;
4268 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4269 srvCellCfg->tag_Id = TAG_ID;
4270 srvCellCfg->dummy = NULLP;
4271 srvCellCfg->pathlossReferenceLinking = NULLP;
4272 srvCellCfg->servingCellMO = NULLP;
4273 srvCellCfg->ext1 = NULLP;
4277 /*******************************************************************
4279 * @brief Builds Spcell config
4283 * Function : BuildSpCellCfg
4285 * Functionality: Builds sp cell config in DuToCuRrcContainer
4287 * @params[in] SpCellConfig_t spCellCfg
4289 * @return ROK - success
4292 * ****************************************************************/
4293 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4296 spCellCfg->servCellIndex = NULLP;
4297 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4298 if(!spCellCfg->servCellIndex)
4300 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4303 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4305 spCellCfg->reconfigurationWithSync = NULLP;
4306 spCellCfg->rlf_TimersAndConstants = NULLP;
4307 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4308 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4309 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4311 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4314 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4316 spCellCfg->spCellConfigDedicated = NULLP;
4317 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4318 if(!spCellCfg->spCellConfigDedicated)
4320 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4323 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4325 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4330 /*******************************************************************
4332 * @brief Builds Phy cell group config
4336 * Function : BuildPhyCellGrpCfg
4338 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4340 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4342 * @return ROK - success
4345 * ****************************************************************/
4346 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4348 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4349 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4351 phyCellGrpCfg->p_NR_FR1 = NULLP;
4352 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4353 if(!phyCellGrpCfg->p_NR_FR1)
4355 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4358 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4359 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4360 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4361 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4362 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4363 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4364 phyCellGrpCfg->cs_RNTI = NULLP;
4365 phyCellGrpCfg->ext1 = NULLP;
4366 phyCellGrpCfg->ext2 = NULLP;
4371 /*******************************************************************
4373 * @brief Builds tag config
4377 * Function : BuildTagConfig
4379 * Functionality: Builds tag config in MacCellGroupConfig
4381 * @params[in] TAG_Config *tag_Config
4383 * @return ROK - success
4386 * ****************************************************************/
4387 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4389 struct TAG_Config__tag_ToAddModList *tagList;
4390 uint8_t idx, elementCnt;
4392 tagConfig->tag_ToReleaseList = NULLP;
4393 tagConfig->tag_ToAddModList = NULLP;
4394 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4395 if(!tagConfig->tag_ToAddModList)
4397 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4401 elementCnt = 1; //ODU_VALUE_ONE;
4402 tagList = tagConfig->tag_ToAddModList;
4403 tagList->list.count = elementCnt;
4404 tagList->list.size = elementCnt * sizeof(struct TAG *);
4406 tagList->list.array = NULLP;
4407 CU_ALLOC(tagList->list.array, tagList->list.size);
4408 if(!tagList->list.array)
4410 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4414 for(idx=0; idx<tagList->list.count; idx++)
4416 tagList->list.array[idx] = NULLP;
4417 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4418 if(!tagList->list.array[idx])
4420 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4426 tagList->list.array[idx]->tag_Id = TAG_ID;
4427 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4432 /*******************************************************************
4434 * @brief Builds PHR Config
4438 * Function : BuildPhrConfig
4440 * Functionality: Builds phrConfig in MacCellGroupConfig
4442 * @params[in] PHR Config *
4444 * @return ROK - success
4447 * ****************************************************************/
4448 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4451 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4452 phrConfig->choice.setup = NULLP;
4453 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4454 if(!phrConfig->choice.setup)
4456 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4460 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4461 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4462 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4463 phrConfig->choice.setup->multiplePHR = false;
4464 phrConfig->choice.setup->dummy = false;
4465 phrConfig->choice.setup->phr_Type2OtherCell = false;
4466 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4471 /*******************************************************************
4473 * @brief Builds BSR Config
4477 * Function : BuildBsrConfig
4479 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4481 * @params[in] BSR_Config *bsrConfig
4483 * @return ROK - success
4486 * ****************************************************************/
4487 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4489 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4490 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4491 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4496 /*******************************************************************
4498 * @brief Builds scheduling request config
4502 * Function : BuildSchedulingReqConfig
4504 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4506 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4508 * @return ROK - success
4511 * ****************************************************************/
4512 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4514 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4515 uint8_t idx, elementCnt;
4517 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4518 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4519 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4520 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4522 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4526 elementCnt = 1; //ODU_VALUE_ONE;
4527 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4528 schReqList->list.count = elementCnt;
4529 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4531 schReqList->list.array = NULLP;
4532 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4533 if(!schReqList->list.array)
4535 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4539 for(idx=0;idx<schReqList->list.count; idx++)
4541 schReqList->list.array[idx] = NULLP;
4542 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4543 if(!schReqList->list.array[idx])
4545 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4551 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4553 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4554 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4555 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4557 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4560 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4561 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4562 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4566 /*******************************************************************
4568 * @brief Builds Mac cell group config
4572 * Function : BuildMacCellGrpCfg
4574 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4576 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4578 * @return ROK - success
4581 * ****************************************************************/
4582 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4584 macCellGrpCfg->drx_Config = NULLP;
4585 macCellGrpCfg->schedulingRequestConfig = NULLP;
4586 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4587 if(!macCellGrpCfg->schedulingRequestConfig)
4589 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4593 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4595 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4599 macCellGrpCfg->bsr_Config = NULLP;
4600 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4601 if(!macCellGrpCfg->bsr_Config)
4603 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4607 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4609 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4613 macCellGrpCfg->tag_Config = NULLP;
4614 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4615 if(!macCellGrpCfg->tag_Config)
4617 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4621 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4623 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4627 macCellGrpCfg->phr_Config = NULLP;
4628 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4629 if(!macCellGrpCfg->phr_Config)
4631 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4635 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4637 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4641 macCellGrpCfg->skipUplinkTxDynamic = false;
4642 macCellGrpCfg->ext1 = NULLP;
4646 /*******************************************************************
4648 * @brief Frees memeory allocated for SearchSpcToAddModList
4652 * Function : FreeSearchSpcToAddModList
4654 * Functionality: Deallocating memory of SearchSpcToAddModList
4656 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4660 4221 * ****************************************************************/
4661 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4665 struct SearchSpace *searchSpc=NULLP;
4667 if(searchSpcList->list.array)
4669 if(searchSpcList->list.array[idx2])
4671 searchSpc = searchSpcList->list.array[idx2];
4672 if(searchSpc->controlResourceSetId)
4674 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4676 if(searchSpc->monitoringSymbolsWithinSlot)
4678 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4680 if(searchSpc->nrofCandidates)
4682 if(searchSpc->searchSpaceType)
4684 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4685 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4686 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4687 SearchSpace__searchSpaceType));
4689 CU_FREE(searchSpc->nrofCandidates,
4690 sizeof(struct SearchSpace__nrofCandidates));
4692 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4693 searchSpc->monitoringSymbolsWithinSlot->size);
4695 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4696 sizeof(BIT_STRING_t));
4698 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4699 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4701 CU_FREE(searchSpc->controlResourceSetId,
4702 sizeof(ControlResourceSetId_t));
4705 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4707 CU_FREE(searchSpcList->list.array[idx1],
4708 sizeof(struct SearchSpace));
4710 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4713 /*******************************************************************
4715 * @brief Frees memory allocated for PdschTimeDomAllocList
4719 * Function : FreePdschTimeDomAllocList
4721 * Functionality: Deallocating memory of PdschTimeDomAllocList
4723 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4727 4221 * ****************************************************************/
4728 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4732 if(timeDomAllocList->choice.setup)
4734 if(timeDomAllocList->choice.setup->list.array)
4736 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4738 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4739 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4741 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4742 timeDomAllocList->choice.setup->list.size);
4744 CU_FREE(timeDomAllocList->choice.setup,\
4745 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4748 /*******************************************************************
4750 * @brief Frees memory allocated for PuschTimeDomAllocList
4754 * Function : FreePuschTimeDomAllocList
4756 * Functionality: Deallocating memory of PuschTimeDomAllocList
4758 * @params[in] PUSCH_Config_t *puschCfg
4762 ***********************************************************************/
4763 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4767 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4769 if(puschCfg->pusch_TimeDomainAllocationList)
4771 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4772 if(timeDomAllocList_t->choice.setup)
4774 if(timeDomAllocList_t->choice.setup->list.array)
4776 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4777 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4779 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4780 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4782 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4783 timeDomAllocList_t->choice.setup->list.size);
4785 CU_FREE(timeDomAllocList_t->choice.setup, \
4786 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4788 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4789 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4790 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4794 /*******************************************************************
4796 * @brief Frees memory allocated for InitialUlBWP
4800 * Function : FreeInitialUlBWP
4802 * Functionality: Deallocating memory of InitialUlBWP
4804 * @params[in] BWP_UplinkDedicated_t *ulBwp
4808 * ****************************************************************/
4809 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4811 uint8_t rSetIdx, rsrcIdx;
4812 SRS_Config_t *srsCfg = NULLP;
4813 PUSCH_Config_t *puschCfg = NULLP;
4814 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4815 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4816 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4817 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4819 if(ulBwp->pusch_Config)
4821 if(ulBwp->pusch_Config->choice.setup)
4823 puschCfg=ulBwp->pusch_Config->choice.setup;
4824 if(puschCfg->dataScramblingIdentityPUSCH)
4826 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4828 FreePuschTimeDomAllocList(puschCfg);
4829 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4830 if(dmrsUlCfg->choice.setup)
4832 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4834 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4836 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4838 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4839 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4841 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4844 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4846 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4847 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4849 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4851 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4853 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4855 /* Free SRS-Config */
4856 if(ulBwp->srs_Config)
4858 if(ulBwp->srs_Config->choice.setup)
4860 srsCfg = ulBwp->srs_Config->choice.setup;
4862 /* Free Resource Set to add/mod list */
4863 if(srsCfg->srs_ResourceSetToAddModList)
4865 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4866 if(rsrcSetList->list.array)
4870 /* Free SRS resource Id list in this SRS resource set */
4871 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4873 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4875 if(rsrcIdList->list.array)
4877 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4879 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4881 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4883 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4884 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4887 /* Free resource type info for this SRS resource set */
4888 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4889 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4891 /* Free memory for each resource set */
4892 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4894 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4896 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4898 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4899 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4902 /* Free resource to add/modd list */
4903 if(srsCfg->srs_ResourceToAddModList)
4905 resourceList = srsCfg->srs_ResourceToAddModList;
4906 if(resourceList->list.array)
4909 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4910 sizeof(struct SRS_Resource__transmissionComb__n2));
4911 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4912 sizeof(struct SRS_Resource__resourceType__aperiodic));
4914 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4916 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4918 CU_FREE(resourceList->list.array, resourceList->list.size);
4920 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4921 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4924 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4926 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4930 /*******************************************************************
4932 * @brief Frees memory allocated for initialUplinkBWP
4936 * Function : FreeinitialUplinkBWP
4938 * Functionality: Deallocating memory of initialUplinkBWP
4940 * @params[in] UplinkConfig_t *ulCfg
4945 * ****************************************************************/
4946 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4948 BWP_UplinkDedicated_t *ulBwp=NULLP;
4949 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4951 if(ulCfg->initialUplinkBWP)
4953 ulBwp=ulCfg->initialUplinkBWP;
4954 if(ulCfg->firstActiveUplinkBWP_Id)
4956 if(ulCfg->pusch_ServingCellConfig)
4958 puschCfg=ulCfg->pusch_ServingCellConfig;
4959 if(puschCfg->choice.setup)
4961 if(puschCfg->choice.setup->ext1)
4963 CU_FREE(puschCfg->choice.setup->ext1->\
4964 processingType2Enabled,sizeof(BOOLEAN_t));
4965 CU_FREE(puschCfg->choice.setup->ext1->\
4966 maxMIMO_Layers,sizeof(long));
4967 CU_FREE(puschCfg->choice.setup->ext1, \
4968 sizeof(struct PUSCH_ServingCellConfig__ext1));
4970 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4972 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4974 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4976 FreeInitialUlBWP(ulBwp);
4977 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4980 /*******************************************************************
4982 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4986 * Function : FreeBWPDlDedPdschCfg
4988 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4990 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4995 * ****************************************************************/
4996 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4998 struct PDSCH_Config *pdschCfg=NULLP;
4999 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5000 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5001 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5003 if(dlBwp->pdsch_Config->choice.setup)
5005 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5006 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5008 if(pdschCfg->pdsch_TimeDomainAllocationList)
5010 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5011 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5013 prbBndlType=&pdschCfg->prb_BundlingType;
5014 CU_FREE(prbBndlType->choice.staticBundling,\
5015 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5016 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5018 FreePdschTimeDomAllocList(timeDomAllocList);
5019 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5020 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5022 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5023 if(dmrsDlCfg->choice.setup)
5025 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5027 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5029 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5030 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5032 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5035 /*******************************************************************
5037 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5041 * Function : FreeBWPDlDedPdcchCfg
5043 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5045 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5050 * ****************************************************************/
5051 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5055 struct PDCCH_Config *pdcchCfg=NULLP;
5056 struct ControlResourceSet *controlRSet=NULLP;
5057 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5059 if(dlBwp->pdcch_Config->choice.setup)
5061 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5062 if(pdcchCfg->controlResourceSetToAddModList)
5064 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5065 if(controlRSetList->list.array)
5067 controlRSet = controlRSetList->list.array[idx2];
5070 if(controlRSet->frequencyDomainResources.buf)
5072 if(controlRSet->pdcch_DMRS_ScramblingID)
5074 if(pdcchCfg->searchSpacesToAddModList)
5076 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5077 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5078 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5080 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5082 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5083 controlRSet->frequencyDomainResources.size);
5086 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5088 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5090 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5092 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5093 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5095 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5098 /*******************************************************************
5100 * @brief Builds RLC Config
5104 * Function : BuildRlcConfig
5106 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5108 * @params[in] RLC_Config *rlcConfig
5110 * @return ROK - success
5113 * ****************************************************************/
5114 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5117 rlcConfig->present = RLC_Config_PR_am;
5119 rlcConfig->choice.am = NULLP;
5120 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5121 if(!rlcConfig->choice.am)
5123 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5128 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5129 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5130 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5132 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5135 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5136 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5137 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5138 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5139 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5142 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5143 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5144 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5146 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5149 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5150 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5151 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5156 /*******************************************************************
5158 * @brief Builds MAC LC Config
5162 * Function : BuildMacLCConfig
5164 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5166 * @params[in] struct LogicalChannelConfig macLcConfig
5168 * @return ROK - success
5171 * ****************************************************************/
5172 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5175 macLcConfig->ul_SpecificParameters = NULLP;
5176 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5177 if(!macLcConfig->ul_SpecificParameters)
5179 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5183 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5184 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5185 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5186 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5187 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5188 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5189 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5191 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5192 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5193 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5195 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5198 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5200 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5201 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5202 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5204 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5207 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5209 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5210 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5211 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5215 /*******************************************************************
5217 * @brief Builds RLC Bearer to Add/Mod list
5221 * Function :BuildRlcBearerToAddModList
5223 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5225 * @params[in] rlc_BearerToAddModList
5227 * @return ROK - success
5230 * ****************************************************************/
5231 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5233 uint8_t idx, elementCnt;
5236 rlcBearerList->list.count = elementCnt;
5237 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5239 rlcBearerList->list.array = NULLP;
5240 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5241 if(!rlcBearerList->list.array)
5243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5247 for(idx=0; idx<rlcBearerList->list.count; idx++)
5249 rlcBearerList->list.array[idx] = NULLP;
5250 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5251 if(!rlcBearerList->list.array[idx])
5253 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5259 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5261 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5262 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5264 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5268 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5269 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5271 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5272 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5273 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5274 if(!rlcBearerList->list.array[idx]->rlc_Config)
5276 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5280 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5282 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5286 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5287 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5288 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5290 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5294 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5296 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5303 /*******************************************************************
5305 * @brief Free memory allocated for CellGroupConfig
5309 * Function : FreeMemCellGrpCfg
5311 * Functionality: Deallocating memory of CellGroupConfig
5313 * @params[in] pointer to CellGroupConfigRrc_t
5315 * @return ROK - success
5318 ******************************************************************/
5319 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5322 SpCellConfig_t *spCellCfg=NULLP;
5323 ServingCellConfig_t *srvCellCfg=NULLP;
5324 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5325 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5326 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5327 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5328 struct RLC_Config *rlcConfig=NULLP;
5329 struct LogicalChannelConfig *macLcConfig=NULLP;
5330 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5331 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5332 struct TAG_Config *tagConfig=NULLP;
5333 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5334 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5335 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5337 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5340 if(rlcBearerList->list.array)
5342 for(idx=0; idx<rlcBearerList->list.count; idx++)
5344 if(rlcBearerList->list.array[idx])
5346 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5347 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5350 if(rlcConfig->choice.am)
5352 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5353 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5354 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5356 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5358 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5361 if(macLcConfig->ul_SpecificParameters)
5363 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5364 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5365 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5367 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5369 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5372 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5374 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5377 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5380 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5381 if(schedulingRequestConfig)
5383 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5386 if(schReqList->list.array)
5388 for(idx=0;idx<schReqList->list.count; idx++)
5390 if(schReqList->list.array[idx])
5392 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5393 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5396 CU_FREE(schReqList->list.array, schReqList->list.size);
5398 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5399 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5400 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5402 if(macCellGrpCfg->bsr_Config)
5404 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5406 tagConfig = macCellGrpCfg->tag_Config;
5409 tagList = tagConfig->tag_ToAddModList;
5412 if(tagList->list.array)
5414 for(idx=0; idx<tagList->list.count; idx++)
5416 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5418 CU_FREE(tagList->list.array, tagList->list.size);
5420 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5422 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5425 phrConfig = macCellGrpCfg->phr_Config;
5428 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5429 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5432 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5435 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5438 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5439 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5442 spCellCfg = cellGrpCfg->spCellConfig;
5445 if(spCellCfg->servCellIndex)
5447 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5449 if(spCellCfg->spCellConfigDedicated)
5451 srvCellCfg = spCellCfg->spCellConfigDedicated;
5452 if(srvCellCfg->initialDownlinkBWP)
5454 dlBwp = srvCellCfg->initialDownlinkBWP;
5455 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5457 if(srvCellCfg->defaultDownlinkBWP_Id)
5459 if(srvCellCfg->uplinkConfig)
5461 if(srvCellCfg->pdsch_ServingCellConfig)
5463 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5464 if(pdschCfg->choice.setup)
5466 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5467 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5469 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5470 ServingCellConfig__pdsch_ServingCellConfig));
5472 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5473 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5475 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5477 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5479 if(dlBwp->pdcch_Config)
5481 if(dlBwp->pdsch_Config)
5483 FreeBWPDlDedPdschCfg(dlBwp);
5484 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5486 FreeBWPDlDedPdcchCfg(dlBwp);
5487 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5489 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5491 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5493 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5495 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5497 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5502 /*******************************************************************
5504 * @brief Fills CellGroupConfig
5508 * Function : fillCellGrpCfg
5510 * Functionality: Fills CellGroupConfig
5512 * @params[in] pointer to CellGroupConfigRrc_t
5514 * @return ROK - success
5517 ******************************************************************/
5519 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5521 uint8_t ret = RFAILED;
5522 CellGroupConfigRrc_t cellGrpCfg;
5523 asn_enc_rval_t encRetVal;
5527 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5529 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5530 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5531 if(!cellGrpCfg.rlc_BearerToAddModList)
5533 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5536 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5538 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5542 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5543 cellGrpCfg.mac_CellGroupConfig = NULLP;
5544 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5545 if(!cellGrpCfg.mac_CellGroupConfig)
5547 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5550 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5552 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5557 cellGrpCfg.physicalCellGroupConfig = NULLP;
5558 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5559 if(!cellGrpCfg.physicalCellGroupConfig)
5561 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5564 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5566 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5570 cellGrpCfg.spCellConfig = NULLP;
5571 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5572 if(!cellGrpCfg.spCellConfig)
5574 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5577 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5579 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5583 cellGrpCfg.sCellToAddModList = NULLP;
5584 cellGrpCfg.sCellToReleaseList = NULLP;
5585 cellGrpCfg.ext1 = NULLP;
5587 /* encode cellGrpCfg into duToCuRrcContainer */
5588 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5589 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5591 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5592 /* Encode results */
5593 if(encRetVal.encoded == ENCODE_FAIL)
5595 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5596 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5601 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5602 for(int i=0; i< encBufSize; i++)
5604 DU_LOG("%x",encBuf[i]);
5608 cellGrp->size = encBufSize;
5609 CU_ALLOC(cellGrp->buf, cellGrp->size);
5612 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5615 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5619 FreeMemCellGrpCfg(&cellGrpCfg);
5623 /*******************************************************************
5625 * @brief Free UE Capability RAT container
5629 * Function : freeUeCapRatCont
5632 * Free UE Capability RAT conatiner
5635 * @return ROK - success
5638 * ****************************************************************/
5639 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5642 FeatureSets_t *featureSets;
5644 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5646 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5648 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5649 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5651 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5654 if(ueNrCap->featureSets)
5656 featureSets = ueNrCap->featureSets;
5657 if(featureSets->featureSetsDownlinkPerCC)
5659 if(featureSets->featureSetsDownlinkPerCC->list.array)
5661 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5663 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5664 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5665 sizeof(ModulationOrder_t));
5666 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5668 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5670 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5673 if(featureSets->featureSetsUplinkPerCC)
5675 if(featureSets->featureSetsUplinkPerCC->list.array)
5677 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5679 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5681 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5682 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5683 sizeof(ModulationOrder_t));
5684 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5687 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5689 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5691 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5695 /*******************************************************************
5697 * @brief Free UE capability RAT container list
5701 * Function : freeUeCapRatContList
5703 * Functionality: Free UE capability RAT container list
5706 * @return ROK - success
5709 * ****************************************************************/
5710 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5713 if(ueCapablityList->list.array)
5715 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5717 if(ueCapablityList->list.array[idx])
5718 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5720 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5724 /*******************************************************************
5726 * @brief Fill feature sets
5730 * Function : fillFeatureSets
5732 * Functionality: Fill feature sets
5735 * @return ROK - success
5738 * ****************************************************************/
5739 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5741 uint8_t idx, elementCnt;
5743 featureSets->featureSetsDownlink = NULLP;
5744 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5745 if(!featureSets->featureSetsDownlinkPerCC)
5747 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5752 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5753 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5754 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5755 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5761 for(idx = 0; idx < elementCnt; idx++)
5763 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5764 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5766 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5772 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5773 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5774 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5775 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5776 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5778 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5779 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5781 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5784 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5786 featureSets->featureSetsUplink = NULLP;
5787 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5788 if(!featureSets->featureSetsUplinkPerCC)
5790 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5795 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5796 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5797 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5798 if(!featureSets->featureSetsUplinkPerCC->list.array)
5800 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5804 for(idx = 0; idx < elementCnt; idx++)
5806 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5807 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5809 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5815 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5816 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5817 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5818 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5819 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5820 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5822 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5823 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5825 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5828 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5833 /*******************************************************************
5835 * @brief Fill UE capability RAT container
5839 * Function : fillUeCapRatCont
5841 * Functionality: Fill UE capability RAT container
5843 * @params[in] UE Capability RAT container buffer
5844 * @return ROK - success
5847 * ****************************************************************/
5848 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5851 uint8_t idx, elementCnt;
5852 asn_enc_rval_t encRetVal;
5853 UE_NR_Capability_t ueNrCap;
5857 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5859 /* Filling PDCP parameters */
5860 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5861 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5862 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5863 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5864 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5865 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5866 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5867 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5868 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5869 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5870 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5871 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5872 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5873 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5874 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5875 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5876 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5878 ueNrCap.rlc_Parameters = NULLP;
5879 ueNrCap.mac_Parameters = NULLP;
5881 /* Filling PHY parameters */
5882 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5883 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5884 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5885 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5886 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5888 /* Filling RF parameters */
5890 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5891 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5892 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5893 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5895 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5900 for(idx = 0; idx < elementCnt; idx++)
5902 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5903 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
5913 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
5914 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
5915 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
5917 ueNrCap.measAndMobParameters = NULLP;
5918 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
5919 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
5920 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
5921 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
5922 ueNrCap.featureSets = NULLP;
5924 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
5925 if(!ueNrCap.featureSets)
5927 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5932 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
5934 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
5939 ueNrCap.featureSetCombinations = NULLP;
5940 ueNrCap.lateNonCriticalExtension = NULLP;
5941 ueNrCap.nonCriticalExtension = NULLP;
5943 /* encode UE Capability RAT Container List into duToCuRrcContainer */
5944 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
5945 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5947 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
5949 /* Encode results */
5950 if(encRetVal.encoded == ENCODE_FAIL)
5952 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
5953 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5958 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
5959 for(int i=0; i< encBufSize; i++)
5961 DU_LOG("%x",encBuf[i]);
5965 ueCapRatContBuf->size = encBufSize;
5966 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
5967 if(!ueCapRatContBuf->buf)
5969 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
5972 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
5976 freeUeCapRatCont(&ueNrCap);
5980 /*******************************************************************
5982 * @brief Fill UE Capability RAT container list
5986 * Function : fillUeCapRatContList
5988 * Functionality: Fill UE Capability RAT container list
5991 * @params[in] UE capability RAT container list buffer
5992 * @return ROK - success
5995 * ****************************************************************/
5996 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
5998 uint8_t ret = RFAILED;
5999 uint8_t idx, elementCnt;
6000 asn_enc_rval_t encRetVal;
6001 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6006 ueCapablityList.list.count = elementCnt;
6007 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6009 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6010 if(!ueCapablityList.list.array)
6012 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6017 for(idx=0; idx<elementCnt; idx++)
6019 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6020 if(ueCapablityList.list.array[idx] == NULLP)
6022 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6028 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6029 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6031 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6032 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6033 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6035 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6036 &ueCapablityList, PrepFinalEncBuf, encBuf);
6038 /* Encode results */
6039 if(encRetVal.encoded == ENCODE_FAIL)
6041 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6042 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6047 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6048 for(int i=0; i< encBufSize; i++)
6050 DU_LOG("%x",encBuf[i]);
6054 ueCapablityListBuf->size = encBufSize;
6055 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6056 if(!ueCapablityListBuf->buf)
6058 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6061 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6065 freeUeCapRatContList(&ueCapablityList);
6069 /*******************************************************************
6071 * @brief Fills CuToDuContainer
6075 * Function : fillCuToDuContainer
6077 * Functionality: Fills CuToDuContainer
6079 * @params[in] pointer to CUtoDURRCInformation_t
6081 * @return ROK - success
6084 ******************************************************************/
6086 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6088 uint8_t elementCnt = 0;
6090 uint8_t idx, idx2, rrcBufLen;
6092 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6093 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6095 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6098 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6100 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6101 if(rrcMsg->iE_Extensions)
6104 rrcMsg->iE_Extensions->list.count = elementCnt;
6105 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6107 /* Initialize the CUtoDURRCInformation_ExtIEs */
6108 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6110 if(rrcMsg->iE_Extensions->list.array == NULLP)
6112 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6116 for(idx=0; idx<elementCnt; idx++)
6118 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6119 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6125 /* Filling CellGroupConfig_t IE */
6126 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6127 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6128 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6129 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6130 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6135 /*******************************************************************
6137 * @brief Free CuToDuContainer
6141 * Function : FreeCuToDuInfo
6143 * Functionality: Free CuToDuContainer
6145 * @params[in] pointer to CUtoDURRCInformation_t
6147 * @return ROK - success
6150 ******************************************************************/
6152 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6156 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6158 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6159 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6160 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6162 if(rrcMsg->iE_Extensions)
6164 if(rrcMsg->iE_Extensions->list.array)
6166 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6168 if(rrcMsg->iE_Extensions->list.array[idx])
6170 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6172 case ProtocolIE_ID_id_CellGroupConfig:
6173 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6175 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6176 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6181 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6182 rrcMsg->iE_Extensions->list.array[idx]->id);
6188 for(idx2 = 0; idx2 < idx; idx2++)
6190 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6192 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6196 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6199 /*******************************************************************
6201 * @brief Builds and sends the UE Setup Request
6205 * Function : BuildAndSendUeContextSetupReq
6207 * Functionality: Constructs the UE Setup Request and sends
6208 * it to the CU through SCTP.
6212 * @return ROK - success
6215 * ****************************************************************/
6216 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6217 uint16_t rrcContLen, uint8_t *rrcContainer)
6220 uint8_t SplCellListret;
6221 uint8_t SrbSetupret;
6223 uint8_t idx, bufLen;
6225 F1AP_PDU_t *f1apMsg = NULLP;
6226 UEContextSetupRequest_t *ueSetReq = NULLP;
6227 asn_enc_rval_t encRetVal; /* Encoder return value */
6228 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6229 uint8_t ret= RFAILED;
6233 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6235 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6236 if(f1apMsg == NULLP)
6238 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6242 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6243 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6244 if(f1apMsg->choice.initiatingMessage == NULLP)
6246 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6250 f1apMsg->choice.initiatingMessage->procedureCode = \
6251 ProcedureCode_id_UEContextSetup;
6252 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6253 f1apMsg->choice.initiatingMessage->value.present = \
6254 InitiatingMessage__value_PR_UEContextSetupRequest;
6256 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6259 ueSetReq->protocolIEs.list.count = elementCnt;
6260 ueSetReq->protocolIEs.list.size = \
6261 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6263 /* Initialize the UESetup members */
6264 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6266 if(ueSetReq->protocolIEs.list.array == NULLP)
6268 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6272 for(idx1=0; idx1<elementCnt; idx1++)
6274 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6275 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6283 /*GNB CU UE F1AP ID*/
6284 ueSetReq->protocolIEs.list.array[idx]->id = \
6285 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6286 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6287 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6288 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6289 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6291 /*GNB DU UE F1AP ID*/
6293 ueSetReq->protocolIEs.list.array[idx]->id = \
6294 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6295 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6296 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6297 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6298 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6302 ueSetReq->protocolIEs.list.array[idx]->id = \
6303 ProtocolIE_ID_id_SpCell_ID;
6304 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6305 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6306 UEContextSetupRequestIEs__value_PR_NRCGI;
6307 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6313 /*Served Cell Index*/
6315 ueSetReq->protocolIEs.list.array[idx]->id = \
6316 ProtocolIE_ID_id_ServCellIndex;
6317 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6318 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6319 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6320 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6323 /*CellULConfigured*/
6325 ueSetReq->protocolIEs.list.array[idx]->id = \
6326 ProtocolIE_ID_id_SpCellULConfigured;
6327 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6328 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6329 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6330 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6331 CellULConfigured_none;
6333 /*CUtoDURRCContainer*/
6335 ueSetReq->protocolIEs.list.array[idx]->id = \
6336 ProtocolIE_ID_id_CUtoDURRCInformation;
6337 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6338 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6339 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6340 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6345 /*Special Cells to be SetupList*/
6347 ueSetReq->protocolIEs.list.array[idx]->id = \
6348 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6349 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6350 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6351 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6352 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6353 if(SplCellListret != ROK)
6357 /*SRBs To Be Setup List*/
6359 ueSetReq->protocolIEs.list.array[idx]->id = \
6360 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6361 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6362 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6363 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6364 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6365 if(SrbSetupret != ROK)
6369 /*DRBs to Be Setup List*/
6371 ueSetReq->protocolIEs.list.array[idx]->id = \
6372 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6373 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6374 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6375 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6376 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6381 /* RRC Container for security mode */
6383 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6384 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6385 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6386 UEContextSetupRequestIEs__value_PR_RRCContainer;
6387 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6389 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6390 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6391 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6392 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6394 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6397 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6398 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6400 /* RRC delivery status request */
6402 ueSetReq->protocolIEs.list.array[idx]->id = \
6403 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6404 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6405 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6406 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6407 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6408 RRCDeliveryStatusRequest_true;
6410 /* Bit Rate hardcoded as in reference logs */
6412 ueSetReq->protocolIEs.list.array[idx]->id = \
6413 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6414 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6415 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6416 UEContextSetupRequestIEs__value_PR_BitRate;
6417 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6419 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6420 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6421 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6422 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6424 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6427 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6428 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6430 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6432 /* Encode the F1SetupRequest type as APER */
6433 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6435 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6437 /* Encode results */
6438 if(encRetVal.encoded == ENCODE_FAIL)
6440 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6441 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6446 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6447 for(int i=0; i< encBufSize; i++)
6449 DU_LOG("%x",encBuf[i]);
6454 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6456 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6462 FreeUeContextSetupReq(f1apMsg);
6465 }/* End of BuildAndSendUeContextSetupReq*/
6467 /****************************************************************
6468 * @brief Function to process Ul Rrc Msg received from DU
6472 * Function : procUlRrcMsg
6475 * - Function to process Ul Rrc Msg received from DU
6478 * @return ROK - success
6481 * ****************************************************************/
6483 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6485 uint8_t idx, ret, srbId, rrcMsgType;
6486 uint8_t cuUeF1apId, duUeF1apId;
6487 uint8_t *rrcContainer = NULLP;
6488 uint16_t rrcContLen;
6489 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6492 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6494 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6496 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6498 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6500 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6503 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6505 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6508 case ProtocolIE_ID_id_SRBID:
6509 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6511 case ProtocolIE_ID_id_RRCContainer:
6513 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6514 CU_ALLOC(rrcContainer, rrcContLen)
6517 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6520 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6526 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6532 f1apMsgDb.dlRrcMsgCount++;
6533 rrcMsgType = setDlRRCMsgType();
6534 if(rrcMsgType == REGISTRATION_ACCEPT)
6536 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6537 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6539 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6541 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6542 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6543 rrcContLen, rrcContainer);
6545 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6547 /* To trigger the DL RRC Msg for RRC Reconfig */
6548 f1apMsgDb.dlRrcMsgCount++;
6549 rrcMsgType = setDlRRCMsgType();
6550 if(rrcMsgType == RRC_RECONFIG)
6552 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6553 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6556 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6558 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6559 BuildAndSendUeContextModificationReq();
6565 /****************************************************************
6566 * @brief Build And Send F1ResetAck
6570 * Function : FreeF1ResetAck
6573 * - Build And Send F1ResetRSP
6576 * @return ROK - success
6579 * ****************************************************************/
6580 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6583 ResetAcknowledge_t *f1ResetAck;
6587 if(f1apMsg->choice.successfulOutcome)
6589 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6591 if(f1ResetAck->protocolIEs.list.array)
6593 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6595 if(f1ResetAck->protocolIEs.list.array[idx])
6597 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6600 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6602 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6604 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6608 /****************************************************************
6609 * @brief Build And Send F1ResetAck
6613 * Function : BuildAndSendF1ResetAck
6616 * - Build And Send F1ResetRSP
6619 * @return ROK - success
6622 * ****************************************************************/
6624 uint8_t BuildAndSendF1ResetAck()
6627 uint8_t elementCnt = 0;
6628 uint8_t ret = RFAILED;
6629 F1AP_PDU_t *f1apMsg = NULL;
6630 ResetAcknowledge_t *f1ResetAck = NULLP;
6631 asn_enc_rval_t encRetVal;
6632 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6635 /* Allocate the memory for F1ResetRequest_t */
6636 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6637 if(f1apMsg == NULLP)
6639 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6643 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6645 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6646 if(f1apMsg->choice.successfulOutcome == NULLP)
6648 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6652 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6653 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6654 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6655 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6659 f1ResetAck->protocolIEs.list.count = elementCnt;
6660 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6662 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6663 if(f1ResetAck->protocolIEs.list.array == NULLP)
6665 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6669 for(idx=0; idx<elementCnt; idx++)
6671 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6672 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6679 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6680 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6681 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6682 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6684 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6686 /* Encode the F1SetupRequest type as UPER */
6687 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6689 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6691 /* Check encode results */
6692 if(encRetVal.encoded == ENCODE_FAIL)
6694 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6695 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6700 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6701 for(int i=0; i< encBufSize; i++)
6703 DU_LOG("%x",encBuf[i]);
6707 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6709 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6717 FreeF1ResetAck(f1apMsg);
6720 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6724 if(ulInfo->list.array)
6726 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6728 if(ulInfo->list.array[arrIdx])
6730 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6732 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6734 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6736 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6737 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6738 gTPTunnel->gTP_TEID.size);
6740 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6741 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6742 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6744 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6745 sizeof(GTPTunnel_t));
6747 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6750 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6753 /*******************************************************************
6755 * @brief Builds the Uplink Tunnel Info
6759 * Function : BuildUlTnlInfoforDrb2
6761 * Functionality: Constructs the UL TnlInfo For DRB list
6763 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6765 * @return ROK - success
6768 * ****************************************************************/
6769 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6775 ulInfo->list.count = ulCnt;
6776 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6777 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6778 if(ulInfo->list.array == NULLP)
6780 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6783 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6785 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6786 if(ulInfo->list.array[arrIdx] == NULLP)
6788 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6794 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6795 UPTransportLayerInformation_PR_gTPTunnel;
6798 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6799 sizeof(GTPTunnel_t));
6800 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6802 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6805 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6806 transportLayerAddress.size = 4*sizeof(uint8_t);
6807 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6808 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6809 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6810 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6811 transportLayerAddress.buf == NULLP)
6813 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6817 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6818 transportLayerAddress.buf[0] = 192;
6819 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6820 transportLayerAddress.buf[1] = 168;
6821 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6822 transportLayerAddress.buf[2] = 130;
6823 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6824 transportLayerAddress.buf[3] = 82;
6825 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6826 transportLayerAddress.bits_unused = 0;
6829 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6830 = 4 * sizeof(uint8_t);
6831 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6832 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6833 gTPTunnel->gTP_TEID.size);
6834 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6837 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6840 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6841 gTP_TEID.buf[0] = 0;
6842 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6843 gTP_TEID.buf[1] = 0;
6844 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6845 gTP_TEID.buf[2] = 0;
6846 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6847 gTP_TEID.buf[3] = 2;
6850 }/*End of BuildULTnlInfo*/
6851 /*******************************************************************
6853 * @brief freeing the DRB 2 item
6857 * Function : FreeDrb2Item
6859 * Functionality: freeing the DRB 2 item
6861 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6863 * @return ROK - success
6866 * ****************************************************************/
6868 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6871 SNSSAI_t *snssai =NULLP;
6872 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6874 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6875 switch(drbItem->qoSInformation.present)
6877 case QoSInformation_PR_NOTHING:
6879 case QoSInformation_PR_eUTRANQoS:
6881 if(drbItem->qoSInformation.choice.eUTRANQoS)
6883 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6887 case QoSInformation_PR_choice_extension:
6889 if(drbItem->qoSInformation.choice.choice_extension)
6891 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6893 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
6896 CU_FREE(snssai->sST.buf,snssai->sST.size);
6902 CU_FREE(snssai->sD->buf,snssai->sD->size);
6904 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
6907 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
6908 if(flowMap->list.array)
6910 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
6912 if(flowMap->list.array[arrIdx] )
6914 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
6915 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
6918 CU_FREE(flowMap->list.array,flowMap->list.size);
6921 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6927 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
6928 if(drbItem->uLConfiguration)
6930 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
6933 /*******************************************************************
6935 * @brief filling the DRB 2 item
6939 * Function : FillDrb2Item
6941 * Functionality: filling the DRB 2 item
6943 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6945 * @return ROK - success
6948 * ****************************************************************/
6950 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6955 drbItem->dRBID = DRB2;
6958 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6960 switch(drbItem->qoSInformation.present)
6962 case QoSInformation_PR_NOTHING:
6966 case QoSInformation_PR_eUTRANQoS:
6969 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6970 if(drbItem->qoSInformation.choice.eUTRANQoS)
6972 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
6975 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
6976 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
6977 PriorityLevel_no_priority;
6979 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
6980 Pre_emptionCapability_may_trigger_pre_emption;
6982 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
6983 Pre_emptionVulnerability_pre_emptable;
6987 case QoSInformation_PR_choice_extension:
6989 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6990 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
6992 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
6996 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
6997 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
6998 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
6999 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7002 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7007 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7008 choice_extension->value.choice.DRB_Information.sNSSAI);
7011 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7015 /*Flows mapped to DRB List*/
7016 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7017 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7020 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7026 /*ULUPTNLInformation To Be Setup List*/
7027 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7030 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7035 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7037 /*UL Configuration*/
7038 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7039 if(drbItem->uLConfiguration == NULLP)
7041 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7044 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7047 /*******************************************************************
7049 * @brief Builds the DRB to be Setup Mod ItemIes
7053 * Function : FillDrbItemList
7055 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7057 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7059 * @return ROK - success
7062 * ****************************************************************/
7064 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7066 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7067 drbItemIe->criticality = Criticality_reject;
7068 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7070 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7072 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7077 /*******************************************************************
7079 * @brief free the DRB to be Setup Mod list
7083 * Function : FreeDrbToBeSetupModList
7085 * Functionality: free the DRB to be Setup Mod list
7087 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7089 * @return ROK - success
7092 * ****************************************************************/
7093 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7096 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7098 if(drbSet->list.array)
7100 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7102 if(drbSet->list.array[arrIdx] != NULLP)
7106 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7107 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7109 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7112 CU_FREE(drbSet->list.array, drbSet->list.size);
7118 /*******************************************************************
7120 * @brief Builds the DRB to be Setup Mod list
7124 * Function : BuildDrbToBeSetupModList
7126 * Functionality: Constructs the DRB to be Setup Mod list
7128 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7130 * @return ROK - success
7133 * ****************************************************************/
7135 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7142 drbSet->list.count = drbCnt;
7143 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7144 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7145 if(drbSet->list.array == NULLP)
7147 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7150 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7152 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7153 if(drbSet->list.array[arrIdx] == NULLP)
7155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7161 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7164 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7169 /*******************************************************************
7171 * @brief free the UeContextModification Request
7175 * Function : FreeUeContextModicationRequest
7177 * Functionality : deallocation of memory allocated in UeContextModiification
7180 * @params[in] F1AP_PDU_t *f1apMsg
7184 * ****************************************************************/
7185 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7187 uint8_t arrIdx =0 , ieId=0;
7188 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7192 if(f1apMsg->choice.initiatingMessage)
7194 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7195 if(UeContextModifyReq->protocolIEs.list.array)
7197 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7199 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7201 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7204 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7206 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7208 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7210 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7211 choice.DRBs_ToBeSetupMod_List);
7215 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7218 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7220 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7222 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7225 /*******************************************************************
7227 * @brief Builds the Ue Context Modification Req
7231 * Function : BuildAndSendUeContextModificationReq
7233 * Functionality: Constructs the Ue Context Modification Req
7237 * @return ROK - success
7240 * ****************************************************************/
7241 uint8_t BuildAndSendUeContextModificationReq()
7244 uint8_t elementCnt = 0;
7245 uint8_t ret = RFAILED;
7246 F1AP_PDU_t *f1apMsg = NULLP;
7247 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7249 asn_enc_rval_t encRetVal;
7250 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7254 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7255 if(f1apMsg == NULLP)
7257 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7261 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7263 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7264 if(f1apMsg->choice.initiatingMessage == NULLP)
7266 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7269 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7270 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7271 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7273 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7276 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7277 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7279 /* Initialize the UE context modification members */
7280 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7281 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7283 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7287 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7289 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7290 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7292 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7299 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7302 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7303 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
7306 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7307 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7308 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7309 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7310 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
7313 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7314 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7315 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7316 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7317 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7318 value.choice.DRBs_ToBeSetupMod_List));
7323 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7325 /* Encode the F1SetupRequest type as APER */
7326 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7328 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7331 /* Encode results */
7332 if(encRetVal.encoded == ENCODE_FAIL)
7334 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7335 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7340 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7341 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7343 DU_LOG("%x",encBuf[ieIdx]);
7347 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7349 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7357 FreeUeContextModicationRequest(f1apMsg);
7360 /*****************************************************************i
7362 * @brief Free memory allocated for UE Context Release Command
7366 * Function : FreeUeContextReleaseCommand
7369 * - Free memory allocated for UE Context Release Command
7371 * @params[in] F1AP_PDU_t *f1apMsg
7374 * *************************************************************/
7375 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
7378 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
7382 if(f1apMsg->choice.initiatingMessage)
7384 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7385 if(ueReleaseCommand->protocolIEs.list.array)
7387 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
7389 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7391 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
7393 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7395 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7398 /*******************************************************************
7400 * @brief Builds the Ue Context Release Command
7404 * Function : BuildAndSendUeContextReleaseCommand
7406 * Functionality: Constructs the Ue Context Release Command
7410 * @return ROK - success
7413 * ****************************************************************/
7414 uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1apId)
7416 bool memAllocFailed = false;
7417 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
7418 F1AP_PDU_t *f1apMsg = NULLP;
7419 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
7421 asn_enc_rval_t encRetVal;
7422 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
7426 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7427 if(f1apMsg == NULLP)
7429 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
7433 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7435 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7436 if(f1apMsg->choice.initiatingMessage == NULLP)
7438 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
7441 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
7442 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7443 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
7445 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
7448 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
7449 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
7451 /* Initialize the UE context modification members */
7452 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
7453 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
7455 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
7459 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7461 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
7462 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
7464 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
7465 memAllocFailed = true;
7470 if(memAllocFailed == true)
7475 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7476 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7477 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7478 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
7479 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
7482 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7483 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7484 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7485 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
7486 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
7489 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
7490 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7491 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
7492 UEContextReleaseCommandIEs__value_PR_Cause;
7493 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7494 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
7495 CauseRadioNetwork_normal_release;
7497 /* RRC Container for RRC release */
7499 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
7500 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
7501 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
7502 UEContextReleaseCommandIEs__value_PR_RRCContainer;
7503 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
7505 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
7506 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7507 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7508 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7510 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
7513 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
7514 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
7516 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7518 /* Encode the UE Context Release Command type as APER */
7519 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7521 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7524 /* Encode results */
7525 if(encRetVal.encoded == ENCODE_FAIL)
7527 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
7528 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7533 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
7534 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7536 DU_LOG("%x",encBuf[ieIdx]);
7540 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7542 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
7550 FreeUeContextReleaseCommand(f1apMsg);
7553 /*******************************************************************
7555 * @brief process Ue context release request
7559 * Function : procUeContextReleaseReq
7562 * - process Ue context release request
7564 * @params[in] F1AP_PDU_t *f1apMsg
7565 * @return ROK - success
7568 * ****************************************************************/
7569 uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
7571 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
7573 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
7574 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
7576 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
7578 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
7580 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7582 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7585 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7587 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7594 if(BuildAndSendUeContextReleaseCommand(cuUeF1apId, duUeF1apId) != ROK)
7596 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
7601 /*******************************************************************
7603 * @brief Handles received F1AP message and sends back response
7607 * Function : F1APMsgHdlr
7610 * - Decodes received F1AP control message
7611 * - Prepares response message, encodes and sends to SCTP
7614 * @return ROK - success
7617 * ****************************************************************/
7618 void F1APMsgHdlr(Buffer *mBuf)
7624 F1AP_PDU_t *f1apMsg = NULLP;
7625 asn_dec_rval_t rval; /* Decoder return value */
7626 F1AP_PDU_t f1apasnmsg ;
7628 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7629 ODU_PRINT_MSG(mBuf, 0,0);
7631 /* Copy mBuf into char array to decode it */
7632 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7633 CU_ALLOC(recvBuf, (Size)recvBufLen);
7635 if(recvBuf == NULLP)
7637 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
7640 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7642 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
7646 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
7647 for(i=0; i< recvBufLen; i++)
7649 DU_LOG("%x",recvBuf[i]);
7652 /* Decoding flat buffer into F1AP messsage */
7653 f1apMsg = &f1apasnmsg;
7654 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7656 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7657 CU_FREE(recvBuf, (Size)recvBufLen);
7659 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7661 DU_LOG("\nERROR --> F1AP : ASN decode failed");
7665 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7667 switch(f1apMsg->present)
7669 case F1AP_PDU_PR_initiatingMessage:
7671 switch(f1apMsg->choice.initiatingMessage->value.present)
7673 case InitiatingMessage__value_PR_Reset:
7675 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
7676 BuildAndSendF1ResetAck();
7680 case InitiatingMessage__value_PR_F1SetupRequest:
7682 DU_LOG("\nINFO --> F1AP : F1 setup request received");
7683 BuildAndSendF1SetupRsp();
7687 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7689 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
7690 BuildAndSendDUUpdateAck();
7691 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7692 BuildAndSendF1ResetReq();
7695 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7697 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
7698 procInitULRRCMsg(f1apMsg);
7701 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7703 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
7704 procUlRrcMsg(f1apMsg);
7708 case InitiatingMessage__value_PR_RRCDeliveryReport:
7710 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
7713 case InitiatingMessage__value_PR_UEContextReleaseRequest:
7715 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
7716 procUeContextReleaseReq(f1apMsg);
7721 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
7722 f1apMsg->choice.initiatingMessage->value.present);
7725 }/* End of switch(initiatingMessage) */
7729 case F1AP_PDU_PR_successfulOutcome:
7731 switch(f1apMsg->choice.successfulOutcome->value.present)
7733 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7735 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
7738 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7740 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
7741 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7744 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
7746 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
7749 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
7751 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
7756 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
7757 f1apMsg->choice.successfulOutcome->value.present);
7760 }/* End of switch(successfulOutcome) */
7765 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7768 }/* End of switch(f1apMsg->present) */
7770 } /* End of F1APMsgHdlr */
7772 /**********************************************************************
7774 **********************************************************************/