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 */
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("\nF1AP : SCTP Send failed");
204 ODU_PUT_MSG_BUF(mBuf);
210 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
211 ODU_PUT_MSG_BUF(mBuf);
214 ODU_PUT_MSG_BUF(mBuf);
218 DU_LOG("\nF1AP : 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("\nF1AP : Building F1 Setup Response\n");
280 /* Allocate the memory for F1SetupRequest_t */
281 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
284 DU_LOG("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
635 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
640 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
641 for(int i=0; i< encBufSize; i++)
643 printf("%x",encBuf[i]);
648 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
650 DU_LOG("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
766 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
767 for(int i=0; i< encBufSize; i++)
769 printf("%x",encBuf[i]);
774 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
776 DU_LOG("\nF1AP : 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("\nF1AP : Building F1 Reset request \n");
850 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
853 DU_LOG("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : 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("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
925 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
930 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
931 for(idx=0; idx< encBufSize; idx++)
933 printf("%x",encBuf[idx]);
937 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
939 DU_LOG("\nF1AP : 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( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1144 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1149 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1150 for(int i = 0; i< encBufSize; i++)
1152 printf("%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("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1179 DU_LOG("\nF1AP: 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("\nF1AP: 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("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1271 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1277 DU_LOG("\nF1AP: 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("\n 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("\n 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( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1458 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1463 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1464 for(int i = 0; i< encBufSize; i++)
1466 printf("%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("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1487 DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1493 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1499 DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1505 DU_LOG("\nF1AP: 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("\n 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("\n F1AP : Building DL RRC Message Transfer Message\n");
1611 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1612 if(f1apMsg == NULLP)
1614 DU_LOG(" 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(" 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(" 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( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1710 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1715 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1716 for(int i=0; i< encBufSize; i++)
1718 printf("%x",encBuf[i]);
1723 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1725 DU_LOG("\n 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;
1776 /*******************************************************************
1778 * @brief Function to build Initial UL RRC Message
1782 * Function : procInitULRRCMsg
1784 * Functionality: Function to build Initial UL RRC Message
1788 * @return ROK - success
1791 * ****************************************************************/
1793 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1795 uint8_t idx, rrcMsgType;
1797 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1798 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1800 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1802 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1804 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1806 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1808 case ProtocolIE_ID_id_NRCGI:
1810 case ProtocolIE_ID_id_C_RNTI:
1812 case ProtocolIE_ID_id_RRCContainer:
1814 case ProtocolIE_ID_id_DUtoCURRCContainer:
1816 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1817 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1818 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1820 DU_LOG("\n Received Du to Cu RRC Container ");
1821 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1822 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1823 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1824 f1apMsgDb.duToCuContainer.size);
1825 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1827 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1828 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1829 .duToCuContainer.size);
1834 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1840 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1846 f1apMsgDb.dlRrcMsgCount++;
1847 rrcMsgType = setDlRRCMsgType();
1848 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1853 /*******************************************************************
1855 * @brief Builds Nrcgi
1859 * Function : BuildNrcgi
1861 * Functionality: Building the PLMN ID and NR Cell id
1863 * @params[in] NRCGI_t *nrcgi
1864 * @return ROK - success
1867 * ****************************************************************/
1868 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1871 uint8_t unused_bits = 4;
1872 uint8_t byteSize = 5;
1874 /* Allocate Buffer Memory */
1875 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1876 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1877 if(nrcgi->pLMN_Identity.buf == NULLP)
1881 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1887 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1888 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1889 if(nrcgi->nRCellIdentity.buf == NULLP)
1894 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1900 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1901 nrcgi->nRCellIdentity.buf[0] |= val;
1902 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1906 /*******************************************************************
1908 * @brief Builds Special cell list for UE Setup Request
1912 * Function : BuildSplCellList
1914 * Functionality: Constructs the Special Cell list for UESetReq
1916 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1918 * @return ROK - success
1921 * ****************************************************************/
1922 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1928 spCellLst->list.count = cellCnt;
1929 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1930 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1931 if(spCellLst->list.array == NULLP)
1935 for(idx=0; idx<cellCnt; idx++)
1937 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1938 if(spCellLst->list.array[idx] == NULLP)
1944 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1945 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1946 spCellLst->list.array[idx]->value.present =\
1947 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1948 /* Special Cell ID -NRCGI */
1949 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1954 /*Special Cell Index*/
1955 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1957 }/* End of BuildSplCellList*/
1959 /*******************************************************************
1961 * @brief Builds SRBS to be setup
1965 * Function : BuildSRBSetup
1967 * Functionality: Constructs the SRB's for UESetReq
1969 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1971 * @return ROK - success
1974 * ****************************************************************/
1975 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1980 srbSet->list.count = srbCnt;
1981 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1982 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1983 if(srbSet->list.array == NULLP)
1987 for(idx=0; idx<srbCnt; idx++)
1989 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1990 if(srbSet->list.array[idx] == NULLP)
1996 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1997 srbSet->list.array[idx]->criticality = Criticality_ignore;
1998 srbSet->list.array[idx]->value.present = \
1999 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2000 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2002 }/* End of BuildSRBSetup*/
2004 /*******************************************************************
2006 * @brief Builds QOS Info for DRB Setum Item
2010 * Function : BuildQOSInfo
2012 * Functionality: Constructs the QOS Info for DRB Setup Item
2014 * @params[in] QoSInformation_t *qosinfo
2016 * @return ROK - success
2019 * ****************************************************************/
2020 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2022 /* NonDynamic5QIDescriptor */
2023 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2024 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2025 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2030 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2032 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2033 sizeof(AveragingWindow_t));
2034 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2039 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2040 /*MaxDataBurstVolume*/
2041 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2042 sizeof(MaxDataBurstVolume_t));
2043 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2048 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2050 /*nRGRAN Allocation Retention Priority*/
2051 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2052 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2053 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2055 /* TO DO: GBR_QoSFlowInformation */
2057 }/*End of BuildQOSInfo*/
2059 /*******************************************************************
2061 * @brief Builds SNSSAI
2065 * Function : BuildSNSSAI
2067 * Functionality: Constructs the SNSSAI For DRB list
2069 * @params[in] SNSSAI_t *snssai
2071 * @return ROK - success
2074 * ****************************************************************/
2075 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2079 snssai->sST.size = sizeof(uint8_t);
2080 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2081 if(snssai->sST.buf == NULLP)
2085 snssai->sST.buf[0] = 3;
2087 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2088 if(snssai->sD == NULLP)
2092 snssai->sD->size = 3*sizeof(uint8_t);
2093 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2094 if(snssai->sD->buf == NULLP)
2098 snssai->sD->buf[0] = 3;
2099 snssai->sD->buf[1] = 6;
2100 snssai->sD->buf[2] = 9;
2102 }/*End of BuildSNSSAI*/
2104 /*******************************************************************
2106 * @brief Builds the flow map.
2110 * Function : BuildFlowsMap
2112 * Functionality: Constructs the flowmap For DRB list
2114 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2116 * @return ROK - success
2119 * ****************************************************************/
2120 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2126 flowMap->list.count = flowCnt;
2127 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2128 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2129 if(flowMap->list.array == NULLP)
2133 for(idx=0; idx<flowCnt; idx++)
2135 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2136 if(flowMap->list.array[idx] == NULLP)
2142 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2143 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2149 }/*End of BuildFlowsMap*/
2151 /*******************************************************************
2153 * @brief Builds the Uplink Tunnel Info
2157 * Function : BuildULTnlInfo
2159 * Functionality: Constructs the UL TnlInfo For DRB list
2161 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2163 * @return ROK - success
2166 * ****************************************************************/
2167 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2172 ulInfo->list.count = ulCnt;
2173 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2174 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2175 if(ulInfo->list.array == NULLP)
2179 for(idx=0; idx<ulCnt; idx++)
2181 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2182 if(ulInfo->list.array[idx] == NULLP)
2188 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2189 UPTransportLayerInformation_PR_gTPTunnel;
2191 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2192 sizeof(GTPTunnel_t));
2193 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2197 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2198 transportLayerAddress.size = 4*sizeof(uint8_t);
2199 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2200 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2201 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2202 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2203 transportLayerAddress.buf == NULLP)
2207 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2208 transportLayerAddress.buf[0] = 4;
2209 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2210 transportLayerAddress.buf[1] = 4;
2211 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2212 transportLayerAddress.buf[2] = 4;
2213 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2214 transportLayerAddress.buf[3] = 5;
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 transportLayerAddress.bits_unused = 0;
2218 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2219 = 4 * sizeof(uint8_t);
2220 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2221 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2222 gTPTunnel->gTP_TEID.size);
2223 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2228 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2229 gTP_TEID.buf[0] = 11;
2230 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2231 gTP_TEID.buf[1] = 0;
2232 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2233 gTP_TEID.buf[2] = 0;
2234 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2235 gTP_TEID.buf[3] = 2;
2238 }/*End of BuildULTnlInfo*/
2240 /*******************************************************************
2242 * @brief Builds DRBS to be setup
2246 * Function : BuildDRBSetup
2248 * Functionality: Constructs the DRB's for UESetReq
2250 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2252 * @return ROK - success
2255 * ****************************************************************/
2256 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2258 uint8_t BuildQOSInforet;
2259 uint8_t BuildSNSSAIret;
2260 uint8_t BuildFlowsMapret;
2261 uint8_t BuildULTnlInforet;
2264 DRBs_ToBeSetup_Item_t *drbSetItem;
2266 drbSet->list.count = drbCnt;
2267 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2268 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2269 if(drbSet->list.array == NULLP)
2273 for(idx=0; idx<drbCnt; idx++)
2275 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2276 if(drbSet->list.array[idx] == NULLP)
2282 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2283 drbSet->list.array[idx]->criticality = Criticality_ignore;
2284 drbSet->list.array[idx]->value.present = \
2285 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2286 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2288 drbSetItem->dRBID = 1;
2290 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2291 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2292 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2296 drbSetItem->qoSInformation.choice.choice_extension->id = \
2297 ProtocolIE_ID_id_DRB_Information;
2298 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2300 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2301 QoSInformation_ExtIEs__value_PR_DRB_Information;
2302 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2303 choice_extension->value.choice.DRB_Information.dRB_QoS);
2304 if(BuildQOSInforet != ROK)
2309 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2310 choice_extension->value.choice.DRB_Information.sNSSAI);
2311 if(BuildSNSSAIret != ROK)
2315 /*Flows mapped to DRB List*/
2316 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2317 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2318 if(BuildFlowsMapret != ROK)
2322 /*ULUPTNLInformation To Be Setup List*/
2323 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2324 if(BuildULTnlInforet != ROK)
2329 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2331 /*UL Configuration*/
2332 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2333 if(drbSetItem->uLConfiguration == NULLP)
2337 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2339 }/* End of BuildDRBSetup*/
2341 /*******************************************************************
2343 * @brief Deallocating memory of function BuildAndSendUESetReq
2347 * Function : FreeNrcgi
2349 * Functionality: Deallocating memory for function BuildNrcgi
2351 * @params[in] NRCGI_t *nrcgi
2355 *******************************************************************/
2356 void FreeNrcgi(NRCGI_t *nrcgi)
2358 if(nrcgi->pLMN_Identity.buf != NULLP)
2360 if(nrcgi->nRCellIdentity.buf != NULLP)
2362 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2364 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2367 /*******************************************************************
2369 * @brief Deallocating memory of function BuildAndSendUESetReq
2373 * Function : FreeSplCellList
2375 * Functionality: Deallocating memory for function BuildSplCellList
2377 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2382 * *****************************************************************/
2383 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2386 if(spCellLst->list.array != NULLP)
2388 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2390 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2392 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2394 if(spCellLst->list.array[cellidx]!=NULLP)
2396 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2399 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2402 /*******************************************************************
2404 * @brief Deallocating memory of function BuildAndSendUESetReq
2408 * Function : FreeSRBSetup
2410 * Functionality: Deallocating memory for function BuildSRBSetup
2412 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2417 * ******************************************************************/
2418 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2421 if(srbSet->list.array != NULLP)
2423 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2425 if(srbSet->list.array[srbidx]!=NULLP)
2427 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2430 CU_FREE(srbSet->list.array,srbSet->list.size);
2433 /*******************************************************************
2435 * @brief Deallocating memory of function BuildAndSendUESetReq
2439 * Function : FreeQOSInfo
2441 * Functionality: Deallocating memory for function BuildQOSInfo
2443 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2447 * ****************************************************************/
2448 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2450 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2452 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2454 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2456 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2457 sizeof(MaxDataBurstVolume_t));
2459 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2460 sizeof(AveragingWindow_t));
2462 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2463 sizeof(NonDynamic5QIDescriptor_t));
2466 /*******************************************************************
2468 * @brief Deallocating memory of function BuildAndSendUESetReq
2472 * Function : FreeULTnlInfo
2474 * Functionality: Deallocating memory for function BuildULTnlInfo
2476 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2481 * ****************************************************************/
2482 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2485 if(ulInfo->list.array != NULLP)
2487 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2489 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2491 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2493 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2494 transportLayerAddress.buf != NULLP)
2496 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2499 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2500 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2501 gTPTunnel->gTP_TEID.size);
2503 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2504 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2505 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2507 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2508 sizeof(GTPTunnel_t));
2511 if(ulInfo->list.array[ulidx]!=NULLP)
2513 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2516 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2519 /*******************************************************************
2521 * @brief Deallocating memory for BuildAndSendUESetReq
2525 * Function : FreeDRBSetup
2527 * Functionality: Deallocating memory for BuildDRBSetup
2529 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2533 * ****************************************************************/
2534 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2536 DRBs_ToBeSetup_Item_t *drbSetItem;
2539 if(drbSet->list.array == NULLP)
2541 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2543 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2545 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2546 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2548 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2549 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2551 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2552 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2554 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2555 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2557 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2559 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2561 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2563 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2564 flows_Mapped_To_DRB_List.list.array != NULLP)
2566 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2567 flows_Mapped_To_DRB_List.list.count; flowidx++)
2569 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2570 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2572 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2573 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2574 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2576 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2577 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2578 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2580 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2581 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2582 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2584 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2585 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2587 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2588 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2589 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2590 sizeof(MaxDataBurstVolume_t));
2592 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2593 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2594 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2596 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2597 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2598 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2601 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2602 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2604 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2605 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2608 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2609 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2610 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2612 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2613 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2615 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2616 sizeof(OCTET_STRING_t));
2618 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2619 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2621 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2622 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2624 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2625 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2627 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2628 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2630 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2633 if(drbSet->list.array[drbidx]!=NULLP)
2635 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2638 CU_FREE(drbSet->list.array,drbSet->list.size);
2643 /*******************************************************************
2645 * @brief Free the UE Setup Request
2649 * Function : FreeUeContextSetupReq
2651 * Functionality: Deallocate the memory of BuildUESetReq
2653 * @params[in] F1AP_PDU_t *f1apMsg
2658 * ****************************************************************/
2659 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2662 UEContextSetupRequest_t *ueSetReq = NULLP;
2664 if(f1apMsg != NULLP)
2666 if(f1apMsg->choice.initiatingMessage != NULLP)
2668 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2669 if(ueSetReq->protocolIEs.list.array != NULLP)
2671 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2673 if(ueSetReq->protocolIEs.list.array[idx])
2675 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2677 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2679 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2681 case ProtocolIE_ID_id_SpCell_ID:
2682 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2684 case ProtocolIE_ID_id_ServCellIndex:
2686 case ProtocolIE_ID_id_SpCellULConfigured:
2688 case ProtocolIE_ID_id_CUtoDURRCInformation:
2689 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2691 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2692 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2694 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2695 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2697 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2698 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2700 case ProtocolIE_ID_id_RRCContainer:
2701 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2703 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2704 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2708 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2713 for(ieId=0; ieId<idx; ieId++)
2715 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2717 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2720 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2722 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2724 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2728 /**Filling cell group info **/
2729 /*******************************************************************
2731 * @brief Build Control resource set to add/modify list
2735 * Function : BuildControlRSetToAddModList
2737 * Functionality: Build Control resource set to add/modify list
2740 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2742 * @return ROK - success
2745 * ****************************************************************/
2746 uint8_t BuildControlRSetToAddModList
2748 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2753 uint8_t numBytes, bitsUnused;
2754 struct ControlResourceSet *controlRSet;
2755 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2756 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2759 controlRSetList->list.count = elementCnt;
2760 controlRSetList->list.size = \
2761 elementCnt * sizeof(struct ControlResourceSet *);
2763 controlRSetList->list.array = NULLP;
2764 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2765 if(!controlRSetList->list.array)
2767 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2771 for(idx = 0; idx < elementCnt; idx++)
2773 controlRSetList->list.array[idx] = NULLP;
2774 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2775 if(!controlRSetList->list.array[idx])
2777 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2783 controlRSet = controlRSetList->list.array[idx];
2784 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2786 /* Values harcoded according to our design:
2789 * Bit string stored ff0000000000
2793 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2794 controlRSet->frequencyDomainResources.buf = NULLP;
2795 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2796 controlRSet->frequencyDomainResources.size);
2797 if(!controlRSet->frequencyDomainResources.buf)
2799 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2803 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2804 coreset0EndPrb = CORESET0_END_PRB;
2805 coreset1StartPrb = coreset0EndPrb + 6;
2806 coreset1NumPrb = CORESET1_NUM_PRB;
2807 /* calculate the PRBs */
2808 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2809 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2810 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2812 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2813 controlRSet->cce_REG_MappingType.present = \
2814 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2816 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2817 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2818 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2819 controlRSet->tci_PresentInDCI = NULLP;
2821 uint8_t tciStateIdx;
2823 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2824 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2825 if(!controlRset->tci_StatesPDCCH_ToAddList)
2827 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2832 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2833 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2834 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2835 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2836 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2838 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2842 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2844 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2845 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2847 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2854 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2856 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2857 if(!controlRset->tci_PresentInDCI)
2859 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2863 *(controlRset->tci_PresentInDCI);
2866 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2867 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2868 if(!controlRSet->pdcch_DMRS_ScramblingID)
2870 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2873 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2876 } /* End BuildControlRSetToAddModList */
2878 /*******************************************************************
2880 * @brief Build search space to add/modify list
2884 * Function : BuildSearchSpcToAddModList
2886 * Functionality: Build search space to add/modify list
2889 * @return ROK - success
2892 * ****************************************************************/
2893 uint8_t BuildSearchSpcToAddModList
2895 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2903 struct SearchSpace *searchSpc;
2906 searchSpcList->list.count = elementCnt;
2907 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2909 searchSpcList->list.array = NULLP;
2910 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2911 if(!searchSpcList->list.array)
2913 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2917 for(idx = 0; idx < elementCnt; idx++)
2919 searchSpcList->list.array[idx] = NULLP;
2920 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2921 if(!searchSpcList->list.array[idx])
2923 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2929 searchSpc = searchSpcList->list.array[idx];
2931 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2933 searchSpc->controlResourceSetId = NULLP;
2934 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2935 if(!searchSpc->controlResourceSetId)
2937 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2940 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2942 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2943 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2944 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2945 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2947 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2950 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2951 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2953 searchSpc->duration = NULLP;
2954 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2955 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2956 if(!searchSpc->monitoringSymbolsWithinSlot)
2958 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2962 /* Values taken from reference logs :
2965 * Bit string stores 8000
2970 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2971 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2972 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2973 searchSpc->monitoringSymbolsWithinSlot->size);
2974 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2976 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2981 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2982 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2983 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2984 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2986 searchSpc->nrofCandidates = NULLP;
2987 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2988 if(!searchSpc->nrofCandidates)
2990 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2994 searchSpc->nrofCandidates->aggregationLevel1 = \
2995 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2996 searchSpc->nrofCandidates->aggregationLevel2 = \
2997 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2998 searchSpc->nrofCandidates->aggregationLevel4 = \
2999 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3000 searchSpc->nrofCandidates->aggregationLevel8 = \
3001 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3002 searchSpc->nrofCandidates->aggregationLevel16 = \
3003 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3005 searchSpc->searchSpaceType = NULLP;
3006 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3007 if(!searchSpc->searchSpaceType)
3009 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3013 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3015 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3016 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3017 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3018 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3020 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3023 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3024 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3027 }/* End BuildSearchSpcToAddModList */
3029 /*******************************************************************
3031 * @brief Builds BWP DL dedicated PDCCH config
3035 * Function : BuildBWPDlDedPdcchCfg
3037 * Functionality: Builds BWP DL dedicated PDCCH config
3039 * @params[in] struct PDCCH_Config *pdcchCfg
3041 * @return ROK - success
3044 * ****************************************************************/
3045 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3047 pdcchCfg->controlResourceSetToAddModList = NULLP;
3048 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3049 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3050 if(!pdcchCfg->controlResourceSetToAddModList)
3052 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3056 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3061 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3063 pdcchCfg->searchSpacesToAddModList = NULLP;
3064 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3065 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3066 if(!pdcchCfg->searchSpacesToAddModList)
3068 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3072 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3077 pdcchCfg->searchSpacesToReleaseList = NULLP;
3078 pdcchCfg->downlinkPreemption = NULLP;
3079 pdcchCfg->tpc_PUSCH = NULLP;
3080 pdcchCfg->tpc_PUCCH = NULLP;
3081 pdcchCfg->tpc_SRS = NULLP;
3086 /*******************************************************************
3088 * @brief Builds DMRS DL PDSCH Mapping type A
3092 * Function : BuildDMRSDLPdschMapTypeA
3094 * Functionality: Builds DMRS DL PDSCH Mapping type A
3097 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3098 * @return ROK - success
3101 * ****************************************************************/
3102 uint8_t BuildDMRSDLPdschMapTypeA
3104 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3107 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3108 dmrsDlCfg->choice.setup = NULLP;
3109 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3110 if(!dmrsDlCfg->choice.setup)
3112 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3116 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3117 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3118 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3119 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3121 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3124 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3126 dmrsDlCfg->choice.setup->maxLength = NULLP;
3127 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3128 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3129 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3134 /*******************************************************************
3136 * @brief Builds TCI states to add/modify list
3140 * Function : BuildTCIStatesToAddModList
3142 * Functionality:Builds TCI states to add/modify list
3145 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3147 * @return ROK - success
3150 * ****************************************************************/
3151 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3156 /*******************************************************************
3158 * @brief Builds PDSCH time domain allocation list
3162 * Function : BuildPdschTimeDomAllocList
3164 * Functionality: Builds PDSCH time domain allocation list
3167 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3169 * @return ROK - success
3172 * ****************************************************************/
3173 uint8_t BuildPdschTimeDomAllocList
3175 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3180 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3182 timeDomAllocList->present = \
3183 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3185 timeDomAllocList->choice.setup = NULLP;
3186 CU_ALLOC(timeDomAllocList->choice.setup, \
3187 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3188 if(!timeDomAllocList->choice.setup)
3190 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3195 timeDomAllocList->choice.setup->list.count = elementCnt;
3196 timeDomAllocList->choice.setup->list.size = \
3197 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3199 timeDomAllocList->choice.setup->list.array = NULLP;
3200 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3201 timeDomAllocList->choice.setup->list.size);
3202 if(!timeDomAllocList->choice.setup->list.array)
3204 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3208 for(idx = 0; idx < elementCnt; idx++)
3210 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3211 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3212 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3213 if(!timeDomAllocList->choice.setup->list.array[idx])
3215 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3221 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3223 timeDomAlloc->k0 = NULLP;
3224 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3225 timeDomAlloc->startSymbolAndLength = 53;
3230 /*******************************************************************
3232 * @brief Builds PDSCH PRB Bundling type
3236 * Function : BuildPdschPrbBundlingType
3238 * Functionality: Builds PDSCH PRB Bundling type
3241 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3243 * @return ROK - success
3246 * ****************************************************************/
3247 uint8_t BuildPdschPrbBundlingType
3249 struct PDSCH_Config__prb_BundlingType *prbBndlType
3252 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3254 prbBndlType->choice.staticBundling = NULLP;
3255 CU_ALLOC(prbBndlType->choice.staticBundling, \
3256 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3257 if(!prbBndlType->choice.staticBundling)
3259 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3262 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3267 /*******************************************************************
3269 * @brief Builds BWP DL dedicated PDSCH config
3273 * Function : BuildBWPDlDedPdschCfg
3275 * Functionality: Builds BWP DL dedicated PDSCH config
3277 * @params[in] struct PDSCH_Config *pdschCfg
3279 * @return ROK - success
3282 * ****************************************************************/
3283 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3285 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3287 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3288 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3289 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3290 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3292 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3296 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3301 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3302 pdschCfg->tci_StatesToAddModList = NULLP;
3303 pdschCfg->tci_StatesToReleaseList = NULLP;
3304 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3306 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3307 if(!pdschCfg->tci_StatesToAddModList)
3309 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3312 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3318 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3320 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3321 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3322 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3323 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3325 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3328 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3332 pdschCfg->pdsch_AggregationFactor = NULLP;
3333 pdschCfg->rateMatchPatternToAddModList = NULLP;
3334 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3335 pdschCfg->rateMatchPatternGroup1 = NULLP;
3336 pdschCfg->rateMatchPatternGroup2 = NULLP;
3337 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3338 pdschCfg->mcs_Table = NULLP;
3340 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3341 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3342 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3344 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3347 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3349 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3354 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3355 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3356 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3357 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3358 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3359 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3360 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3365 /*******************************************************************
3367 * @brief Builds intitial DL BWP
3370 * Function : BuildInitialDlBWP
3372 * Functionality: Builds intitial DL BWP in spCellCfgDed
3374 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3376 * @return ROK - success
3379 * ****************************************************************/
3380 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3382 dlBwp->pdcch_Config = NULLP;
3383 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3384 if(!dlBwp->pdcch_Config)
3386 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3389 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3391 dlBwp->pdcch_Config->choice.setup = NULLP;
3392 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3393 if(!dlBwp->pdcch_Config->choice.setup)
3395 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3398 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3403 dlBwp->pdsch_Config = NULLP;
3404 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3405 if(!dlBwp->pdsch_Config)
3407 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3410 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3412 dlBwp->pdsch_Config->choice.setup = NULLP;
3413 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3414 if(!dlBwp->pdsch_Config->choice.setup)
3416 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3420 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3425 dlBwp->sps_Config = NULLP;
3426 dlBwp->radioLinkMonitoringConfig = NULLP;
3430 /*******************************************************************
3432 * @brief Builds DMRS UL Pusch Mapping type A
3436 * Function : BuildDMRSULPuschMapTypeA
3438 * Functionality: Builds DMRS UL Pusch Mapping type A
3441 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3442 * @return ROK - success
3445 * ****************************************************************/
3446 uint8_t BuildDMRSULPuschMapTypeA
3448 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3451 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3452 dmrsUlCfg->choice.setup= NULLP;
3453 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3454 if(!dmrsUlCfg->choice.setup)
3456 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3460 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3461 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3462 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3463 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3465 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3468 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3470 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3471 dmrsUlCfg->choice.setup->maxLength = NULLP;
3472 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3473 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3474 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3475 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3477 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3481 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3482 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3484 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3486 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3489 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3491 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3492 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3496 /*******************************************************************
3498 * @brief Build PUSCH time domain allocation list
3502 * Function : BuildPuschTimeDomAllocList
3504 * Functionality: Build PUSCH time domain allocation list
3507 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3509 * @return ROK - success
3512 * ****************************************************************/
3513 uint8_t BuildPuschTimeDomAllocList
3515 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3520 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3522 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3523 timeDomAllocList->choice.setup = NULLP;
3524 CU_ALLOC(timeDomAllocList->choice.setup, \
3525 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3526 if(!timeDomAllocList->choice.setup)
3528 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3533 timeDomAllocList->choice.setup->list.count = elementCnt;
3534 timeDomAllocList->choice.setup->list.size = \
3535 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3536 timeDomAllocList->choice.setup->list.array = NULLP;
3537 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3538 timeDomAllocList->choice.setup->list.size);
3539 if(!timeDomAllocList->choice.setup->list.array)
3541 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3545 for(idx = 0; idx < elementCnt; idx++)
3547 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3548 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3549 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3550 if(!timeDomAllocList->choice.setup->list.array[idx])
3552 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3558 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3559 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3560 if(!timeDomAlloc->k2)
3562 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3565 *(timeDomAlloc->k2) = PUSCH_K2;
3566 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3567 timeDomAlloc->startSymbolAndLength = 27;
3571 /*******************************************************************
3573 * @brief Builds BWP UL dedicated PUSCH Config
3577 * Function : BuildBWPUlDedPuschCfg
3580 * Builds BWP UL dedicated PUSCH Config
3582 * @params[in] : PUSCH_Config_t *puschCfg
3584 * @return ROK - success
3587 * ****************************************************************/
3588 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3590 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3591 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3592 if(!puschCfg->dataScramblingIdentityPUSCH)
3594 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3597 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3599 puschCfg->txConfig = NULLP;
3600 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3601 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3602 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3603 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3605 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3609 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3614 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3615 puschCfg->pusch_PowerControl = NULLP;
3616 puschCfg->frequencyHopping = NULLP;
3617 puschCfg->frequencyHoppingOffsetLists = NULLP;
3618 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3620 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3621 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3622 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3623 if(!puschCfg->pusch_TimeDomainAllocationList)
3625 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3629 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3634 puschCfg->pusch_AggregationFactor = NULLP;
3635 puschCfg->mcs_Table = NULLP;
3636 puschCfg->mcs_TableTransformPrecoder = NULLP;
3637 puschCfg->transformPrecoder = NULLP;
3638 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3639 if(!puschCfg->transformPrecoder)
3641 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3644 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3646 puschCfg->codebookSubset = NULLP;
3647 puschCfg->maxRank = NULLP;
3648 puschCfg->rbg_Size = NULLP;
3649 puschCfg->uci_OnPUSCH = NULLP;
3650 puschCfg->tp_pi2BPSK = NULLP;
3655 /*******************************************************************
3657 * @brief Fills SRS resource to add/modify list
3661 * Function : BuildSrsRsrcAddModList
3663 * Functionality: Fills SRS resource to add/modify list
3666 * @return ROK - success
3669 * ****************************************************************/
3670 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3676 resourceList->list.count = elementCnt;
3677 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3678 resourceList->list.array = NULLP;
3679 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3680 if(!resourceList->list.array)
3682 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3686 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3688 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3689 if(!resourceList->list.array[rsrcIdx])
3691 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3697 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3698 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3699 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3701 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3702 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3703 sizeof(struct SRS_Resource__transmissionComb__n2));
3704 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3706 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3709 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3710 = SRS_COMB_OFFSET_N2;
3711 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3712 = SRS_CYCLIC_SHIFT_N2;
3714 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3716 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3717 SRS_Resource__resourceMapping__nrofSymbols_n1;
3718 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3719 SRS_Resource__resourceMapping__repetitionFactor_n1;
3721 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3722 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3723 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3724 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3725 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3726 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3727 SRS_Resource__groupOrSequenceHopping_neither;
3729 /* Setting resource type to aperiodic for intergration purposes */
3730 resourceList->list.array[rsrcIdx]->resourceType.present = \
3731 SRS_Resource__resourceType_PR_aperiodic;
3732 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3733 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3734 sizeof(struct SRS_Resource__resourceType__aperiodic));
3735 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3737 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3740 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3745 /*******************************************************************
3747 * @brief Build SRS resource set Add/mod list
3751 * Function : BuildSrsRsrcSetAddModList
3753 * Functionality: Build SRS resource set Add/mod list
3756 * @return ROK - success
3759 * ****************************************************************/
3760 uint8_t BuildSrsRsrcSetAddModList
3762 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3768 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3771 rsrcSetList->list.count = elementCnt;
3772 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3773 rsrcSetList->list.array = NULLP;
3774 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3775 if(!rsrcSetList->list.array)
3777 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3781 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3783 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3784 if(!rsrcSetList->list.array[rSetIdx])
3786 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3792 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3794 /* Fill Resource Id list in resource set */
3795 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3796 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3797 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3798 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3800 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3805 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3806 rsrcIdList->list.count = elementCnt;
3807 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3808 rsrcIdList->list.array = NULLP;
3809 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3810 if(!rsrcIdList->list.array)
3812 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3816 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3818 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3819 if(!rsrcIdList->list.array[rsrcIdx])
3821 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3827 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3829 /* Fill resource type */
3830 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3831 SRS_ResourceSet__resourceType_PR_aperiodic;
3833 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3834 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3835 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3836 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3838 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3841 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3842 = APERIODIC_SRS_RESRC_TRIGGER;
3844 /* TODO : Fill values for below IEs as expected by Viavi */
3845 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3846 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3849 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3850 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3851 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3852 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3853 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3858 /*******************************************************************
3860 * @brief Builds BWP UL dedicated SRS Config
3864 * Function : BuildBWPUlDedSrsCfg
3866 * Functionality: Builds BWP UL dedicated SRS Config
3868 * @params[in] SRS Config
3869 * @return ROK - success
3872 * ****************************************************************/
3873 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3875 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3876 srsCfg->srs_ResourceSetToAddModList = NULLP;
3877 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3878 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3879 if(!srsCfg->srs_ResourceSetToAddModList)
3881 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3884 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3889 srsCfg->srs_ResourceToReleaseList = NULLP;
3891 /* Resource to Add/Modify list */
3892 srsCfg->srs_ResourceToAddModList = NULLP;
3893 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3894 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3895 if(!srsCfg->srs_ResourceToAddModList)
3897 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3901 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3906 srsCfg->tpc_Accumulation = NULLP;
3911 /*******************************************************************
3913 * @brief Builds inital UL BWP
3917 * Function : BuildInitialUlBWP
3919 * Functionality: Builds initial UL BWP
3921 * @params[in] BWP_UplinkDedicated_t *ulBwp
3922 * @return ROK - success
3925 * ****************************************************************/
3926 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3928 ulBwp->pucch_Config = NULLP;
3930 /* Fill BWP UL dedicated PUSCH config */
3931 ulBwp->pusch_Config = NULLP;
3932 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3933 if(!ulBwp->pusch_Config)
3935 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3939 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3940 ulBwp->pusch_Config->choice.setup = NULLP;
3941 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3942 if(!ulBwp->pusch_Config->choice.setup)
3944 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3948 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3953 ulBwp->configuredGrantConfig = NULLP;
3955 /* Fill BPW UL dedicated SRS config */
3956 ulBwp->srs_Config = NULLP;
3957 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3958 if(!ulBwp->srs_Config)
3960 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3964 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3965 ulBwp->srs_Config->choice.setup = NULLP;
3966 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3967 if(!ulBwp->srs_Config->choice.setup)
3969 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3973 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3978 ulBwp->beamFailureRecoveryConfig = NULLP;
3983 /*******************************************************************
3985 * @brief Builds Pusch Serving cell Config
3989 * Function : BuildPuschSrvCellCfg
3991 * Functionality: Builds Pusch Serving cell Config
3993 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3995 * @return ROK - success
3998 * ****************************************************************/
3999 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4001 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4002 puschCfg->choice.setup = NULLP;
4003 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4004 if(!puschCfg->choice.setup)
4006 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4010 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4011 puschCfg->choice.setup->rateMatching = NULLP;
4012 puschCfg->choice.setup->xOverhead = NULLP;
4013 puschCfg->choice.setup->ext1 = NULLP;
4014 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4015 if(!puschCfg->choice.setup->ext1)
4017 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4021 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4022 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4023 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4025 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4028 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4030 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4031 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4032 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4034 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4037 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4041 /*******************************************************************
4043 * @brief Builds UL config
4046 * Function : BuildUlCfg
4048 * Functionality: Builds UL config in spCellCfgDed
4050 * @params[in] UplinkConfig_t *ulCfg
4052 * @return ROK - success
4055 * ****************************************************************/
4056 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4058 ulCfg->initialUplinkBWP = NULLP;
4059 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4060 if(!ulCfg->initialUplinkBWP)
4062 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4066 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4071 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4072 ulCfg->uplinkBWP_ToAddModList = NULLP;
4073 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4074 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4075 if(!ulCfg->firstActiveUplinkBWP_Id)
4077 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4080 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4082 ulCfg->pusch_ServingCellConfig = NULLP;
4083 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4084 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4085 if(!ulCfg->pusch_ServingCellConfig)
4087 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4091 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4096 ulCfg->carrierSwitching = NULLP;
4097 ulCfg->ext1 = NULLP;
4101 /*******************************************************************
4103 * @brief Builds PDSCH serving cell config
4106 * Function : BuildPdschSrvCellCfg
4108 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4110 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4112 * @return ROK - success
4115 * ****************************************************************/
4116 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4118 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4119 pdschCfg->choice.setup = NULLP;
4120 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4121 if(!pdschCfg->choice.setup)
4123 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4127 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4128 pdschCfg->choice.setup->xOverhead = NULLP;
4129 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4130 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4131 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4133 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4136 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4137 pdschCfg->choice.setup->pucch_Cell = NULLP;
4138 pdschCfg->choice.setup->ext1 = NULLP;
4143 /*******************************************************************
4145 * @brief Builds CSI Meas config
4148 * Function : BuildCsiMeasCfg
4150 * Functionality: Builds CSI Meas config in spCellCfgDed
4152 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4154 * @return ROK - success
4157 * ****************************************************************/
4158 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4164 /*******************************************************************
4166 * @brief Builds Spcell config dedicated
4169 * Function : BuildSpCellCfgDed
4171 * Functionality: Builds sp cell config dedicated in spCellCfg
4173 * @params[in] ServingCellConfig_t srvCellCfg
4175 * @return ROK - success
4178 * ****************************************************************/
4179 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4181 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4183 srvCellCfg->initialDownlinkBWP = NULLP;
4184 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4185 if(!srvCellCfg->initialDownlinkBWP)
4187 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4191 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4193 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4196 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4197 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4199 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4200 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4201 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4203 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4206 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4208 srvCellCfg->bwp_InactivityTimer = NULLP;
4210 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4211 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4212 if(!srvCellCfg->defaultDownlinkBWP_Id)
4214 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4217 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4219 srvCellCfg->uplinkConfig = NULLP;
4220 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4221 if(!srvCellCfg->uplinkConfig)
4223 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4227 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4229 DU_LOG("\nF1AP : BuildUlCfg failed");
4232 srvCellCfg->supplementaryUplink = NULLP;
4233 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4235 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4236 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4237 if(!srvCellCfg->pdsch_ServingCellConfig)
4239 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4243 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4245 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4249 srvCellCfg->csi_MeasConfig = NULLP;
4251 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4252 if(!srvCellCfg->csi_MeasConfig)
4254 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4258 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4260 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4264 srvCellCfg->sCellDeactivationTimer = NULLP;
4265 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4266 srvCellCfg->tag_Id = TAG_ID;
4267 srvCellCfg->dummy = NULLP;
4268 srvCellCfg->pathlossReferenceLinking = NULLP;
4269 srvCellCfg->servingCellMO = NULLP;
4270 srvCellCfg->ext1 = NULLP;
4274 /*******************************************************************
4276 * @brief Builds Spcell config
4280 * Function : BuildSpCellCfg
4282 * Functionality: Builds sp cell config in DuToCuRrcContainer
4284 * @params[in] SpCellConfig_t spCellCfg
4286 * @return ROK - success
4289 * ****************************************************************/
4290 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4293 spCellCfg->servCellIndex = NULLP;
4294 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4295 if(!spCellCfg->servCellIndex)
4297 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4300 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4302 spCellCfg->reconfigurationWithSync = NULLP;
4303 spCellCfg->rlf_TimersAndConstants = NULLP;
4304 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4305 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4306 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4308 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4311 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4313 spCellCfg->spCellConfigDedicated = NULLP;
4314 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4315 if(!spCellCfg->spCellConfigDedicated)
4317 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4320 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4322 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4327 /*******************************************************************
4329 * @brief Builds Phy cell group config
4333 * Function : BuildPhyCellGrpCfg
4335 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4337 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4339 * @return ROK - success
4342 * ****************************************************************/
4343 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4345 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4346 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4348 phyCellGrpCfg->p_NR_FR1 = NULLP;
4349 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4350 if(!phyCellGrpCfg->p_NR_FR1)
4352 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4355 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4356 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4357 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4358 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4359 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4360 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4361 phyCellGrpCfg->cs_RNTI = NULLP;
4362 phyCellGrpCfg->ext1 = NULLP;
4363 phyCellGrpCfg->ext2 = NULLP;
4368 /*******************************************************************
4370 * @brief Builds tag config
4374 * Function : BuildTagConfig
4376 * Functionality: Builds tag config in MacCellGroupConfig
4378 * @params[in] TAG_Config *tag_Config
4380 * @return ROK - success
4383 * ****************************************************************/
4384 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4386 struct TAG_Config__tag_ToAddModList *tagList;
4387 uint8_t idx, elementCnt;
4389 tagConfig->tag_ToReleaseList = NULLP;
4390 tagConfig->tag_ToAddModList = NULLP;
4391 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4392 if(!tagConfig->tag_ToAddModList)
4394 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4398 elementCnt = 1; //ODU_VALUE_ONE;
4399 tagList = tagConfig->tag_ToAddModList;
4400 tagList->list.count = elementCnt;
4401 tagList->list.size = elementCnt * sizeof(struct TAG *);
4403 tagList->list.array = NULLP;
4404 CU_ALLOC(tagList->list.array, tagList->list.size);
4405 if(!tagList->list.array)
4407 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4411 for(idx=0; idx<tagList->list.count; idx++)
4413 tagList->list.array[idx] = NULLP;
4414 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4415 if(!tagList->list.array[idx])
4417 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4423 tagList->list.array[idx]->tag_Id = TAG_ID;
4424 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4429 /*******************************************************************
4431 * @brief Builds PHR Config
4435 * Function : BuildPhrConfig
4437 * Functionality: Builds phrConfig in MacCellGroupConfig
4439 * @params[in] PHR Config *
4441 * @return ROK - success
4444 * ****************************************************************/
4445 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4448 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4449 phrConfig->choice.setup = NULLP;
4450 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4451 if(!phrConfig->choice.setup)
4453 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4457 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4458 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4459 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4460 phrConfig->choice.setup->multiplePHR = false;
4461 phrConfig->choice.setup->dummy = false;
4462 phrConfig->choice.setup->phr_Type2OtherCell = false;
4463 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4468 /*******************************************************************
4470 * @brief Builds BSR Config
4474 * Function : BuildBsrConfig
4476 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4478 * @params[in] BSR_Config *bsrConfig
4480 * @return ROK - success
4483 * ****************************************************************/
4484 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4486 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4487 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4488 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4493 /*******************************************************************
4495 * @brief Builds scheduling request config
4499 * Function : BuildSchedulingReqConfig
4501 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4503 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4505 * @return ROK - success
4508 * ****************************************************************/
4509 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4511 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4512 uint8_t idx, elementCnt;
4514 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4515 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4516 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4517 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4519 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4523 elementCnt = 1; //ODU_VALUE_ONE;
4524 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4525 schReqList->list.count = elementCnt;
4526 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4528 schReqList->list.array = NULLP;
4529 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4530 if(!schReqList->list.array)
4532 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4536 for(idx=0;idx<schReqList->list.count; idx++)
4538 schReqList->list.array[idx] = NULLP;
4539 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4540 if(!schReqList->list.array[idx])
4542 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4548 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4550 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4551 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4552 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4554 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4557 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4558 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4559 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4563 /*******************************************************************
4565 * @brief Builds Mac cell group config
4569 * Function : BuildMacCellGrpCfg
4571 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4573 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4575 * @return ROK - success
4578 * ****************************************************************/
4579 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4581 macCellGrpCfg->drx_Config = NULLP;
4582 macCellGrpCfg->schedulingRequestConfig = NULLP;
4583 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4584 if(!macCellGrpCfg->schedulingRequestConfig)
4586 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4590 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4592 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4596 macCellGrpCfg->bsr_Config = NULLP;
4597 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4598 if(!macCellGrpCfg->bsr_Config)
4600 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4604 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4606 DU_LOG("\nF1AP : BuildBsrConfig failed");
4610 macCellGrpCfg->tag_Config = NULLP;
4611 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4612 if(!macCellGrpCfg->tag_Config)
4614 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4618 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4620 DU_LOG("\nF1AP : BuildTagConfig failed");
4624 macCellGrpCfg->phr_Config = NULLP;
4625 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4626 if(!macCellGrpCfg->phr_Config)
4628 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4632 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4634 DU_LOG("\nF1AP : BuildPhrConfig failed");
4638 macCellGrpCfg->skipUplinkTxDynamic = false;
4639 macCellGrpCfg->ext1 = NULLP;
4643 /*******************************************************************
4645 * @brief Frees memeory allocated for SearchSpcToAddModList
4649 * Function : FreeSearchSpcToAddModList
4651 * Functionality: Deallocating memory of SearchSpcToAddModList
4653 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4657 4221 * ****************************************************************/
4658 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4662 struct SearchSpace *searchSpc=NULLP;
4664 if(searchSpcList->list.array)
4666 if(searchSpcList->list.array[idx2])
4668 searchSpc = searchSpcList->list.array[idx2];
4669 if(searchSpc->controlResourceSetId)
4671 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4673 if(searchSpc->monitoringSymbolsWithinSlot)
4675 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4677 if(searchSpc->nrofCandidates)
4679 if(searchSpc->searchSpaceType)
4681 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4682 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4683 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4684 SearchSpace__searchSpaceType));
4686 CU_FREE(searchSpc->nrofCandidates,
4687 sizeof(struct SearchSpace__nrofCandidates));
4689 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4690 searchSpc->monitoringSymbolsWithinSlot->size);
4692 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4693 sizeof(BIT_STRING_t));
4695 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4696 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4698 CU_FREE(searchSpc->controlResourceSetId,
4699 sizeof(ControlResourceSetId_t));
4702 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4704 CU_FREE(searchSpcList->list.array[idx1],
4705 sizeof(struct SearchSpace));
4707 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4710 /*******************************************************************
4712 * @brief Frees memory allocated for PdschTimeDomAllocList
4716 * Function : FreePdschTimeDomAllocList
4718 * Functionality: Deallocating memory of PdschTimeDomAllocList
4720 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4724 4221 * ****************************************************************/
4725 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4729 if(timeDomAllocList->choice.setup)
4731 if(timeDomAllocList->choice.setup->list.array)
4733 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4735 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4736 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4738 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4739 timeDomAllocList->choice.setup->list.size);
4741 CU_FREE(timeDomAllocList->choice.setup,\
4742 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4745 /*******************************************************************
4747 * @brief Frees memory allocated for PuschTimeDomAllocList
4751 * Function : FreePuschTimeDomAllocList
4753 * Functionality: Deallocating memory of PuschTimeDomAllocList
4755 * @params[in] PUSCH_Config_t *puschCfg
4759 ***********************************************************************/
4760 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4764 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4766 if(puschCfg->pusch_TimeDomainAllocationList)
4768 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4769 if(timeDomAllocList_t->choice.setup)
4771 if(timeDomAllocList_t->choice.setup->list.array)
4773 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4774 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4776 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4777 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4779 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4780 timeDomAllocList_t->choice.setup->list.size);
4782 CU_FREE(timeDomAllocList_t->choice.setup, \
4783 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4785 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4786 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4787 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4791 /*******************************************************************
4793 * @brief Frees memory allocated for InitialUlBWP
4797 * Function : FreeInitialUlBWP
4799 * Functionality: Deallocating memory of InitialUlBWP
4801 * @params[in] BWP_UplinkDedicated_t *ulBwp
4805 * ****************************************************************/
4806 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4808 uint8_t rSetIdx, rsrcIdx;
4809 SRS_Config_t *srsCfg = NULLP;
4810 PUSCH_Config_t *puschCfg = NULLP;
4811 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4812 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4813 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4814 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4816 if(ulBwp->pusch_Config)
4818 if(ulBwp->pusch_Config->choice.setup)
4820 puschCfg=ulBwp->pusch_Config->choice.setup;
4821 if(puschCfg->dataScramblingIdentityPUSCH)
4823 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4825 FreePuschTimeDomAllocList(puschCfg);
4826 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4827 if(dmrsUlCfg->choice.setup)
4829 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4831 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4833 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4835 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4836 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4838 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4841 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4843 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4844 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4846 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4848 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4850 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4852 /* Free SRS-Config */
4853 if(ulBwp->srs_Config)
4855 if(ulBwp->srs_Config->choice.setup)
4857 srsCfg = ulBwp->srs_Config->choice.setup;
4859 /* Free Resource Set to add/mod list */
4860 if(srsCfg->srs_ResourceSetToAddModList)
4862 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4863 if(rsrcSetList->list.array)
4867 /* Free SRS resource Id list in this SRS resource set */
4868 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4870 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4872 if(rsrcIdList->list.array)
4874 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4876 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4878 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4880 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4881 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4884 /* Free resource type info for this SRS resource set */
4885 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4886 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4888 /* Free memory for each resource set */
4889 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4891 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4893 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4895 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4896 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4899 /* Free resource to add/modd list */
4900 if(srsCfg->srs_ResourceToAddModList)
4902 resourceList = srsCfg->srs_ResourceToAddModList;
4903 if(resourceList->list.array)
4906 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4907 sizeof(struct SRS_Resource__transmissionComb__n2));
4908 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4909 sizeof(struct SRS_Resource__resourceType__aperiodic));
4911 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4913 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4915 CU_FREE(resourceList->list.array, resourceList->list.size);
4917 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4918 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4921 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4923 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4927 /*******************************************************************
4929 * @brief Frees memory allocated for initialUplinkBWP
4933 * Function : FreeinitialUplinkBWP
4935 * Functionality: Deallocating memory of initialUplinkBWP
4937 * @params[in] UplinkConfig_t *ulCfg
4942 * ****************************************************************/
4943 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4945 BWP_UplinkDedicated_t *ulBwp=NULLP;
4946 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4948 if(ulCfg->initialUplinkBWP)
4950 ulBwp=ulCfg->initialUplinkBWP;
4951 if(ulCfg->firstActiveUplinkBWP_Id)
4953 if(ulCfg->pusch_ServingCellConfig)
4955 puschCfg=ulCfg->pusch_ServingCellConfig;
4956 if(puschCfg->choice.setup)
4958 if(puschCfg->choice.setup->ext1)
4960 CU_FREE(puschCfg->choice.setup->ext1->\
4961 processingType2Enabled,sizeof(BOOLEAN_t));
4962 CU_FREE(puschCfg->choice.setup->ext1->\
4963 maxMIMO_Layers,sizeof(long));
4964 CU_FREE(puschCfg->choice.setup->ext1, \
4965 sizeof(struct PUSCH_ServingCellConfig__ext1));
4967 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4969 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4971 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4973 FreeInitialUlBWP(ulBwp);
4974 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4977 /*******************************************************************
4979 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4983 * Function : FreeBWPDlDedPdschCfg
4985 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4987 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4992 * ****************************************************************/
4993 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4995 struct PDSCH_Config *pdschCfg=NULLP;
4996 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4997 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4998 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5000 if(dlBwp->pdsch_Config->choice.setup)
5002 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5003 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5005 if(pdschCfg->pdsch_TimeDomainAllocationList)
5007 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5008 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5010 prbBndlType=&pdschCfg->prb_BundlingType;
5011 CU_FREE(prbBndlType->choice.staticBundling,\
5012 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5013 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5015 FreePdschTimeDomAllocList(timeDomAllocList);
5016 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5017 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5019 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5020 if(dmrsDlCfg->choice.setup)
5022 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5024 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5026 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5027 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5029 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5032 /*******************************************************************
5034 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5038 * Function : FreeBWPDlDedPdcchCfg
5040 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5042 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5047 * ****************************************************************/
5048 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5052 struct PDCCH_Config *pdcchCfg=NULLP;
5053 struct ControlResourceSet *controlRSet=NULLP;
5054 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5056 if(dlBwp->pdcch_Config->choice.setup)
5058 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5059 if(pdcchCfg->controlResourceSetToAddModList)
5061 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5062 if(controlRSetList->list.array)
5064 controlRSet = controlRSetList->list.array[idx2];
5067 if(controlRSet->frequencyDomainResources.buf)
5069 if(controlRSet->pdcch_DMRS_ScramblingID)
5071 if(pdcchCfg->searchSpacesToAddModList)
5073 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5074 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5075 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5077 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5079 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5080 controlRSet->frequencyDomainResources.size);
5083 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5085 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5087 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5089 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5090 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5092 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5095 /*******************************************************************
5097 * @brief Builds RLC Config
5101 * Function : BuildRlcConfig
5103 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5105 * @params[in] RLC_Config *rlcConfig
5107 * @return ROK - success
5110 * ****************************************************************/
5111 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5114 rlcConfig->present = RLC_Config_PR_am;
5116 rlcConfig->choice.am = NULLP;
5117 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5118 if(!rlcConfig->choice.am)
5120 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5125 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5126 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5127 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5129 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5132 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5133 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5134 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5135 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5136 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5139 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5140 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5141 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5143 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5146 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5147 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5148 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5153 /*******************************************************************
5155 * @brief Builds MAC LC Config
5159 * Function : BuildMacLCConfig
5161 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5163 * @params[in] struct LogicalChannelConfig macLcConfig
5165 * @return ROK - success
5168 * ****************************************************************/
5169 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5172 macLcConfig->ul_SpecificParameters = NULLP;
5173 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5174 if(!macLcConfig->ul_SpecificParameters)
5176 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5180 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5181 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5182 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5183 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5184 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5185 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5186 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5188 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5189 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5190 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5192 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5195 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5197 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5198 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5199 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5201 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5204 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5206 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5207 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5208 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5212 /*******************************************************************
5214 * @brief Builds RLC Bearer to Add/Mod list
5218 * Function :BuildRlcBearerToAddModList
5220 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5222 * @params[in] rlc_BearerToAddModList
5224 * @return ROK - success
5227 * ****************************************************************/
5228 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5230 uint8_t idx, elementCnt;
5233 rlcBearerList->list.count = elementCnt;
5234 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5236 rlcBearerList->list.array = NULLP;
5237 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5238 if(!rlcBearerList->list.array)
5240 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5244 for(idx=0; idx<rlcBearerList->list.count; idx++)
5246 rlcBearerList->list.array[idx] = NULLP;
5247 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5248 if(!rlcBearerList->list.array[idx])
5250 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5256 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5258 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5259 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5261 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5265 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5266 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5268 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5269 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5270 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5271 if(!rlcBearerList->list.array[idx]->rlc_Config)
5273 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5277 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5279 DU_LOG("\nF1AP : BuildRlcConfig failed");
5283 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5284 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5285 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5287 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5291 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5293 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5300 /*******************************************************************
5302 * @brief Free memory allocated for CellGroupConfig
5306 * Function : FreeMemCellGrpCfg
5308 * Functionality: Deallocating memory of CellGroupConfig
5310 * @params[in] pointer to CellGroupConfigRrc_t
5312 * @return ROK - success
5315 ******************************************************************/
5316 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5319 SpCellConfig_t *spCellCfg=NULLP;
5320 ServingCellConfig_t *srvCellCfg=NULLP;
5321 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5322 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5323 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5324 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5325 struct RLC_Config *rlcConfig=NULLP;
5326 struct LogicalChannelConfig *macLcConfig=NULLP;
5327 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5328 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5329 struct TAG_Config *tagConfig=NULLP;
5330 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5331 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5332 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5334 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5337 if(rlcBearerList->list.array)
5339 for(idx=0; idx<rlcBearerList->list.count; idx++)
5341 if(rlcBearerList->list.array[idx])
5343 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5344 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5347 if(rlcConfig->choice.am)
5349 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5350 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5351 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5353 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5355 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5358 if(macLcConfig->ul_SpecificParameters)
5360 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5361 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5362 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5364 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5366 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5369 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5371 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5374 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5377 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5378 if(schedulingRequestConfig)
5380 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5383 if(schReqList->list.array)
5385 for(idx=0;idx<schReqList->list.count; idx++)
5387 if(schReqList->list.array[idx])
5389 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5390 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5393 CU_FREE(schReqList->list.array, schReqList->list.size);
5395 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5396 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5397 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5399 if(macCellGrpCfg->bsr_Config)
5401 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5403 tagConfig = macCellGrpCfg->tag_Config;
5406 tagList = tagConfig->tag_ToAddModList;
5409 if(tagList->list.array)
5411 for(idx=0; idx<tagList->list.count; idx++)
5413 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5415 CU_FREE(tagList->list.array, tagList->list.size);
5417 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5419 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5422 phrConfig = macCellGrpCfg->phr_Config;
5425 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5426 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5429 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5432 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5435 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5436 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5439 spCellCfg = cellGrpCfg->spCellConfig;
5442 if(spCellCfg->servCellIndex)
5444 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5446 if(spCellCfg->spCellConfigDedicated)
5448 srvCellCfg = spCellCfg->spCellConfigDedicated;
5449 if(srvCellCfg->initialDownlinkBWP)
5451 dlBwp = srvCellCfg->initialDownlinkBWP;
5452 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5454 if(srvCellCfg->defaultDownlinkBWP_Id)
5456 if(srvCellCfg->uplinkConfig)
5458 if(srvCellCfg->pdsch_ServingCellConfig)
5460 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5461 if(pdschCfg->choice.setup)
5463 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5464 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5466 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5467 ServingCellConfig__pdsch_ServingCellConfig));
5469 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5470 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5472 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5474 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5476 if(dlBwp->pdcch_Config)
5478 if(dlBwp->pdsch_Config)
5480 FreeBWPDlDedPdschCfg(dlBwp);
5481 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5483 FreeBWPDlDedPdcchCfg(dlBwp);
5484 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5486 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5488 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5490 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5492 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5494 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5499 /*******************************************************************
5501 * @brief Fills CellGroupConfig
5505 * Function : fillCellGrpCfg
5507 * Functionality: Fills CellGroupConfig
5509 * @params[in] pointer to CellGroupConfigRrc_t
5511 * @return ROK - success
5514 ******************************************************************/
5516 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5518 uint8_t ret = RFAILED;
5519 CellGroupConfigRrc_t cellGrpCfg;
5520 asn_enc_rval_t encRetVal;
5524 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5526 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5527 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5528 if(!cellGrpCfg.rlc_BearerToAddModList)
5530 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5533 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5535 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5539 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5540 cellGrpCfg.mac_CellGroupConfig = NULLP;
5541 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5542 if(!cellGrpCfg.mac_CellGroupConfig)
5544 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5547 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5549 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5554 cellGrpCfg.physicalCellGroupConfig = NULLP;
5555 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5556 if(!cellGrpCfg.physicalCellGroupConfig)
5558 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5561 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5563 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5567 cellGrpCfg.spCellConfig = NULLP;
5568 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5569 if(!cellGrpCfg.spCellConfig)
5571 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5574 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5576 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5580 cellGrpCfg.sCellToAddModList = NULLP;
5581 cellGrpCfg.sCellToReleaseList = NULLP;
5582 cellGrpCfg.ext1 = NULLP;
5584 /* encode cellGrpCfg into duToCuRrcContainer */
5585 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5586 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5588 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5589 /* Encode results */
5590 if(encRetVal.encoded == ENCODE_FAIL)
5592 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5593 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5598 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5599 for(int i=0; i< encBufSize; i++)
5601 printf("%x",encBuf[i]);
5605 cellGrp->size = encBufSize;
5606 CU_ALLOC(cellGrp->buf, cellGrp->size);
5609 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5612 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5616 FreeMemCellGrpCfg(&cellGrpCfg);
5620 /*******************************************************************
5622 * @brief Free UE Capability RAT container
5626 * Function : freeUeCapRatCont
5629 * Free UE Capability RAT conatiner
5632 * @return ROK - success
5635 * ****************************************************************/
5636 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5639 FeatureSets_t *featureSets;
5641 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5643 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5645 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5646 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5648 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5651 if(ueNrCap->featureSets)
5653 featureSets = ueNrCap->featureSets;
5654 if(featureSets->featureSetsDownlinkPerCC)
5656 if(featureSets->featureSetsDownlinkPerCC->list.array)
5658 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5660 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5661 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5662 sizeof(ModulationOrder_t));
5663 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5665 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5667 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5670 if(featureSets->featureSetsUplinkPerCC)
5672 if(featureSets->featureSetsUplinkPerCC->list.array)
5674 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5676 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5678 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5679 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5680 sizeof(ModulationOrder_t));
5681 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5684 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5686 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5688 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5692 /*******************************************************************
5694 * @brief Free UE capability RAT container list
5698 * Function : freeUeCapRatContList
5700 * Functionality: Free UE capability RAT container list
5703 * @return ROK - success
5706 * ****************************************************************/
5707 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5710 if(ueCapablityList->list.array)
5712 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5714 if(ueCapablityList->list.array[idx])
5715 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5717 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5721 /*******************************************************************
5723 * @brief Fill feature sets
5727 * Function : fillFeatureSets
5729 * Functionality: Fill feature sets
5732 * @return ROK - success
5735 * ****************************************************************/
5736 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5738 uint8_t idx, elementCnt;
5740 featureSets->featureSetsDownlink = NULLP;
5741 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5742 if(!featureSets->featureSetsDownlinkPerCC)
5744 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5749 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5750 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5751 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5752 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5754 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5758 for(idx = 0; idx < elementCnt; idx++)
5760 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5761 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5763 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5769 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5770 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5771 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5772 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5773 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5775 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5776 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5778 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5781 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5783 featureSets->featureSetsUplink = NULLP;
5784 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5785 if(!featureSets->featureSetsUplinkPerCC)
5787 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5792 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5793 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5794 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5795 if(!featureSets->featureSetsUplinkPerCC->list.array)
5797 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5801 for(idx = 0; idx < elementCnt; idx++)
5803 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5804 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5806 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5812 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5813 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5814 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5815 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5816 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5817 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5819 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5820 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5822 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5825 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5830 /*******************************************************************
5832 * @brief Fill UE capability RAT container
5836 * Function : fillUeCapRatCont
5838 * Functionality: Fill UE capability RAT container
5840 * @params[in] UE Capability RAT container buffer
5841 * @return ROK - success
5844 * ****************************************************************/
5845 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5848 uint8_t idx, elementCnt;
5849 asn_enc_rval_t encRetVal;
5850 UE_NR_Capability_t ueNrCap;
5854 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5856 /* Filling PDCP parameters */
5857 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5858 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5859 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5860 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5861 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5862 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5863 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5864 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5865 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5866 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5867 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5868 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5869 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5870 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5871 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5872 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5873 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5875 ueNrCap.rlc_Parameters = NULLP;
5876 ueNrCap.mac_Parameters = NULLP;
5878 /* Filling PHY parameters */
5879 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5880 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5881 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5882 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5883 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5885 /* Filling RF parameters */
5887 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5888 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5889 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5890 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5892 DU_LOG("\nMemory allocation failed in fillUeCapRatCont");
5897 for(idx = 0; idx < elementCnt; idx++)
5899 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5900 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
5910 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
5911 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
5912 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
5914 ueNrCap.measAndMobParameters = NULLP;
5915 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
5916 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
5917 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
5918 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
5919 ueNrCap.featureSets = NULLP;
5921 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
5922 if(!ueNrCap.featureSets)
5924 DU_LOG("\nMemory allocation failed in fillUeCapRatCont");
5929 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
5931 DU_LOG("\nfillDLFeatureSets() failed ");
5936 ueNrCap.featureSetCombinations = NULLP;
5937 ueNrCap.lateNonCriticalExtension = NULLP;
5938 ueNrCap.nonCriticalExtension = NULLP;
5940 /* encode UE Capability RAT Container List into duToCuRrcContainer */
5941 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
5942 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5944 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
5946 /* Encode results */
5947 if(encRetVal.encoded == ENCODE_FAIL)
5949 DU_LOG( "\n F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
5950 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5955 DU_LOG("\n F1AP : Created APER encoded buffer for UE Capability RAT Container\n");
5956 for(int i=0; i< encBufSize; i++)
5958 printf("%x",encBuf[i]);
5962 ueCapRatContBuf->size = encBufSize;
5963 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
5964 if(!ueCapRatContBuf->buf)
5966 DU_LOG("\nF1AP : Memory allocation failed in fillUeCapabilityContainer");
5969 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
5973 freeUeCapRatCont(&ueNrCap);
5977 /*******************************************************************
5979 * @brief Fill UE Capability RAT container list
5983 * Function : fillUeCapRatContList
5985 * Functionality: Fill UE Capability RAT container list
5988 * @params[in] UE capability RAT container list buffer
5989 * @return ROK - success
5992 * ****************************************************************/
5993 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
5995 uint8_t ret = RFAILED;
5996 uint8_t idx, elementCnt;
5997 asn_enc_rval_t encRetVal;
5998 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6003 ueCapablityList.list.count = elementCnt;
6004 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6006 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6007 if(!ueCapablityList.list.array)
6009 DU_LOG("\nMemory allocation failed in fillUeCapRatContList");
6014 for(idx=0; idx<elementCnt; idx++)
6016 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6017 if(ueCapablityList.list.array[idx] == NULLP)
6019 DU_LOG("\nMemory allocation failed in fillUeCapRatContList");
6025 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6026 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6028 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6029 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6030 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6032 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6033 &ueCapablityList, PrepFinalEncBuf, encBuf);
6035 /* Encode results */
6036 if(encRetVal.encoded == ENCODE_FAIL)
6038 DU_LOG( "\n F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6039 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6044 DU_LOG("\n F1AP : Created APER encoded buffer for UE Capability RAT Container\n");
6045 for(int i=0; i< encBufSize; i++)
6047 printf("%x",encBuf[i]);
6051 ueCapablityListBuf->size = encBufSize;
6052 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6053 if(!ueCapablityListBuf->buf)
6055 DU_LOG("\nF1AP : Memory allocation failed in fillUeCapabilityContainer");
6058 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6062 freeUeCapRatContList(&ueCapablityList);
6066 /*******************************************************************
6068 * @brief Fills CuToDuContainer
6072 * Function : fillCuToDuContainer
6074 * Functionality: Fills CuToDuContainer
6076 * @params[in] pointer to CUtoDURRCInformation_t
6078 * @return ROK - success
6081 ******************************************************************/
6083 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6085 uint8_t elementCnt = 0;
6087 uint8_t idx, idx2, rrcBufLen;
6089 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6090 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6092 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6095 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6097 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6098 if(rrcMsg->iE_Extensions)
6101 rrcMsg->iE_Extensions->list.count = elementCnt;
6102 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6104 /* Initialize the CUtoDURRCInformation_ExtIEs */
6105 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6107 if(rrcMsg->iE_Extensions->list.array == NULLP)
6109 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6113 for(idx=0; idx<elementCnt; idx++)
6115 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6116 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6122 /* Filling CellGroupConfig_t IE */
6123 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6124 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6125 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6126 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6127 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6132 /*******************************************************************
6134 * @brief Free CuToDuContainer
6138 * Function : FreeCuToDuInfo
6140 * Functionality: Free CuToDuContainer
6142 * @params[in] pointer to CUtoDURRCInformation_t
6144 * @return ROK - success
6147 ******************************************************************/
6149 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6153 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6155 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6156 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6157 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6159 if(rrcMsg->iE_Extensions)
6161 if(rrcMsg->iE_Extensions->list.array)
6163 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6165 if(rrcMsg->iE_Extensions->list.array[idx])
6167 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6169 case ProtocolIE_ID_id_CellGroupConfig:
6170 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6172 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6173 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6178 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
6179 rrcMsg->iE_Extensions->list.array[idx]->id);
6185 for(idx2 = 0; idx2 < idx; idx2++)
6187 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6189 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6193 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6196 /*******************************************************************
6198 * @brief Builds and sends the UE Setup Request
6202 * Function : BuildAndSendUeContextSetupReq
6204 * Functionality: Constructs the UE Setup Request and sends
6205 * it to the CU through SCTP.
6209 * @return ROK - success
6212 * ****************************************************************/
6213 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6214 uint16_t rrcContLen, uint8_t *rrcContainer)
6217 uint8_t SplCellListret;
6218 uint8_t SrbSetupret;
6220 uint8_t idx, bufLen;
6222 F1AP_PDU_t *f1apMsg = NULLP;
6223 UEContextSetupRequest_t *ueSetReq = NULLP;
6224 asn_enc_rval_t encRetVal; /* Encoder return value */
6225 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6226 uint8_t ret= RFAILED;
6230 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
6232 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6233 if(f1apMsg == NULLP)
6235 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6239 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6240 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6241 if(f1apMsg->choice.initiatingMessage == NULLP)
6243 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6247 f1apMsg->choice.initiatingMessage->procedureCode = \
6248 ProcedureCode_id_UEContextSetup;
6249 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6250 f1apMsg->choice.initiatingMessage->value.present = \
6251 InitiatingMessage__value_PR_UEContextSetupRequest;
6253 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6256 ueSetReq->protocolIEs.list.count = elementCnt;
6257 ueSetReq->protocolIEs.list.size = \
6258 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6260 /* Initialize the UESetup members */
6261 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6263 if(ueSetReq->protocolIEs.list.array == NULLP)
6265 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
6269 for(idx1=0; idx1<elementCnt; idx1++)
6271 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6272 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6280 /*GNB CU UE F1AP ID*/
6281 ueSetReq->protocolIEs.list.array[idx]->id = \
6282 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6283 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6284 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6285 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6286 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6288 /*GNB DU UE F1AP ID*/
6290 ueSetReq->protocolIEs.list.array[idx]->id = \
6291 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6292 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6293 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6294 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6295 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6299 ueSetReq->protocolIEs.list.array[idx]->id = \
6300 ProtocolIE_ID_id_SpCell_ID;
6301 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6302 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6303 UEContextSetupRequestIEs__value_PR_NRCGI;
6304 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6310 /*Served Cell Index*/
6312 ueSetReq->protocolIEs.list.array[idx]->id = \
6313 ProtocolIE_ID_id_ServCellIndex;
6314 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6315 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6316 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6317 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6320 /*CellULConfigured*/
6322 ueSetReq->protocolIEs.list.array[idx]->id = \
6323 ProtocolIE_ID_id_SpCellULConfigured;
6324 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6325 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6326 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6327 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6328 CellULConfigured_none;
6330 /*CUtoDURRCContainer*/
6332 ueSetReq->protocolIEs.list.array[idx]->id = \
6333 ProtocolIE_ID_id_CUtoDURRCInformation;
6334 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6335 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6336 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6337 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6342 /*Special Cells to be SetupList*/
6344 ueSetReq->protocolIEs.list.array[idx]->id = \
6345 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6346 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6347 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6348 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6349 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6350 if(SplCellListret != ROK)
6354 /*SRBs To Be Setup List*/
6356 ueSetReq->protocolIEs.list.array[idx]->id = \
6357 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6358 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6359 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6360 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6361 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6362 if(SrbSetupret != ROK)
6366 /*DRBs to Be Setup List*/
6368 ueSetReq->protocolIEs.list.array[idx]->id = \
6369 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6370 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6371 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6372 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6373 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6378 /* RRC Container for security mode */
6380 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6381 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6382 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6383 UEContextSetupRequestIEs__value_PR_RRCContainer;
6384 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6386 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6387 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6388 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6389 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6391 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6394 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6395 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6397 /* RRC delivery status request */
6399 ueSetReq->protocolIEs.list.array[idx]->id = \
6400 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6401 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6402 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6403 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6404 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6405 RRCDeliveryStatusRequest_true;
6407 /* Bit Rate hardcoded as in reference logs */
6409 ueSetReq->protocolIEs.list.array[idx]->id = \
6410 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6411 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6412 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6413 UEContextSetupRequestIEs__value_PR_BitRate;
6414 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6416 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6417 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6418 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6419 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6421 DU_LOG(" F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6424 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6425 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6427 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6429 /* Encode the F1SetupRequest type as APER */
6430 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6432 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6434 /* Encode results */
6435 if(encRetVal.encoded == ENCODE_FAIL)
6437 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6438 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6443 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
6444 for(int i=0; i< encBufSize; i++)
6446 printf("%x",encBuf[i]);
6451 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6453 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
6459 FreeUeContextSetupReq(f1apMsg);
6462 }/* End of BuildAndSendUeContextSetupReq*/
6464 /****************************************************************
6465 * @brief Function to process Ul Rrc Msg received from DU
6469 * Function : procUlRrcMsg
6472 * - Function to process Ul Rrc Msg received from DU
6475 * @return ROK - success
6478 * ****************************************************************/
6480 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6482 uint8_t idx, ret, srbId, rrcMsgType;
6483 uint8_t cuUeF1apId, duUeF1apId;
6484 uint8_t *rrcContainer = NULLP;
6485 uint16_t rrcContLen;
6486 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6489 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6491 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6493 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6495 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6497 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6500 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6502 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6505 case ProtocolIE_ID_id_SRBID:
6506 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6508 case ProtocolIE_ID_id_RRCContainer:
6510 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6511 CU_ALLOC(rrcContainer, rrcContLen)
6514 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
6517 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6523 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6529 f1apMsgDb.dlRrcMsgCount++;
6530 rrcMsgType = setDlRRCMsgType();
6531 if(rrcMsgType == REGISTRATION_ACCEPT)
6533 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Registration Accept");
6534 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6536 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6538 DU_LOG("\nF1AP: Sending Ue Context Setup Req");
6539 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6540 rrcContLen, rrcContainer);
6542 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6544 /* To trigger the DL RRC Msg for RRC Reconfig */
6545 f1apMsgDb.dlRrcMsgCount++;
6546 rrcMsgType = setDlRRCMsgType();
6547 if(rrcMsgType == RRC_RECONFIG)
6549 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Reconfig");
6550 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6557 /****************************************************************
6558 * @brief Build And Send F1ResetAck
6562 * Function : FreeF1ResetAck
6565 * - Build And Send F1ResetRSP
6568 * @return ROK - success
6571 * ****************************************************************/
6572 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6575 ResetAcknowledge_t *f1ResetAck;
6579 if(f1apMsg->choice.successfulOutcome)
6581 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6583 if(f1ResetAck->protocolIEs.list.array)
6585 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6587 if(f1ResetAck->protocolIEs.list.array[idx])
6589 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6592 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6594 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6596 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6600 /****************************************************************
6601 * @brief Build And Send F1ResetAck
6605 * Function : BuildAndSendF1ResetAck
6608 * - Build And Send F1ResetRSP
6611 * @return ROK - success
6614 * ****************************************************************/
6616 uint8_t BuildAndSendF1ResetAck()
6619 uint8_t elementCnt = 0;
6620 uint8_t ret = RFAILED;
6621 F1AP_PDU_t *f1apMsg = NULL;
6622 ResetAcknowledge_t *f1ResetAck = NULLP;
6623 asn_enc_rval_t encRetVal;
6624 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6627 /* Allocate the memory for F1ResetRequest_t */
6628 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6629 if(f1apMsg == NULLP)
6631 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6635 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6637 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6638 if(f1apMsg->choice.successfulOutcome == NULLP)
6640 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6644 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6645 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6646 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6647 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6651 f1ResetAck->protocolIEs.list.count = elementCnt;
6652 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6654 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6655 if(f1ResetAck->protocolIEs.list.array == NULLP)
6657 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6661 for(idx=0; idx<elementCnt; idx++)
6663 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6664 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6671 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6672 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6673 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6674 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6676 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6678 /* Encode the F1SetupRequest type as UPER */
6679 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6681 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6683 /* Check encode results */
6684 if(encRetVal.encoded == ENCODE_FAIL)
6686 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6687 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6692 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6693 for(int i=0; i< encBufSize; i++)
6695 printf("%x",encBuf[i]);
6699 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6701 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6709 FreeF1ResetAck(f1apMsg);
6712 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6716 if(ulInfo->list.array)
6718 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6720 if(ulInfo->list.array[arrIdx])
6722 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6724 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6726 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6728 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6729 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6730 gTPTunnel->gTP_TEID.size);
6732 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6733 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6734 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6736 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6737 sizeof(GTPTunnel_t));
6739 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6742 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6745 /*******************************************************************
6747 * @brief Builds the Uplink Tunnel Info
6751 * Function : BuildUlTnlInfoforDrb2
6753 * Functionality: Constructs the UL TnlInfo For DRB list
6755 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6757 * @return ROK - success
6760 * ****************************************************************/
6761 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6767 ulInfo->list.count = ulCnt;
6768 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6769 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6770 if(ulInfo->list.array == NULLP)
6772 DU_LOG("\nF1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6775 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6777 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6778 if(ulInfo->list.array[arrIdx] == NULLP)
6780 DU_LOG("\nF1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6786 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6787 UPTransportLayerInformation_PR_gTPTunnel;
6790 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6791 sizeof(GTPTunnel_t));
6792 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6794 DU_LOG("\nF1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6797 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6798 transportLayerAddress.size = 4*sizeof(uint8_t);
6799 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6800 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6801 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6802 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6803 transportLayerAddress.buf == NULLP)
6805 DU_LOG("\nF1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6809 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6810 transportLayerAddress.buf[0] = 192;
6811 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6812 transportLayerAddress.buf[1] = 168;
6813 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6814 transportLayerAddress.buf[2] = 130;
6815 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6816 transportLayerAddress.buf[3] = 82;
6817 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6818 transportLayerAddress.bits_unused = 0;
6821 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6822 = 4 * sizeof(uint8_t);
6823 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6824 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6825 gTPTunnel->gTP_TEID.size);
6826 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6829 DU_LOG("\nF1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6832 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6833 gTP_TEID.buf[0] = 11;
6834 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6835 gTP_TEID.buf[1] = 0;
6836 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6837 gTP_TEID.buf[2] = 0;
6838 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6839 gTP_TEID.buf[3] = 1;
6842 }/*End of BuildULTnlInfo*/
6843 /*******************************************************************
6845 * @brief freeing the DRB 2 item
6849 * Function : FreeDrb2Item
6851 * Functionality: freeing the DRB 2 item
6853 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6855 * @return ROK - success
6858 * ****************************************************************/
6860 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6863 SNSSAI_t *snssai =NULLP;
6864 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6866 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6867 switch(drbItem->qoSInformation.present)
6869 case QoSInformation_PR_NOTHING:
6871 case QoSInformation_PR_eUTRANQoS:
6873 if(drbItem->qoSInformation.choice.eUTRANQoS)
6875 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6879 case QoSInformation_PR_choice_extension:
6881 if(drbItem->qoSInformation.choice.choice_extension)
6883 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6885 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
6888 CU_FREE(snssai->sST.buf,snssai->sST.size);
6894 CU_FREE(snssai->sD->buf,snssai->sD->size);
6896 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
6899 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
6900 if(flowMap->list.array)
6902 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
6904 if(flowMap->list.array[arrIdx] )
6906 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
6907 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
6910 CU_FREE(flowMap->list.array,flowMap->list.size);
6913 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6919 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
6920 if(drbItem->uLConfiguration)
6922 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
6925 /*******************************************************************
6927 * @brief filling the DRB 2 item
6931 * Function : FillDrb2Item
6933 * Functionality: filling the DRB 2 item
6935 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6937 * @return ROK - success
6940 * ****************************************************************/
6942 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6947 drbItem->dRBID = DRB2;
6950 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6952 switch(drbItem->qoSInformation.present)
6954 case QoSInformation_PR_NOTHING:
6958 case QoSInformation_PR_eUTRANQoS:
6961 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6962 if(drbItem->qoSInformation.choice.eUTRANQoS)
6964 DU_LOG("\nF1AP : Memory allocation failed in FillDrb2Item");
6967 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
6968 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
6969 PriorityLevel_no_priority;
6971 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
6972 Pre_emptionCapability_may_trigger_pre_emption;
6974 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
6975 Pre_emptionVulnerability_pre_emptable;
6979 case QoSInformation_PR_choice_extension:
6981 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6982 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
6984 DU_LOG("\nF1AP : Memory allocation failed in FillDrb2Item");
6988 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
6989 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
6990 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
6991 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6994 DU_LOG("\nF1AP : BuildQOSInfo failed");
6999 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7000 choice_extension->value.choice.DRB_Information.sNSSAI);
7003 DU_LOG("\nF1AP : BuildSNSSAI failed");
7007 /*Flows mapped to DRB List*/
7008 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7009 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7012 DU_LOG("\nF1AP : BuildFlowsMap failed");
7018 /*ULUPTNLInformation To Be Setup List*/
7019 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7022 DU_LOG("\nF1AP : BuildUlTnlInfoforDrb2 failed");
7027 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7029 /*UL Configuration*/
7030 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7031 if(drbItem->uLConfiguration == NULLP)
7033 DU_LOG("\nF1AP : Memory allocation failed in FillDrb2Item");
7036 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7039 /*******************************************************************
7041 * @brief Builds the DRB to be Setup Mod ItemIes
7045 * Function : FillDrbItemList
7047 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7049 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7051 * @return ROK - success
7054 * ****************************************************************/
7056 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7058 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7059 drbItemIe->criticality = Criticality_reject;
7060 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7062 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7064 DU_LOG("\nF1AP : FillDrb2Item failed");
7069 /*******************************************************************
7071 * @brief free the DRB to be Setup Mod list
7075 * Function : FreeDrbToBeSetupModList
7077 * Functionality: free the DRB to be Setup Mod list
7079 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7081 * @return ROK - success
7084 * ****************************************************************/
7085 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7088 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7090 if(drbSet->list.array)
7092 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7094 if(drbSet->list.array[arrIdx] != NULLP)
7098 drbItemIe =drbSet->list.array[arrIdx];
7099 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7101 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7104 CU_FREE(drbSet->list.array, drbSet->list.size);
7110 /*******************************************************************
7112 * @brief Builds the DRB to be Setup Mod list
7116 * Function : BuildDrbToBeSetupModList
7118 * Functionality: Constructs the DRB to be Setup Mod list
7120 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7122 * @return ROK - success
7125 * ****************************************************************/
7127 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7134 drbSet->list.count = drbCnt;
7135 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7136 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7137 if(drbSet->list.array == NULLP)
7139 DU_LOG("\nF1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7142 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7144 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7145 if(drbSet->list.array[arrIdx] == NULLP)
7147 DU_LOG("\nF1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7153 ret = FillDrbItemList(drbSet->list.array[arrIdx]);
7156 DU_LOG("\nF1AP : FillDrbItemList failed");
7161 /*******************************************************************
7163 * @brief free the UeContextModification Request
7167 * Function : FreeUeContextModicationRequest
7169 * Functionality : deallocation of memory allocated in UeContextModiification
7172 * @params[in] F1AP_PDU_t *f1apMsg
7176 * ****************************************************************/
7177 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7179 uint8_t arrIdx =0 , ieId=0, drbIe=0, arrIdx1;
7180 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7181 DRBs_ToBeSetupMod_List_t *drbSet;
7182 DRBs_ToBeSetupMod_ItemIEs_t *drbItemIe = NULLP;
7186 if(f1apMsg->choice.initiatingMessage)
7188 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7189 if(UeContextModifyReq->protocolIEs.list.array)
7191 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7193 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7195 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7198 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7200 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7202 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7204 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7205 choice.DRBs_ToBeSetupMod_List);
7209 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7212 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7214 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7216 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7219 /*******************************************************************
7221 * @brief Builds the Ue Context Modification Req
7225 * Function : BuildAndSendUeContextModificationReq
7227 * Functionality: Constructs the Ue Context Modification Req
7231 * @return ROK - success
7234 * ****************************************************************/
7235 uint8_t BuildAndSendUeContextModificationReq()
7238 uint8_t elementCnt = 0;
7239 uint8_t ret = RFAILED;
7240 F1AP_PDU_t *f1apMsg = NULLP;
7241 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7243 asn_enc_rval_t encRetVal;
7244 DU_LOG("\nF1AP : Building Ue context modification request\n");
7248 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7249 if(f1apMsg == NULLP)
7251 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7255 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7257 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7258 if(f1apMsg->choice.initiatingMessage == NULLP)
7260 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7263 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7264 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7265 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7267 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7270 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7271 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7273 /* Initialize the UE context modification members */
7274 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7275 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7277 DU_LOG("\nF1AP : Memory allocation for UE context modifcation Request failed");
7281 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7283 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7284 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7286 DU_LOG("\nF1AP : Memory allocation for UE context modifcation Request failed");
7293 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7294 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7295 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7296 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7297 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
7300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7302 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7303 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7304 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
7307 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7308 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7309 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7310 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7311 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7312 value.choice.DRBs_ToBeSetupMod_List));
7317 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7319 /* Encode the F1SetupRequest type as APER */
7320 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7322 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7325 /* Encode results */
7326 if(encRetVal.encoded == ENCODE_FAIL)
7328 DU_LOG("\nF1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7329 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7334 DU_LOG("\nF1AP : Created APER encoded buffer for ueContextModifyReq\n");
7335 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7337 printf("%x",encBuf[ieIdx]);
7341 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7343 DU_LOG("\nF1AP : Sending Ue context modification request failed");
7351 FreeUeContextModicationRequest(f1apMsg);
7354 /*******************************************************************
7356 * @brief Handles received F1AP message and sends back response
7360 * Function : F1APMsgHdlr
7363 * - Decodes received F1AP control message
7364 * - Prepares response message, encodes and sends to SCTP
7367 * @return ROK - success
7370 * ****************************************************************/
7371 void F1APMsgHdlr(Buffer *mBuf)
7377 F1AP_PDU_t *f1apMsg = NULLP;
7378 asn_dec_rval_t rval; /* Decoder return value */
7379 F1AP_PDU_t f1apasnmsg ;
7381 DU_LOG("\nF1AP : Received F1AP message buffer");
7382 ODU_PRINT_MSG(mBuf, 0,0);
7384 /* Copy mBuf into char array to decode it */
7385 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7386 CU_ALLOC(recvBuf, (Size)recvBufLen);
7388 if(recvBuf == NULLP)
7390 DU_LOG("\nF1AP : Memory allocation failed");
7393 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7395 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
7399 printf("\nF1AP : Received flat buffer to be decoded : ");
7400 for(i=0; i< recvBufLen; i++)
7402 printf("%x",recvBuf[i]);
7405 /* Decoding flat buffer into F1AP messsage */
7406 f1apMsg = &f1apasnmsg;
7407 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7409 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7410 CU_FREE(recvBuf, (Size)recvBufLen);
7412 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7414 DU_LOG("\nF1AP : ASN decode failed");
7418 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7420 switch(f1apMsg->present)
7422 case F1AP_PDU_PR_initiatingMessage:
7424 switch(f1apMsg->choice.initiatingMessage->value.present)
7426 case InitiatingMessage__value_PR_Reset:
7428 DU_LOG("\nF1AP : F1 reset request received ");
7429 BuildAndSendF1ResetAck();
7433 case InitiatingMessage__value_PR_F1SetupRequest:
7435 DU_LOG("\nF1AP : F1 setup request received");
7436 BuildAndSendF1SetupRsp();
7440 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7442 DU_LOG("\nF1AP : GNB-DU config update received");
7443 BuildAndSendDUUpdateAck();
7444 DU_LOG("\nF1AP : Sending F1 reset request");
7445 BuildAndSendF1ResetReq();
7448 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7450 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
7451 procInitULRRCMsg(f1apMsg);
7454 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7456 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
7457 procUlRrcMsg(f1apMsg);
7461 case InitiatingMessage__value_PR_RRCDeliveryReport:
7463 DU_LOG("\nF1AP : Received RRC delivery report");
7468 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
7471 }/* End of switch(initiatingMessage) */
7475 case F1AP_PDU_PR_successfulOutcome:
7477 switch(f1apMsg->choice.successfulOutcome->value.present)
7479 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7481 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
7484 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7486 DU_LOG("\nF1AP : UE ContextSetupResponse received");
7487 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7492 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
7493 f1apMsg->choice.successfulOutcome->value.present);
7496 }/* End of switch(successfulOutcome) */
7501 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7504 }/* End of switch(f1apMsg->present) */
7506 } /* End of F1APMsgHdlr */
7508 /**********************************************************************
7510 **********************************************************************/