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"
30 #include "ModulationOrder.h"
32 #include "UE-CapabilityRAT-Container.h"
33 #include "UE-CapabilityRAT-ContainerList.h"
34 #include "UE-CapabilityRAT-ContainerListRRC.h"
35 #include "SupportedBandwidth.h"
36 #include "FeatureSetUplinkPerCC.h"
37 #include "FeatureSetDownlinkPerCC.h"
38 #include "FeatureSets.h"
39 #include "RF-Parameters.h"
40 #include "UE-NR-Capability.h"
41 #include "ProtocolExtensionContainer.h"
42 #include "CellGroupConfigRrc.h"
43 #include "MAC-CellGroupConfig.h"
44 #include "SchedulingRequestConfig.h"
45 #include "SchedulingRequestToAddMod.h"
46 #include "BSR-Config.h"
47 #include "TAG-Config.h"
49 #include "PHR-Config.h"
50 #include "RLC-Config.h"
51 #include "UL-AM-RLC.h"
52 #include "DL-AM-RLC.h"
53 #include "LogicalChannelConfig.h"
54 #include "RLC-BearerConfig.h"
55 #include "PhysicalCellGroupConfig.h"
56 #include "SpCellConfig.h"
57 #include "ServingCellConfig.h"
58 #include "ControlResourceSet.h"
59 #include "SearchSpace.h"
60 #include "PDCCH-Config.h"
61 #include "PDSCH-TimeDomainResourceAllocation.h"
62 #include "PDSCH-TimeDomainResourceAllocationList.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "BWP-UplinkDedicated.h"
75 #include "PUSCH-ServingCellConfig.h"
76 #include "UplinkConfig.h"
77 #include "PDSCH-ServingCellConfig.h"
79 /* MACRO for CUtoDURRCInformation */
81 #define FREQ_DOM_RSRC_SIZE 6
82 #define CORESET0_END_PRB 48
83 #define CORESET1_NUM_PRB 24
84 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
85 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
86 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
87 #define PDCCH_SRCH_SPC_TWO_ID 2
89 #define SCRAMBLING_ID NR_PCI
90 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
91 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
92 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
93 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
94 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
95 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
96 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
97 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
98 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
100 /* MACRO Ddefine for PDSCH Configuration */
102 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
103 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
104 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
105 #define PDSCH_NUM_HARQ_PROC 5
106 #define PDSCH_MAPPING_TYPE_A 0
107 #define PDSCH_MAPPING_TYPE_B 1
109 /* MACRO Define for PUSCH Configuration */
112 #define PUSCH_MSG3_DELTA_PREAMBLE 0
113 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
114 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
115 #define PUSCH_MAX_MIMO_LAYERS 1
116 #define PUSCH_PROCESS_TYPE2_ENABLED false
117 #define PUSCH_MAPPING_TYPE_A 0
118 #define PUSCH_MAPPING_TYPE_B 1
120 /* MACRO defines for SRC config */
121 #define SRS_RSRC_ID 1
122 #define SRS_RSET_ID 1
123 #define SRS_COMB_OFFSET_N2 0
124 #define SRS_CYCLIC_SHIFT_N2 0
125 #define SRS_FREQ_DOM_POS 0
126 #define SRS_FREQ_DOM_SHIFT 0
131 #define APERIODIC_SRS_RESRC_TRIGGER 1
133 /* Macro definitions for DUtoCuRrcContainer */
134 #define CELL_GRP_ID 1
136 #define SR_PROHIBIT_TMR 5
137 #define SR_TRANS_MAX 2
138 #define PERIODIC_BSR_TMR 2
139 #define RETX_BSR_TMR 5
140 #define SR_DELAY_TMR 6
142 #define TIME_ALIGNMENT_TMR 7
143 #define PHR_PERIODIC_TMR 7
144 #define PHR_PROHIBHIT_TMR 0
145 #define PHR_PWR_FACTOR_CHANGE 3
146 #define PHR_MODE_OTHER_CG 0
149 #define SN_FIELD_LEN 0
150 #define T_POLL_RETRANSMIT 8
153 #define MAX_RETX_THRESHOLD 5
154 #define T_REASSEMBLY 8
155 #define T_STATUS_PROHIBHIT 7
156 #define MAC_LC_PRIORITY 1
157 #define PRIORTISIED_BIT_RATE 15
158 #define BUCKET_SIZE_DURATION 5
161 #define PDSCH_HARQ_ACK_CODEBOOK 1
162 #define SERV_CELL_IDX 0
163 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
164 #define ACTIVE_DL_BWP_ID 0
165 #define ACTIVE_UL_BWP_ID 0
166 #define SCRAMBLING_ID NR_PCI
167 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
168 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
170 /*******************************************************************
172 * @brief Sends F1 msg over SCTP
176 * Function : SendF1APMsg
178 * Functionality: Sends F1 msg over SCTP
180 * @params[in] Region region
182 * @return ROK - success
185 * ****************************************************************/
186 S16 SendF1APMsg(Region region, Pool pool)
188 Buffer *mBuf = NULLP;
190 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
192 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
194 ODU_PRINT_MSG(mBuf, 0,0);
196 if(sctpSend(mBuf) != ROK)
198 DU_LOG("\nF1AP : SCTP Send failed");
199 ODU_PUT_MSG_BUF(mBuf);
205 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
206 ODU_PUT_MSG_BUF(mBuf);
209 ODU_PUT_MSG_BUF(mBuf);
213 DU_LOG("\nF1AP : Failed to allocate memory");
220 /*******************************************************************
222 * @brief Builds NRCell ID
226 * Function : BuildNrCellId
228 * Functionality: Building the NR Cell ID
230 * @params[in] BIT_STRING_t *nrcell
231 * @return ROK - success
234 * ****************************************************************/
236 S16 BuildNrCellId(BIT_STRING_t *nrcell)
238 memset(nrcell->buf, 0, nrcell->size);
240 nrcell->bits_unused = 4;
241 nrcell->size = 5 * sizeof(uint8_t);
245 /********************************************************************
247 * @brief Builds and sends the F1SetupResponse
251 * Function : BuildAndSendF1SetupRsp
253 * Functionality: Constructs the F1SetupResponse message and sends
254 * it back to the DU through SCTP.
256 * @params[in] void **buf,Buffer to which encoded pattern is written into
257 * @params[in] int *size,size of buffer
259 * @return ROK - success
262 * ****************************************************************/
263 S16 BuildAndSendF1SetupRsp()
266 uint8_t elementCnt,cellCnt;
267 F1AP_PDU_t *f1apMsg = NULL;
268 F1SetupResponse_t *f1SetupRsp;
269 GNB_CU_Name_t *cuName;
270 Cells_to_be_Activated_List_t *cellToActivate;
271 RRC_Version_t *rrcVer;
272 asn_enc_rval_t encRetVal;
273 DU_LOG("\nF1AP : Building F1 Setup Response\n");
275 /* Allocate the memory for F1SetupRequest_t */
276 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
279 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
282 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
284 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
285 if(f1apMsg->choice.successfulOutcome == NULLP)
287 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
288 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
292 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
293 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
294 f1apMsg->choice.successfulOutcome->value.present = \
295 SuccessfulOutcome__value_PR_F1SetupResponse;
296 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
299 f1SetupRsp->protocolIEs.list.count = elementCnt;
300 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
302 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
303 elementCnt * sizeof(F1SetupResponseIEs_t *));
304 if(f1SetupRsp->protocolIEs.list.array == NULLP)
306 DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed");
307 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
308 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
312 for(idx=0; idx<elementCnt; idx++)
314 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
315 sizeof(F1SetupResponseIEs_t));
316 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
318 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
319 elementCnt * sizeof(F1SetupResponseIEs_t *));
320 CU_FREE(f1apMsg->choice.successfulOutcome, \
321 sizeof(SuccessfulOutcome_t));
322 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
329 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
330 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
331 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
332 F1SetupResponseIEs__value_PR_TransactionID;
333 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
338 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
339 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
340 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
341 F1SetupResponseIEs__value_PR_GNB_CU_Name;
342 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
343 cuName->size = sizeof(cuCfgParams.cuName);
345 CU_ALLOC(cuName->buf, sizeof(cuName->size));
346 if(cuName->buf == NULLP)
348 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
350 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
351 sizeof(F1SetupResponseIEs_t));
353 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
354 elementCnt * sizeof(F1SetupResponseIEs_t *));
355 CU_FREE(f1apMsg->choice.successfulOutcome,\
356 sizeof(SuccessfulOutcome_t));
357 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
360 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
362 /*Cells to be activated list*/
364 f1SetupRsp->protocolIEs.list.array[idx]->id = \
365 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
366 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
367 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
368 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
369 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
370 Cells_to_be_Activated_List;
372 cellToActivate->list.count = cellCnt;
373 cellToActivate->list.size = \
374 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
375 CU_ALLOC(cellToActivate->list.array,\
376 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
377 if(cellToActivate->list.array == NULLP)
379 CU_FREE(cuName->buf, sizeof(cuName->size));
380 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
382 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
383 sizeof(F1SetupResponseIEs_t));
385 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
386 elementCnt * sizeof(F1SetupResponseIEs_t *));
387 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
388 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
391 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
393 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
394 if(cellToActivate->list.array[ieIdx] == NULLP)
396 CU_FREE(cellToActivate->list.array,\
397 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
398 CU_FREE(cuName->buf, sizeof(cuName->size));
399 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
401 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
402 sizeof(F1SetupResponseIEs_t));
404 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
405 elementCnt * sizeof(F1SetupResponseIEs_t *));
406 CU_FREE(f1apMsg->choice.successfulOutcome, \
407 sizeof(SuccessfulOutcome_t));
408 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
412 cellToActivate->list.array[0]->id = \
413 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
414 cellToActivate->list.array[0]->criticality = Criticality_ignore;
415 cellToActivate->list.array[0]->value.present = \
416 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
417 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
418 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
419 CU_ALLOC(cellToActivate->list.array[0]->\
420 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
422 if(cellToActivate->list.array[0]->value.choice.\
423 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
426 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
428 CU_FREE(cellToActivate->list.array[ieIdx],\
429 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
432 CU_FREE(cellToActivate->list.array,\
433 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
434 CU_FREE(cuName->buf, sizeof(cuName->size));
435 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
437 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
438 sizeof(F1SetupResponseIEs_t));
440 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
441 elementCnt * sizeof(F1SetupResponseIEs_t *));
442 CU_FREE(f1apMsg->choice.successfulOutcome, \
443 sizeof(SuccessfulOutcome_t));
444 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
447 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
448 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
449 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
450 nRCGI.nRCellIdentity.size = 5;
451 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
452 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
454 if(cellToActivate->list.array[0]->value.choice.\
455 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
457 CU_FREE(cellToActivate->list.array[0]->\
458 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
460 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
462 CU_FREE(cellToActivate->list.array[ieIdx],\
463 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
466 CU_FREE(cellToActivate->list.array,\
467 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
468 CU_FREE(cuName->buf, sizeof(cuName->size));
469 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
471 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
472 sizeof(F1SetupResponseIEs_t));
474 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
475 elementCnt * sizeof(F1SetupResponseIEs_t *));
476 CU_FREE(f1apMsg->choice.successfulOutcome, \
477 sizeof(SuccessfulOutcome_t));
478 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
481 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
484 f1SetupRsp->protocolIEs.list.array[idx]->id = \
485 ProtocolIE_ID_id_GNB_CU_RRC_Version;
486 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
487 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
488 F1SetupResponseIEs__value_PR_RRC_Version;
489 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
490 rrcVer->latest_RRC_Version.size = RRC_SIZE;
492 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
493 if(rrcVer->latest_RRC_Version.buf == NULLP)
495 CU_FREE(cuName->buf, sizeof(cuName->size));
496 for(ieIdx=0; ieIdx<elementCnt; idx++)
498 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
499 sizeof(F1SetupResponseIEs_t));
501 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
502 elementCnt * sizeof(F1SetupResponseIEs_t *));
503 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
504 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
508 /* Need to check RRC Version */
509 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
510 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
511 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
512 if(rrcVer->iE_Extensions == NULLP)
514 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
515 CU_FREE(cuName->buf, sizeof(cuName->size));
516 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
518 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
519 sizeof(F1SetupResponseIEs_t));
521 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
522 elementCnt * sizeof(F1SetupResponseIEs_t *));
523 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
524 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
527 rrcVer->iE_Extensions->list.count = 1;
528 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
529 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
530 sizeof(struct RRC_Version_ExtIEs *));
531 if(rrcVer->iE_Extensions->list.array == NULLP)
533 CU_FREE(rrcVer->iE_Extensions,\
534 sizeof(ProtocolExtensionContainer_4624P81_t));
535 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
536 CU_FREE(cuName->buf, sizeof(cuName->size));
537 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
539 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
540 sizeof(F1SetupResponseIEs_t));
542 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
543 elementCnt * sizeof(F1SetupResponseIEs_t *));
544 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
545 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
548 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
549 sizeof(struct RRC_Version_ExtIEs));
550 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
552 CU_FREE(rrcVer->iE_Extensions->list.array,\
553 sizeof(struct RRC_Version_ExtIEs *));
554 CU_FREE(rrcVer->iE_Extensions,\
555 sizeof(ProtocolExtensionContainer_4624P81_t));
556 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
557 CU_FREE(cuName->buf, sizeof(cuName->size));
558 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
560 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
561 sizeof(F1SetupResponseIEs_t));
563 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
564 elementCnt * sizeof(F1SetupResponseIEs_t *));
565 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
566 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
569 rrcVer->iE_Extensions->list.array[0]->id = \
570 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
571 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
572 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
573 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
574 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
575 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
576 CU_ALLOC(rrcVer->iE_Extensions->list.\
577 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
579 if(rrcVer->iE_Extensions->list.\
580 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
582 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
583 sizeof(struct RRC_Version_ExtIEs));
584 CU_FREE(rrcVer->iE_Extensions->list.array,\
585 sizeof(struct RRC_Version_ExtIEs *));
586 CU_FREE(rrcVer->iE_Extensions,\
587 sizeof(ProtocolExtensionContainer_4624P81_t));
588 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
589 CU_FREE(cuName->buf, sizeof(cuName->size));
590 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
592 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
593 sizeof(F1SetupResponseIEs_t));
595 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
596 elementCnt * sizeof(F1SetupResponseIEs_t *));
597 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
598 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
601 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
602 Latest_RRC_Version_Enhanced.buf[0] = 0;
603 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
604 Latest_RRC_Version_Enhanced.buf[1] = 5;
605 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
606 Latest_RRC_Version_Enhanced.buf[2] = 15;
608 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
610 /* Encode the F1SetupRequest type as UPER */
611 memset(encBuf, 0, ENC_BUF_MAX_LEN);
613 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
616 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
617 CU_FREE(cuName->buf, sizeof(cuName->size));
618 for(idx=0; idx<elementCnt; idx++)
620 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
622 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
623 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
624 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
626 /* Check encode results */
627 if(encRetVal.encoded == ENCODE_FAIL)
629 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
630 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
635 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
636 for(int i=0; i< encBufSize; i++)
638 printf("%x",encBuf[i]);
643 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
645 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
650 }/* End of BuildAndSendF1SetupRsp */
652 /*******************************************************************
654 * @brief Builds and sends the DUUpdateAcknowledge
658 * Function : BuildAndSendDUUpdateAck
660 * Functionality: Constructs the DU Update Acknowledge message and sends
661 * it to the DU through SCTP.
663 * @params[in] void **buf,Buffer to which encoded pattern is written into
664 * @params[in] int *size,size of buffer
666 * @return ROK - success
669 * ****************************************************************/
671 S16 BuildAndSendDUUpdateAck()
675 F1AP_PDU_t *f1apMsg = NULL;
676 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
677 asn_enc_rval_t enRetVal; /* Encoder return value */
679 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
681 /* Allocate the memory for F1SetupRequest_t */
682 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
685 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
689 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
691 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
692 if(f1apMsg->choice.successfulOutcome == NULLP)
694 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
695 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
699 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
700 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
701 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
702 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
705 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
706 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
708 /* Initialize the F1Setup members */
709 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
710 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
712 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
713 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
714 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
718 for(idx=0; idx<elementCnt; idx++)
720 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
721 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
723 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
724 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
725 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
732 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
733 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
734 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
735 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
737 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
739 /* Encode the F1SetupRequest type as UPER */
740 memset(encBuf, 0, ENC_BUF_MAX_LEN);
742 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
745 for(idx=0; idx<elementCnt; idx++)
747 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
749 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
750 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
751 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
753 /* Checking encode results */
754 if(enRetVal.encoded == ENCODE_FAIL)
756 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
761 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
762 for(int i=0; i< encBufSize; i++)
764 printf("%x",encBuf[i]);
769 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
771 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
777 }/* End of BuildAndSendDUUpdateAck*/
778 /*******************************************************************
780 * @brief deallocating the memory of F1reset msg
784 * Function : FreeF1ResetReq
787 * - freeing memory of F1reset request msg
793 * ****************************************************************/
794 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
797 Reset_t *f1ResetMsg = NULLP;
801 if(f1apMsg->choice.initiatingMessage)
803 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
804 if(f1ResetMsg->protocolIEs.list.array)
806 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
808 if(f1ResetMsg->protocolIEs.list.array[idx])
810 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
813 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
815 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
817 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
820 /*******************************************************************
822 * @brief build ansld ans send f1reset msg
826 * Function : BuildAndSendF1ResetReq
828 * Functionality: build and send f1reset msg
830 * @return ROK - success
833 * ****************************************************************/
834 uint8_t BuildAndSendF1ResetReq()
836 uint8_t elementCnt=0;
838 uint8_t ret= RFAILED;
839 Reset_t *f1ResetMsg = NULLP;
840 F1AP_PDU_t *f1apMsg = NULLP;
841 asn_enc_rval_t encRetVal;
842 DU_LOG("\nF1AP : Building F1 Reset request \n");
845 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
848 DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
851 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
852 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
853 if(f1apMsg->choice.initiatingMessage == NULLP)
855 DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed");
858 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
859 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
860 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
862 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
865 f1ResetMsg->protocolIEs.list.count = elementCnt;
866 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
868 /* Initialize the F1Reset members */
869 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
870 if(f1ResetMsg->protocolIEs.list.array == NULLP)
872 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq");
875 for(idx=0; idx<elementCnt; idx++)
877 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
878 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
880 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
887 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
888 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
889 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
890 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
894 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
895 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
896 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
897 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
898 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
902 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
903 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
905 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
906 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
908 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
910 /* Encode the F1SetupRequest type as APER */
911 memset(encBuf, 0, ENC_BUF_MAX_LEN);
913 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
917 if(encRetVal.encoded == ENCODE_FAIL)
919 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
920 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
925 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
926 for(idx=0; idx< encBufSize; idx++)
928 printf("%x",encBuf[idx]);
932 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
934 DU_LOG("\nF1AP : Sending F1 Reset request failed");
942 FreeF1ResetReq(f1apMsg);
946 /*******************************************************************
948 * @brief Fills Radio Bearer Config
952 * Function : fillSrbCfg
954 * Functionality: Fills Radio Bearer Config
956 * @params[in] SRB_ToAddModList *
958 * @return ROK - success
961 * ****************************************************************/
962 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
966 if(bearerCfg != NULLP)
969 bearerCfg->list.count = elementCnt;
970 bearerCfg->list.size =\
971 elementCnt * sizeof(SRB_ToAddMod_t *);
972 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
973 if(bearerCfg->list.array != NULLP)
975 for(idx = 0; idx < elementCnt; idx++)
977 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
978 if(bearerCfg->list.array[idx] == NULLP)
980 for(ieId = 0; ieId < idx; ieId++)
982 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
984 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
994 bearerCfg->list.array[idx]->srb_Identity = srbId;
999 /*******************************************************************
1001 * @brief Fills Master CellGroup Info
1005 * Function : fillMasterCellGroup
1007 * Functionality: Fills Master Cell Group IE
1009 * @params[in] RRCSetup_IEs_t *
1011 * @return ROK - success
1014 * ****************************************************************/
1016 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1019 masterCellGroup->buf = NULLP;
1020 if(f1apMsgDb.duToCuContainer.buf)
1022 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1023 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1024 if(masterCellGroup->buf != NULLP)
1026 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1027 masterCellGroup->size);
1041 /*******************************************************************
1043 * @brief Fills RRC setup IE
1047 * Function : fillRRCSetupIE
1049 * Functionality: Fills RRC Setup IE
1051 * @params[in] RRCSetup_IEs_t *
1053 * @return ROK - success
1056 * ****************************************************************/
1058 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1063 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1064 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1066 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1070 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1074 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1080 /*******************************************************************
1082 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1086 * Function : fillDlCcchRrcMsg
1088 * Functionality: Fills DL DCCCH Message required for
1089 * DLRRCMessageTransfer
1091 * @params[in] RRCContainer_t *rrcContainer
1093 * @return ROK - success
1096 * ****************************************************************/
1098 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1102 DL_CCCH_Message_t dl_CCCH_Msg;
1103 asn_enc_rval_t encRetVal;
1105 if(rrcContainer != NULLP)
1107 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1109 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1110 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1112 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1113 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1114 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1116 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1117 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1118 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1119 /* Fill RRC Setup IE */
1120 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1121 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1122 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1123 criticalExtensions.choice.rrcSetup != NULLP)
1125 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1126 criticalExtensions.choice.rrcSetup);
1130 /* encode DL-CCCH message into RRC Container */
1131 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1132 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1134 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1135 /* Encode results */
1136 if(encRetVal.encoded == ENCODE_FAIL)
1138 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1139 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1144 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1145 for(int i = 0; i< encBufSize; i++)
1147 printf("%x",encBuf[i]);
1149 rrcContainer->size = encBufSize;
1150 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1151 if(rrcContainer->buf != NULLP)
1153 memset(rrcContainer->buf, 0, encBufSize);
1154 for(idx2 = 0; idx2 < encBufSize; idx2++)
1156 rrcContainer->buf[idx2] = encBuf[idx2];
1168 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1174 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1180 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1186 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1191 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1193 uint8_t idx, ied, elementCnt;
1196 qosFlow->list.count = elementCnt;
1197 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1198 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1199 if(qosFlow->list.array != NULLP)
1201 for(idx = 0; idx < elementCnt; idx++)
1203 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1204 if(qosFlow->list.array[idx] == NULLP)
1206 for(ied = 0; ied < idx; ied++)
1208 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1210 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1216 *qosFlow->list.array[idx] = 9;
1220 /*******************************************************************
1222 * @brief Fills CN Assoc for Drb to Add/Mod List
1226 * Function : fillCnAssoc
1228 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1230 * @params[in] struct DRB_ToAddMod__cnAssociation *
1232 * @return ROK - success
1235 * ****************************************************************/
1237 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1241 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1242 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1244 cnAssoc->choice.eps_BearerIdentity = 5;
1246 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1248 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1249 if(cnAssoc->choice.sdap_Config)
1251 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1252 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1253 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1254 cnAssoc->choice.sdap_Config->defaultDRB = true;
1255 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1256 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1257 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1258 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1259 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1261 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1265 DU_LOG("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1266 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1272 DU_LOG("\nF1AP: Mem alloc failed at fillCnAssoc()");
1279 /*******************************************************************
1281 * @brief Fills Radio Bearer Config for Drb
1285 * Function : fillDrbCfg
1287 * Functionality: Fills Radio Bearer Config for Drb
1289 * @params[in] drbId, DRB_ToAddModList *
1291 * @return ROK - success
1294 * ****************************************************************/
1295 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1297 uint8_t idx, ied, ret, elementCnt;
1303 drbCfg->list.count = elementCnt;
1304 drbCfg->list.size =\
1305 elementCnt * sizeof(DRB_ToAddMod_t *);
1306 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1307 if(drbCfg->list.array != NULLP)
1309 for(idx = 0; idx < elementCnt; idx++)
1311 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1312 if(drbCfg->list.array[idx] == NULLP)
1314 for(ied = 0; ied < idx; ied++)
1316 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1318 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1328 /* CN ASSOCIATION */
1329 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1330 if(drbCfg->list.array[idx]->cnAssociation)
1332 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1335 drbCfg->list.array[idx]->drb_Identity = drbId;
1340 /*******************************************************************
1342 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1346 * Function : fillRrcReconfigIE
1348 * Functionality: Fills RRC Reconfig Message required for
1349 * DLRRCMessageTransfer
1351 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1353 * @return ROK - success
1356 * ****************************************************************/
1358 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1361 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1362 if(rrcReconfigMsg->radioBearerConfig)
1364 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1365 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1367 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1372 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1373 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1375 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1378 DU_LOG("\n F1AP: Failed to fill DrbCfg at fillRrcReconfigIE()");
1379 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1380 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1386 DU_LOG("\n F1AP: memory Alloc failed at fillRrcReconfigIE()");
1387 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1393 /*******************************************************************
1395 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1399 * Function : fillDlDcchRrcMsg
1401 * Functionality: Fills DL DCCH Message required for
1402 * DLRRCMessageTransfer
1404 * @params[in] RRCContainer_t *rrcContainer
1406 * @return ROK - success
1409 * ****************************************************************/
1411 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1415 DL_DCCH_Message_t dl_DCCH_Msg;
1416 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1417 asn_enc_rval_t encRetVal;
1419 if(rrcContainer != NULLP)
1421 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1423 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1424 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1426 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1427 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1428 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1430 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1431 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1432 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1433 /* Fill RRC Reconfig IE */
1434 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1435 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1436 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1437 criticalExtensions.choice.rrcReconfiguration != NULLP)
1439 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1440 criticalExtensions.choice.rrcReconfiguration);
1444 /* encode DL-DCCH message into RRC Container */
1445 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1446 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1448 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1449 /* Encode results */
1450 if(encRetVal.encoded == ENCODE_FAIL)
1452 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1453 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1458 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1459 for(int i = 0; i< encBufSize; i++)
1461 printf("%x",encBuf[i]);
1463 rrcContainer->size = encBufSize;
1464 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1465 if(rrcContainer->buf != NULLP)
1467 memset(rrcContainer->buf, 0, encBufSize);
1468 for(idx2 = 0; idx2 < encBufSize; idx2++)
1470 rrcContainer->buf[idx2] = encBuf[idx2];
1477 DU_LOG("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1482 DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1488 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1494 DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1500 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1506 /*******************************************************************
1508 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1512 * Function : BuildDLRRCContainer
1514 * Functionality: Builds RRC Container IE required for
1515 * DLRRCMessageTransfer
1519 * @return ROK - success
1522 * ****************************************************************/
1524 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1526 uint8_t ret, bufLen;
1529 if(rrcMsgType == RRC_SETUP)
1531 ret = fillDlCcchRrcMsg(rrcContainer);
1533 DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1535 else if(rrcMsgType == REGISTRATION_ACCEPT)
1537 /*Hardcoded RRC Container from reference logs*/
1538 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1540 rrcContainer->size = bufLen;
1541 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1542 if(rrcContainer->buf != NULLP)
1544 memset(rrcContainer->buf, 0, bufLen);
1545 memcpy(rrcContainer->buf, buf, bufLen);
1548 else if(rrcMsgType == RRC_RECONFIG)
1550 /*Hardcoded RRC Container from reference logs*/
1552 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1553 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1554 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1555 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1556 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1557 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1558 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1559 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1560 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1561 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1562 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1563 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1564 0x00, 0x00, 0x00, 0x00};
1566 rrcContainer->size = bufLen;
1567 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1568 if(rrcContainer->buf != NULLP)
1570 memset(rrcContainer->buf, 0, bufLen);
1571 memcpy(rrcContainer->buf, buf, bufLen);
1578 /*******************************************************************
1580 * @brief Builds and sends the DLRRCMessageTransfer
1584 * Function : BuildAndSendDLRRCMessageTransfer
1586 * Functionality: Constructs the DL RRC Message Transfer and sends
1587 * it to the CU through SCTP.
1591 * @return ROK - success
1594 * ****************************************************************/
1595 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1597 uint8_t elementCnt = 0;
1600 F1AP_PDU_t *f1apMsg = NULLP;
1601 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1602 asn_enc_rval_t encRetVal; /* Encoder return value */
1604 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1606 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1607 if(f1apMsg == NULLP)
1609 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1613 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1614 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1615 sizeof(InitiatingMessage_t));
1616 if(f1apMsg->choice.initiatingMessage == NULLP)
1618 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1619 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1623 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1624 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1625 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1626 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1629 dlRRCMsg->protocolIEs.list.count = elementCnt;
1630 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1632 /* Initialize the F1Setup members */
1633 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1634 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1636 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1637 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1638 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1642 for(idx=0; idx<elementCnt; idx++)
1644 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1645 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1647 for(ieId=0; ieId<idx; ieId++)
1649 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1650 sizeof(DLRRCMessageTransferIEs_t));
1652 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1653 dlRRCMsg->protocolIEs.list.size);
1654 CU_FREE(f1apMsg->choice.initiatingMessage,\
1655 sizeof(InitiatingMessage_t));
1656 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1661 /* GNB CU UE F1AP ID */
1663 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1664 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1665 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1666 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1667 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1669 /* GNB DU UE F1AP ID */
1671 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1672 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1673 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1674 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1675 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1676 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1680 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1681 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1683 DLRRCMessageTransferIEs__value_PR_SRBID;
1684 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1688 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1689 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1691 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1692 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1694 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1696 /* Encode the F1SetupRequest type as APER */
1697 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1699 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1701 /* Encode results */
1702 if(encRetVal.encoded == ENCODE_FAIL)
1704 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1705 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1710 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1711 for(int i=0; i< encBufSize; i++)
1713 printf("%x",encBuf[i]);
1718 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1720 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1725 }/* End of BuildAndSendDLRRCMessageTransfer */
1727 /*******************************************************************
1729 * @brief Function to set the Dl RRC Msg Type
1733 * Function : setDlRRCMsgType
1735 * Functionality: Constructs the UE Setup Response and sends
1736 * it to the DU through SCTP.
1740 * @return ROK - success
1743 * ****************************************************************/
1745 uint8_t setDlRRCMsgType()
1747 uint8_t rrcMsgType = 0;
1748 switch(f1apMsgDb.dlRrcMsgCount)
1751 rrcMsgType = RRC_SETUP;
1753 case REGISTRATION_ACCEPT:
1754 rrcMsgType = REGISTRATION_ACCEPT;
1756 case UE_CONTEXT_SETUP_REQ:
1757 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1759 case SECURITY_MODE_COMPLETE:
1760 rrcMsgType = SECURITY_MODE_COMPLETE;
1763 rrcMsgType = RRC_RECONFIG;
1771 /*******************************************************************
1773 * @brief Function to build Initial UL RRC Message
1777 * Function : procInitULRRCMsg
1779 * Functionality: Function to build Initial UL RRC Message
1783 * @return ROK - success
1786 * ****************************************************************/
1788 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1790 uint8_t idx, rrcMsgType;
1792 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1793 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1795 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1797 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1799 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1801 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1803 case ProtocolIE_ID_id_NRCGI:
1805 case ProtocolIE_ID_id_C_RNTI:
1807 case ProtocolIE_ID_id_RRCContainer:
1809 case ProtocolIE_ID_id_DUtoCURRCContainer:
1811 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1812 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1813 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1815 DU_LOG("\n Received Du to Cu RRC Container ");
1816 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1817 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1818 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1819 f1apMsgDb.duToCuContainer.size);
1820 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1822 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1823 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1824 .duToCuContainer.size);
1829 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1835 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1841 f1apMsgDb.dlRrcMsgCount++;
1842 rrcMsgType = setDlRRCMsgType();
1843 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1848 /*******************************************************************
1850 * @brief Builds Nrcgi
1854 * Function : BuildNrcgi
1856 * Functionality: Building the PLMN ID and NR Cell id
1858 * @params[in] NRCGI_t *nrcgi
1859 * @return ROK - success
1862 * ****************************************************************/
1863 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1866 uint8_t unused_bits = 4;
1867 uint8_t byteSize = 5;
1869 /* Allocate Buffer Memory */
1870 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1871 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1872 if(nrcgi->pLMN_Identity.buf == NULLP)
1876 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1882 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1883 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1884 if(nrcgi->nRCellIdentity.buf == NULLP)
1889 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1895 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1896 nrcgi->nRCellIdentity.buf[0] |= val;
1897 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1901 /*******************************************************************
1903 * @brief Builds Special cell list for UE Setup Request
1907 * Function : BuildSplCellList
1909 * Functionality: Constructs the Special Cell list for UESetReq
1911 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1913 * @return ROK - success
1916 * ****************************************************************/
1917 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1923 spCellLst->list.count = cellCnt;
1924 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1925 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1926 if(spCellLst->list.array == NULLP)
1930 for(idx=0; idx<cellCnt; idx++)
1932 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1933 if(spCellLst->list.array[idx] == NULLP)
1939 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1940 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1941 spCellLst->list.array[idx]->value.present =\
1942 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1943 /* Special Cell ID -NRCGI */
1944 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1949 /*Special Cell Index*/
1950 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1952 }/* End of BuildSplCellList*/
1954 /*******************************************************************
1956 * @brief Builds SRBS to be setup
1960 * Function : BuildSRBSetup
1962 * Functionality: Constructs the SRB's for UESetReq
1964 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1966 * @return ROK - success
1969 * ****************************************************************/
1970 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1975 srbSet->list.count = srbCnt;
1976 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1977 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1978 if(srbSet->list.array == NULLP)
1982 for(idx=0; idx<srbCnt; idx++)
1984 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1985 if(srbSet->list.array[idx] == NULLP)
1991 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1992 srbSet->list.array[idx]->criticality = Criticality_ignore;
1993 srbSet->list.array[idx]->value.present = \
1994 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1995 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1997 }/* End of BuildSRBSetup*/
1999 /*******************************************************************
2001 * @brief Builds QOS Info for DRB Setum Item
2005 * Function : BuildQOSInfo
2007 * Functionality: Constructs the QOS Info for DRB Setup Item
2009 * @params[in] QoSInformation_t *qosinfo
2011 * @return ROK - success
2014 * ****************************************************************/
2015 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2017 /* NonDynamic5QIDescriptor */
2018 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2019 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2020 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2025 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2027 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2028 sizeof(AveragingWindow_t));
2029 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2034 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2035 /*MaxDataBurstVolume*/
2036 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2037 sizeof(MaxDataBurstVolume_t));
2038 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2043 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2045 /*nRGRAN Allocation Retention Priority*/
2046 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2047 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2048 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2050 /* TO DO: GBR_QoSFlowInformation */
2052 }/*End of BuildQOSInfo*/
2054 /*******************************************************************
2056 * @brief Builds SNSSAI
2060 * Function : BuildSNSSAI
2062 * Functionality: Constructs the SNSSAI For DRB list
2064 * @params[in] SNSSAI_t *snssai
2066 * @return ROK - success
2069 * ****************************************************************/
2070 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2074 snssai->sST.size = sizeof(uint8_t);
2075 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2076 if(snssai->sST.buf == NULLP)
2080 snssai->sST.buf[0] = 3;
2082 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2083 if(snssai->sD == NULLP)
2087 snssai->sD->size = 3*sizeof(uint8_t);
2088 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2089 if(snssai->sD->buf == NULLP)
2093 snssai->sD->buf[0] = 3;
2094 snssai->sD->buf[1] = 6;
2095 snssai->sD->buf[2] = 9;
2097 }/*End of BuildSNSSAI*/
2099 /*******************************************************************
2101 * @brief Builds the flow map.
2105 * Function : BuildFlowsMap
2107 * Functionality: Constructs the flowmap For DRB list
2109 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2111 * @return ROK - success
2114 * ****************************************************************/
2115 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2121 flowMap->list.count = flowCnt;
2122 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2123 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2124 if(flowMap->list.array == NULLP)
2128 for(idx=0; idx<flowCnt; idx++)
2130 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2131 if(flowMap->list.array[idx] == NULLP)
2137 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2138 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2144 }/*End of BuildFlowsMap*/
2146 /*******************************************************************
2148 * @brief Builds the Uplink Tunnel Info
2152 * Function : BuildULTnlInfo
2154 * Functionality: Constructs the UL TnlInfo For DRB list
2156 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2158 * @return ROK - success
2161 * ****************************************************************/
2162 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2167 ulInfo->list.count = ulCnt;
2168 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2169 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2170 if(ulInfo->list.array == NULLP)
2174 for(idx=0; idx<ulCnt; idx++)
2176 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2177 if(ulInfo->list.array[idx] == NULLP)
2183 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2184 UPTransportLayerInformation_PR_gTPTunnel;
2186 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2187 sizeof(GTPTunnel_t));
2188 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2192 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2193 transportLayerAddress.size = 4*sizeof(uint8_t);
2194 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2195 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2196 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2197 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2198 transportLayerAddress.buf == NULLP)
2202 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2203 transportLayerAddress.buf[0] = 4;
2204 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2205 transportLayerAddress.buf[1] = 4;
2206 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2207 transportLayerAddress.buf[2] = 4;
2208 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2209 transportLayerAddress.buf[3] = 5;
2210 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2211 transportLayerAddress.bits_unused = 0;
2213 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2214 = 4 * sizeof(uint8_t);
2215 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2217 gTPTunnel->gTP_TEID.size);
2218 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2223 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2224 gTP_TEID.buf[0] = 11;
2225 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2226 gTP_TEID.buf[1] = 0;
2227 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2228 gTP_TEID.buf[2] = 0;
2229 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2230 gTP_TEID.buf[3] = 1;
2233 }/*End of BuildULTnlInfo*/
2235 /*******************************************************************
2237 * @brief Builds DRBS to be setup
2241 * Function : BuildDRBSetup
2243 * Functionality: Constructs the DRB's for UESetReq
2245 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2247 * @return ROK - success
2250 * ****************************************************************/
2251 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2253 uint8_t BuildQOSInforet;
2254 uint8_t BuildSNSSAIret;
2255 uint8_t BuildFlowsMapret;
2256 uint8_t BuildULTnlInforet;
2259 DRBs_ToBeSetup_Item_t *drbSetItem;
2261 drbSet->list.count = drbCnt;
2262 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2263 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2264 if(drbSet->list.array == NULLP)
2268 for(idx=0; idx<drbCnt; idx++)
2270 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2271 if(drbSet->list.array[idx] == NULLP)
2277 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2278 drbSet->list.array[idx]->criticality = Criticality_ignore;
2279 drbSet->list.array[idx]->value.present = \
2280 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2281 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2283 drbSetItem->dRBID = 1;
2285 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2286 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2287 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2291 drbSetItem->qoSInformation.choice.choice_extension->id = \
2292 ProtocolIE_ID_id_DRB_Information;
2293 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2295 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2296 QoSInformation_ExtIEs__value_PR_DRB_Information;
2297 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2298 choice_extension->value.choice.DRB_Information.dRB_QoS);
2299 if(BuildQOSInforet != ROK)
2304 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2305 choice_extension->value.choice.DRB_Information.sNSSAI);
2306 if(BuildSNSSAIret != ROK)
2310 /*Flows mapped to DRB List*/
2311 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2312 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2313 if(BuildFlowsMapret != ROK)
2317 /*ULUPTNLInformation To Be Setup List*/
2318 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2319 if(BuildULTnlInforet != ROK)
2324 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2326 /*UL Configuration*/
2327 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2328 if(drbSetItem->uLConfiguration == NULLP)
2332 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2334 }/* End of BuildDRBSetup*/
2336 /*******************************************************************
2338 * @brief Deallocating memory of function BuildAndSendUESetReq
2342 * Function : FreeNrcgi
2344 * Functionality: Deallocating memory for function BuildNrcgi
2346 * @params[in] NRCGI_t *nrcgi
2350 *******************************************************************/
2351 void FreeNrcgi(NRCGI_t *nrcgi)
2353 if(nrcgi->pLMN_Identity.buf != NULLP)
2355 if(nrcgi->nRCellIdentity.buf != NULLP)
2357 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2359 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2362 /*******************************************************************
2364 * @brief Deallocating memory of function BuildAndSendUESetReq
2368 * Function : FreeSplCellList
2370 * Functionality: Deallocating memory for function BuildSplCellList
2372 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2377 * *****************************************************************/
2378 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2381 if(spCellLst->list.array != NULLP)
2383 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2385 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2387 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2389 if(spCellLst->list.array[cellidx]!=NULLP)
2391 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2394 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2397 /*******************************************************************
2399 * @brief Deallocating memory of function BuildAndSendUESetReq
2403 * Function : FreeSRBSetup
2405 * Functionality: Deallocating memory for function BuildSRBSetup
2407 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2412 * ******************************************************************/
2413 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2416 if(srbSet->list.array != NULLP)
2418 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2420 if(srbSet->list.array[srbidx]!=NULLP)
2422 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2425 CU_FREE(srbSet->list.array,srbSet->list.size);
2428 /*******************************************************************
2430 * @brief Deallocating memory of function BuildAndSendUESetReq
2434 * Function : FreeQOSInfo
2436 * Functionality: Deallocating memory for function BuildQOSInfo
2438 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2442 * ****************************************************************/
2443 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2445 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2447 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2449 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2451 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2452 sizeof(MaxDataBurstVolume_t));
2454 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2455 sizeof(AveragingWindow_t));
2457 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2458 sizeof(NonDynamic5QIDescriptor_t));
2461 /*******************************************************************
2463 * @brief Deallocating memory of function BuildAndSendUESetReq
2467 * Function : FreeULTnlInfo
2469 * Functionality: Deallocating memory for function BuildULTnlInfo
2471 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2476 * ****************************************************************/
2477 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2480 if(ulInfo->list.array != NULLP)
2482 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2484 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2486 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2488 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2489 transportLayerAddress.buf != NULLP)
2491 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2494 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2495 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2496 gTPTunnel->gTP_TEID.size);
2498 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2499 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2500 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2502 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2503 sizeof(GTPTunnel_t));
2506 if(ulInfo->list.array[ulidx]!=NULLP)
2508 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2511 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2514 /*******************************************************************
2516 * @brief Deallocating memory for BuildAndSendUESetReq
2520 * Function : FreeDRBSetup
2522 * Functionality: Deallocating memory for BuildDRBSetup
2524 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2528 * ****************************************************************/
2529 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2531 DRBs_ToBeSetup_Item_t *drbSetItem;
2534 if(drbSet->list.array == NULLP)
2536 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2538 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2540 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2541 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2543 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2544 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2546 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2547 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2549 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2550 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2552 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2554 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2556 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2558 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2559 flows_Mapped_To_DRB_List.list.array != NULLP)
2561 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2562 flows_Mapped_To_DRB_List.list.count; flowidx++)
2564 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2565 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2567 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2568 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2569 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2571 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2572 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2573 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2575 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2576 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2577 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2579 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2580 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2582 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2583 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2584 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2585 sizeof(MaxDataBurstVolume_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->averagingWindow,sizeof(AveragingWindow_t));
2591 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2592 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2593 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2596 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2597 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2599 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2600 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2603 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2604 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2605 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2607 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2608 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2610 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2611 sizeof(OCTET_STRING_t));
2613 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2614 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2616 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2617 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2619 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2620 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2622 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2623 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2625 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2628 if(drbSet->list.array[drbidx]!=NULLP)
2630 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2633 CU_FREE(drbSet->list.array,drbSet->list.size);
2638 /*******************************************************************
2640 * @brief Free the UE Setup Request
2644 * Function : FreeUeContextSetupReq
2646 * Functionality: Deallocate the memory of BuildUESetReq
2648 * @params[in] F1AP_PDU_t *f1apMsg
2653 * ****************************************************************/
2654 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2657 UEContextSetupRequest_t *ueSetReq = NULLP;
2659 if(f1apMsg != NULLP)
2661 if(f1apMsg->choice.initiatingMessage != NULLP)
2663 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2664 if(ueSetReq->protocolIEs.list.array != NULLP)
2666 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2668 if(ueSetReq->protocolIEs.list.array[idx])
2670 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2672 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2674 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2676 case ProtocolIE_ID_id_SpCell_ID:
2677 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2679 case ProtocolIE_ID_id_ServCellIndex:
2681 case ProtocolIE_ID_id_SpCellULConfigured:
2683 case ProtocolIE_ID_id_CUtoDURRCInformation:
2684 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2686 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2687 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2689 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2690 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2692 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2693 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2695 case ProtocolIE_ID_id_RRCContainer:
2696 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2698 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2699 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2703 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2708 for(ieId=0; ieId<idx; ieId++)
2710 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2712 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2715 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2717 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2719 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2723 /**Filling cell group info **/
2724 /*******************************************************************
2726 * @brief Build Control resource set to add/modify list
2730 * Function : BuildControlRSetToAddModList
2732 * Functionality: Build Control resource set to add/modify list
2735 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2737 * @return ROK - success
2740 * ****************************************************************/
2741 uint8_t BuildControlRSetToAddModList
2743 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2748 uint8_t numBytes, bitsUnused;
2749 struct ControlResourceSet *controlRSet;
2750 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2751 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2754 controlRSetList->list.count = elementCnt;
2755 controlRSetList->list.size = \
2756 elementCnt * sizeof(struct ControlResourceSet *);
2758 controlRSetList->list.array = NULLP;
2759 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2760 if(!controlRSetList->list.array)
2762 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2766 for(idx = 0; idx < elementCnt; idx++)
2768 controlRSetList->list.array[idx] = NULLP;
2769 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2770 if(!controlRSetList->list.array[idx])
2772 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2778 controlRSet = controlRSetList->list.array[idx];
2779 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2781 /* Values harcoded according to our design:
2784 * Bit string stored ff0000000000
2788 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2789 controlRSet->frequencyDomainResources.buf = NULLP;
2790 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2791 controlRSet->frequencyDomainResources.size);
2792 if(!controlRSet->frequencyDomainResources.buf)
2794 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2798 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2799 coreset0EndPrb = CORESET0_END_PRB;
2800 coreset1StartPrb = coreset0EndPrb + 6;
2801 coreset1NumPrb = CORESET1_NUM_PRB;
2802 /* calculate the PRBs */
2803 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2804 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2805 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2807 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2808 controlRSet->cce_REG_MappingType.present = \
2809 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2811 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2812 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2813 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2814 controlRSet->tci_PresentInDCI = NULLP;
2816 uint8_t tciStateIdx;
2818 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2819 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2820 if(!controlRset->tci_StatesPDCCH_ToAddList)
2822 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2827 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2828 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2829 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2830 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2831 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2833 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2837 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2839 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2840 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2842 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2849 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2851 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2852 if(!controlRset->tci_PresentInDCI)
2854 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2858 *(controlRset->tci_PresentInDCI);
2861 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2862 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2863 if(!controlRSet->pdcch_DMRS_ScramblingID)
2865 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2868 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2871 } /* End BuildControlRSetToAddModList */
2873 /*******************************************************************
2875 * @brief Build search space to add/modify list
2879 * Function : BuildSearchSpcToAddModList
2881 * Functionality: Build search space to add/modify list
2884 * @return ROK - success
2887 * ****************************************************************/
2888 uint8_t BuildSearchSpcToAddModList
2890 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2898 struct SearchSpace *searchSpc;
2901 searchSpcList->list.count = elementCnt;
2902 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2904 searchSpcList->list.array = NULLP;
2905 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2906 if(!searchSpcList->list.array)
2908 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2912 for(idx = 0; idx < elementCnt; idx++)
2914 searchSpcList->list.array[idx] = NULLP;
2915 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2916 if(!searchSpcList->list.array[idx])
2918 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2924 searchSpc = searchSpcList->list.array[idx];
2926 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2928 searchSpc->controlResourceSetId = NULLP;
2929 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2930 if(!searchSpc->controlResourceSetId)
2932 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2935 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2937 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2938 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2939 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2940 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2942 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2945 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2946 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2948 searchSpc->duration = NULLP;
2949 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2950 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2951 if(!searchSpc->monitoringSymbolsWithinSlot)
2953 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2957 /* Values taken from reference logs :
2960 * Bit string stores 8000
2965 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2966 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2967 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2968 searchSpc->monitoringSymbolsWithinSlot->size);
2969 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2971 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2976 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2977 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2978 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2979 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2981 searchSpc->nrofCandidates = NULLP;
2982 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2983 if(!searchSpc->nrofCandidates)
2985 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2989 searchSpc->nrofCandidates->aggregationLevel1 = \
2990 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2991 searchSpc->nrofCandidates->aggregationLevel2 = \
2992 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2993 searchSpc->nrofCandidates->aggregationLevel4 = \
2994 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2995 searchSpc->nrofCandidates->aggregationLevel8 = \
2996 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2997 searchSpc->nrofCandidates->aggregationLevel16 = \
2998 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3000 searchSpc->searchSpaceType = NULLP;
3001 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3002 if(!searchSpc->searchSpaceType)
3004 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3008 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3010 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3011 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3012 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3013 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3015 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3018 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3019 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3022 }/* End BuildSearchSpcToAddModList */
3024 /*******************************************************************
3026 * @brief Builds BWP DL dedicated PDCCH config
3030 * Function : BuildBWPDlDedPdcchCfg
3032 * Functionality: Builds BWP DL dedicated PDCCH config
3034 * @params[in] struct PDCCH_Config *pdcchCfg
3036 * @return ROK - success
3039 * ****************************************************************/
3040 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3042 pdcchCfg->controlResourceSetToAddModList = NULLP;
3043 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3044 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3045 if(!pdcchCfg->controlResourceSetToAddModList)
3047 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3051 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3056 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3058 pdcchCfg->searchSpacesToAddModList = NULLP;
3059 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3060 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3061 if(!pdcchCfg->searchSpacesToAddModList)
3063 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3067 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3072 pdcchCfg->searchSpacesToReleaseList = NULLP;
3073 pdcchCfg->downlinkPreemption = NULLP;
3074 pdcchCfg->tpc_PUSCH = NULLP;
3075 pdcchCfg->tpc_PUCCH = NULLP;
3076 pdcchCfg->tpc_SRS = NULLP;
3081 /*******************************************************************
3083 * @brief Builds DMRS DL PDSCH Mapping type A
3087 * Function : BuildDMRSDLPdschMapTypeA
3089 * Functionality: Builds DMRS DL PDSCH Mapping type A
3092 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3093 * @return ROK - success
3096 * ****************************************************************/
3097 uint8_t BuildDMRSDLPdschMapTypeA
3099 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3102 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3103 dmrsDlCfg->choice.setup = NULLP;
3104 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3105 if(!dmrsDlCfg->choice.setup)
3107 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3111 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3112 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3113 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3114 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3116 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3119 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3121 dmrsDlCfg->choice.setup->maxLength = NULLP;
3122 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3123 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3124 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3129 /*******************************************************************
3131 * @brief Builds TCI states to add/modify list
3135 * Function : BuildTCIStatesToAddModList
3137 * Functionality:Builds TCI states to add/modify list
3140 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3142 * @return ROK - success
3145 * ****************************************************************/
3146 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3151 /*******************************************************************
3153 * @brief Builds PDSCH time domain allocation list
3157 * Function : BuildPdschTimeDomAllocList
3159 * Functionality: Builds PDSCH time domain allocation list
3162 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3164 * @return ROK - success
3167 * ****************************************************************/
3168 uint8_t BuildPdschTimeDomAllocList
3170 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3175 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3177 timeDomAllocList->present = \
3178 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3180 timeDomAllocList->choice.setup = NULLP;
3181 CU_ALLOC(timeDomAllocList->choice.setup, \
3182 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3183 if(!timeDomAllocList->choice.setup)
3185 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3190 timeDomAllocList->choice.setup->list.count = elementCnt;
3191 timeDomAllocList->choice.setup->list.size = \
3192 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3194 timeDomAllocList->choice.setup->list.array = NULLP;
3195 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3196 timeDomAllocList->choice.setup->list.size);
3197 if(!timeDomAllocList->choice.setup->list.array)
3199 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3203 for(idx = 0; idx < elementCnt; idx++)
3205 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3206 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3207 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3208 if(!timeDomAllocList->choice.setup->list.array[idx])
3210 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3216 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3218 timeDomAlloc->k0 = NULLP;
3219 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3220 timeDomAlloc->startSymbolAndLength = 53;
3225 /*******************************************************************
3227 * @brief Builds PDSCH PRB Bundling type
3231 * Function : BuildPdschPrbBundlingType
3233 * Functionality: Builds PDSCH PRB Bundling type
3236 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3238 * @return ROK - success
3241 * ****************************************************************/
3242 uint8_t BuildPdschPrbBundlingType
3244 struct PDSCH_Config__prb_BundlingType *prbBndlType
3247 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3249 prbBndlType->choice.staticBundling = NULLP;
3250 CU_ALLOC(prbBndlType->choice.staticBundling, \
3251 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3252 if(!prbBndlType->choice.staticBundling)
3254 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3257 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3262 /*******************************************************************
3264 * @brief Builds BWP DL dedicated PDSCH config
3268 * Function : BuildBWPDlDedPdschCfg
3270 * Functionality: Builds BWP DL dedicated PDSCH config
3272 * @params[in] struct PDSCH_Config *pdschCfg
3274 * @return ROK - success
3277 * ****************************************************************/
3278 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3280 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3282 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3283 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3284 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3285 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3287 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3291 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3296 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3297 pdschCfg->tci_StatesToAddModList = NULLP;
3298 pdschCfg->tci_StatesToReleaseList = NULLP;
3299 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3301 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3302 if(!pdschCfg->tci_StatesToAddModList)
3304 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3307 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3313 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3315 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3316 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3317 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3318 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3320 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3323 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3327 pdschCfg->pdsch_AggregationFactor = NULLP;
3328 pdschCfg->rateMatchPatternToAddModList = NULLP;
3329 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3330 pdschCfg->rateMatchPatternGroup1 = NULLP;
3331 pdschCfg->rateMatchPatternGroup2 = NULLP;
3332 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3333 pdschCfg->mcs_Table = NULLP;
3335 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3336 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3337 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3339 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3342 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3344 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3349 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3350 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3351 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3352 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3353 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3354 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3355 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3360 /*******************************************************************
3362 * @brief Builds intitial DL BWP
3365 * Function : BuildInitialDlBWP
3367 * Functionality: Builds intitial DL BWP in spCellCfgDed
3369 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3371 * @return ROK - success
3374 * ****************************************************************/
3375 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3377 dlBwp->pdcch_Config = NULLP;
3378 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3379 if(!dlBwp->pdcch_Config)
3381 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3384 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3386 dlBwp->pdcch_Config->choice.setup = NULLP;
3387 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3388 if(!dlBwp->pdcch_Config->choice.setup)
3390 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3393 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3398 dlBwp->pdsch_Config = NULLP;
3399 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3400 if(!dlBwp->pdsch_Config)
3402 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3405 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3407 dlBwp->pdsch_Config->choice.setup = NULLP;
3408 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3409 if(!dlBwp->pdsch_Config->choice.setup)
3411 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3415 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3420 dlBwp->sps_Config = NULLP;
3421 dlBwp->radioLinkMonitoringConfig = NULLP;
3425 /*******************************************************************
3427 * @brief Builds DMRS UL Pusch Mapping type A
3431 * Function : BuildDMRSULPuschMapTypeA
3433 * Functionality: Builds DMRS UL Pusch Mapping type A
3436 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3437 * @return ROK - success
3440 * ****************************************************************/
3441 uint8_t BuildDMRSULPuschMapTypeA
3443 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3446 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3447 dmrsUlCfg->choice.setup= NULLP;
3448 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3449 if(!dmrsUlCfg->choice.setup)
3451 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3455 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3456 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3457 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3458 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3460 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3463 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3465 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3466 dmrsUlCfg->choice.setup->maxLength = NULLP;
3467 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3468 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3469 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3470 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3472 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3476 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3477 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3479 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3481 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3484 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3486 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3487 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3491 /*******************************************************************
3493 * @brief Build PUSCH time domain allocation list
3497 * Function : BuildPuschTimeDomAllocList
3499 * Functionality: Build PUSCH time domain allocation list
3502 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3504 * @return ROK - success
3507 * ****************************************************************/
3508 uint8_t BuildPuschTimeDomAllocList
3510 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3515 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3517 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3518 timeDomAllocList->choice.setup = NULLP;
3519 CU_ALLOC(timeDomAllocList->choice.setup, \
3520 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3521 if(!timeDomAllocList->choice.setup)
3523 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3528 timeDomAllocList->choice.setup->list.count = elementCnt;
3529 timeDomAllocList->choice.setup->list.size = \
3530 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3531 timeDomAllocList->choice.setup->list.array = NULLP;
3532 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3533 timeDomAllocList->choice.setup->list.size);
3534 if(!timeDomAllocList->choice.setup->list.array)
3536 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3540 for(idx = 0; idx < elementCnt; idx++)
3542 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3543 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3544 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3545 if(!timeDomAllocList->choice.setup->list.array[idx])
3547 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3553 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3554 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3555 if(!timeDomAlloc->k2)
3557 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3560 *(timeDomAlloc->k2) = PUSCH_K2;
3561 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3562 timeDomAlloc->startSymbolAndLength = 27;
3566 /*******************************************************************
3568 * @brief Builds BWP UL dedicated PUSCH Config
3572 * Function : BuildBWPUlDedPuschCfg
3575 * Builds BWP UL dedicated PUSCH Config
3577 * @params[in] : PUSCH_Config_t *puschCfg
3579 * @return ROK - success
3582 * ****************************************************************/
3583 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3585 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3586 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3587 if(!puschCfg->dataScramblingIdentityPUSCH)
3589 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3592 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3594 puschCfg->txConfig = NULLP;
3595 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3596 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3597 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3598 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3600 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3604 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3609 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3610 puschCfg->pusch_PowerControl = NULLP;
3611 puschCfg->frequencyHopping = NULLP;
3612 puschCfg->frequencyHoppingOffsetLists = NULLP;
3613 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3615 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3616 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3617 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3618 if(!puschCfg->pusch_TimeDomainAllocationList)
3620 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3624 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3629 puschCfg->pusch_AggregationFactor = NULLP;
3630 puschCfg->mcs_Table = NULLP;
3631 puschCfg->mcs_TableTransformPrecoder = NULLP;
3632 puschCfg->transformPrecoder = NULLP;
3633 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3634 if(!puschCfg->transformPrecoder)
3636 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3639 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3641 puschCfg->codebookSubset = NULLP;
3642 puschCfg->maxRank = NULLP;
3643 puschCfg->rbg_Size = NULLP;
3644 puschCfg->uci_OnPUSCH = NULLP;
3645 puschCfg->tp_pi2BPSK = NULLP;
3650 /*******************************************************************
3652 * @brief Fills SRS resource to add/modify list
3656 * Function : BuildSrsRsrcAddModList
3658 * Functionality: Fills SRS resource to add/modify list
3661 * @return ROK - success
3664 * ****************************************************************/
3665 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3671 resourceList->list.count = elementCnt;
3672 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3673 resourceList->list.array = NULLP;
3674 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3675 if(!resourceList->list.array)
3677 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3681 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3683 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3684 if(!resourceList->list.array[rsrcIdx])
3686 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3692 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3693 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3694 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3696 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3697 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3698 sizeof(struct SRS_Resource__transmissionComb__n2));
3699 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3701 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3704 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3705 = SRS_COMB_OFFSET_N2;
3706 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3707 = SRS_CYCLIC_SHIFT_N2;
3709 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3711 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3712 SRS_Resource__resourceMapping__nrofSymbols_n1;
3713 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3714 SRS_Resource__resourceMapping__repetitionFactor_n1;
3716 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3717 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3718 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3719 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3720 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3721 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3722 SRS_Resource__groupOrSequenceHopping_neither;
3724 /* Setting resource type to aperiodic for intergration purposes */
3725 resourceList->list.array[rsrcIdx]->resourceType.present = \
3726 SRS_Resource__resourceType_PR_aperiodic;
3727 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3728 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3729 sizeof(struct SRS_Resource__resourceType__aperiodic));
3730 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3732 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3735 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3740 /*******************************************************************
3742 * @brief Build SRS resource set Add/mod list
3746 * Function : BuildSrsRsrcSetAddModList
3748 * Functionality: Build SRS resource set Add/mod list
3751 * @return ROK - success
3754 * ****************************************************************/
3755 uint8_t BuildSrsRsrcSetAddModList
3757 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3763 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3766 rsrcSetList->list.count = elementCnt;
3767 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3768 rsrcSetList->list.array = NULLP;
3769 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3770 if(!rsrcSetList->list.array)
3772 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3776 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3778 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3779 if(!rsrcSetList->list.array[rSetIdx])
3781 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3787 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3789 /* Fill Resource Id list in resource set */
3790 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3791 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3792 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3793 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3795 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3800 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3801 rsrcIdList->list.count = elementCnt;
3802 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3803 rsrcIdList->list.array = NULLP;
3804 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3805 if(!rsrcIdList->list.array)
3807 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3811 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3813 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3814 if(!rsrcIdList->list.array[rsrcIdx])
3816 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3822 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3824 /* Fill resource type */
3825 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3826 SRS_ResourceSet__resourceType_PR_aperiodic;
3828 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3829 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3830 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3831 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3833 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3836 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3837 = APERIODIC_SRS_RESRC_TRIGGER;
3839 /* TODO : Fill values for below IEs as expected by Viavi */
3840 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3841 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3844 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3845 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3846 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3847 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3848 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3853 /*******************************************************************
3855 * @brief Builds BWP UL dedicated SRS Config
3859 * Function : BuildBWPUlDedSrsCfg
3861 * Functionality: Builds BWP UL dedicated SRS Config
3863 * @params[in] SRS Config
3864 * @return ROK - success
3867 * ****************************************************************/
3868 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3870 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3871 srsCfg->srs_ResourceSetToAddModList = NULLP;
3872 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3873 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3874 if(!srsCfg->srs_ResourceSetToAddModList)
3876 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3879 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3884 srsCfg->srs_ResourceToReleaseList = NULLP;
3886 /* Resource to Add/Modify list */
3887 srsCfg->srs_ResourceToAddModList = NULLP;
3888 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3889 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3890 if(!srsCfg->srs_ResourceToAddModList)
3892 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3896 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3901 srsCfg->tpc_Accumulation = NULLP;
3906 /*******************************************************************
3908 * @brief Builds inital UL BWP
3912 * Function : BuildInitialUlBWP
3914 * Functionality: Builds initial UL BWP
3916 * @params[in] BWP_UplinkDedicated_t *ulBwp
3917 * @return ROK - success
3920 * ****************************************************************/
3921 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3923 ulBwp->pucch_Config = NULLP;
3925 /* Fill BWP UL dedicated PUSCH config */
3926 ulBwp->pusch_Config = NULLP;
3927 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3928 if(!ulBwp->pusch_Config)
3930 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3934 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3935 ulBwp->pusch_Config->choice.setup = NULLP;
3936 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3937 if(!ulBwp->pusch_Config->choice.setup)
3939 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3943 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3948 ulBwp->configuredGrantConfig = NULLP;
3950 /* Fill BPW UL dedicated SRS config */
3951 ulBwp->srs_Config = NULLP;
3952 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3953 if(!ulBwp->srs_Config)
3955 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3959 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3960 ulBwp->srs_Config->choice.setup = NULLP;
3961 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3962 if(!ulBwp->srs_Config->choice.setup)
3964 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3968 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3973 ulBwp->beamFailureRecoveryConfig = NULLP;
3978 /*******************************************************************
3980 * @brief Builds Pusch Serving cell Config
3984 * Function : BuildPuschSrvCellCfg
3986 * Functionality: Builds Pusch Serving cell Config
3988 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3990 * @return ROK - success
3993 * ****************************************************************/
3994 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3996 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3997 puschCfg->choice.setup = NULLP;
3998 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3999 if(!puschCfg->choice.setup)
4001 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4005 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4006 puschCfg->choice.setup->rateMatching = NULLP;
4007 puschCfg->choice.setup->xOverhead = NULLP;
4008 puschCfg->choice.setup->ext1 = NULLP;
4009 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4010 if(!puschCfg->choice.setup->ext1)
4012 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4016 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4017 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4018 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4020 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4023 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4025 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4026 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4027 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4029 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4032 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4036 /*******************************************************************
4038 * @brief Builds UL config
4041 * Function : BuildUlCfg
4043 * Functionality: Builds UL config in spCellCfgDed
4045 * @params[in] UplinkConfig_t *ulCfg
4047 * @return ROK - success
4050 * ****************************************************************/
4051 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4053 ulCfg->initialUplinkBWP = NULLP;
4054 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4055 if(!ulCfg->initialUplinkBWP)
4057 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4061 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4066 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4067 ulCfg->uplinkBWP_ToAddModList = NULLP;
4068 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4069 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4070 if(!ulCfg->firstActiveUplinkBWP_Id)
4072 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4075 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4077 ulCfg->pusch_ServingCellConfig = NULLP;
4078 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4079 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4080 if(!ulCfg->pusch_ServingCellConfig)
4082 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4086 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4091 ulCfg->carrierSwitching = NULLP;
4092 ulCfg->ext1 = NULLP;
4096 /*******************************************************************
4098 * @brief Builds PDSCH serving cell config
4101 * Function : BuildPdschSrvCellCfg
4103 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4105 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4107 * @return ROK - success
4110 * ****************************************************************/
4111 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4113 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4114 pdschCfg->choice.setup = NULLP;
4115 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4116 if(!pdschCfg->choice.setup)
4118 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4122 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4123 pdschCfg->choice.setup->xOverhead = NULLP;
4124 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4125 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4126 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4128 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4131 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4132 pdschCfg->choice.setup->pucch_Cell = NULLP;
4133 pdschCfg->choice.setup->ext1 = NULLP;
4138 /*******************************************************************
4140 * @brief Builds CSI Meas config
4143 * Function : BuildCsiMeasCfg
4145 * Functionality: Builds CSI Meas config in spCellCfgDed
4147 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4149 * @return ROK - success
4152 * ****************************************************************/
4153 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4159 /*******************************************************************
4161 * @brief Builds Spcell config dedicated
4164 * Function : BuildSpCellCfgDed
4166 * Functionality: Builds sp cell config dedicated in spCellCfg
4168 * @params[in] ServingCellConfig_t srvCellCfg
4170 * @return ROK - success
4173 * ****************************************************************/
4174 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4176 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4178 srvCellCfg->initialDownlinkBWP = NULLP;
4179 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4180 if(!srvCellCfg->initialDownlinkBWP)
4182 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4186 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4188 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4191 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4192 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4194 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4195 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4196 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4198 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4201 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4203 srvCellCfg->bwp_InactivityTimer = NULLP;
4205 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4206 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4207 if(!srvCellCfg->defaultDownlinkBWP_Id)
4209 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4212 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4214 srvCellCfg->uplinkConfig = NULLP;
4215 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4216 if(!srvCellCfg->uplinkConfig)
4218 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4222 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4224 DU_LOG("\nF1AP : BuildUlCfg failed");
4227 srvCellCfg->supplementaryUplink = NULLP;
4228 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4230 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4231 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4232 if(!srvCellCfg->pdsch_ServingCellConfig)
4234 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4238 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4240 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4244 srvCellCfg->csi_MeasConfig = NULLP;
4246 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4247 if(!srvCellCfg->csi_MeasConfig)
4249 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4253 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4255 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4259 srvCellCfg->sCellDeactivationTimer = NULLP;
4260 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4261 srvCellCfg->tag_Id = TAG_ID;
4262 srvCellCfg->dummy = NULLP;
4263 srvCellCfg->pathlossReferenceLinking = NULLP;
4264 srvCellCfg->servingCellMO = NULLP;
4265 srvCellCfg->ext1 = NULLP;
4269 /*******************************************************************
4271 * @brief Builds Spcell config
4275 * Function : BuildSpCellCfg
4277 * Functionality: Builds sp cell config in DuToCuRrcContainer
4279 * @params[in] SpCellConfig_t spCellCfg
4281 * @return ROK - success
4284 * ****************************************************************/
4285 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4288 spCellCfg->servCellIndex = NULLP;
4289 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4290 if(!spCellCfg->servCellIndex)
4292 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4295 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4297 spCellCfg->reconfigurationWithSync = NULLP;
4298 spCellCfg->rlf_TimersAndConstants = NULLP;
4299 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4300 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4301 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4303 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4306 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4308 spCellCfg->spCellConfigDedicated = NULLP;
4309 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4310 if(!spCellCfg->spCellConfigDedicated)
4312 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4315 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4317 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4322 /*******************************************************************
4324 * @brief Builds Phy cell group config
4328 * Function : BuildPhyCellGrpCfg
4330 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4332 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4334 * @return ROK - success
4337 * ****************************************************************/
4338 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4340 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4341 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4343 phyCellGrpCfg->p_NR_FR1 = NULLP;
4344 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4345 if(!phyCellGrpCfg->p_NR_FR1)
4347 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4350 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4351 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4352 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4353 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4354 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4355 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4356 phyCellGrpCfg->cs_RNTI = NULLP;
4357 phyCellGrpCfg->ext1 = NULLP;
4358 phyCellGrpCfg->ext2 = NULLP;
4363 /*******************************************************************
4365 * @brief Builds tag config
4369 * Function : BuildTagConfig
4371 * Functionality: Builds tag config in MacCellGroupConfig
4373 * @params[in] TAG_Config *tag_Config
4375 * @return ROK - success
4378 * ****************************************************************/
4379 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4381 struct TAG_Config__tag_ToAddModList *tagList;
4382 uint8_t idx, elementCnt;
4384 tagConfig->tag_ToReleaseList = NULLP;
4385 tagConfig->tag_ToAddModList = NULLP;
4386 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4387 if(!tagConfig->tag_ToAddModList)
4389 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4393 elementCnt = 1; //ODU_VALUE_ONE;
4394 tagList = tagConfig->tag_ToAddModList;
4395 tagList->list.count = elementCnt;
4396 tagList->list.size = elementCnt * sizeof(struct TAG *);
4398 tagList->list.array = NULLP;
4399 CU_ALLOC(tagList->list.array, tagList->list.size);
4400 if(!tagList->list.array)
4402 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4406 for(idx=0; idx<tagList->list.count; idx++)
4408 tagList->list.array[idx] = NULLP;
4409 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4410 if(!tagList->list.array[idx])
4412 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4418 tagList->list.array[idx]->tag_Id = TAG_ID;
4419 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4424 /*******************************************************************
4426 * @brief Builds PHR Config
4430 * Function : BuildPhrConfig
4432 * Functionality: Builds phrConfig in MacCellGroupConfig
4434 * @params[in] PHR Config *
4436 * @return ROK - success
4439 * ****************************************************************/
4440 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4443 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4444 phrConfig->choice.setup = NULLP;
4445 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4446 if(!phrConfig->choice.setup)
4448 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4452 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4453 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4454 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4455 phrConfig->choice.setup->multiplePHR = false;
4456 phrConfig->choice.setup->dummy = false;
4457 phrConfig->choice.setup->phr_Type2OtherCell = false;
4458 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4463 /*******************************************************************
4465 * @brief Builds BSR Config
4469 * Function : BuildBsrConfig
4471 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4473 * @params[in] BSR_Config *bsrConfig
4475 * @return ROK - success
4478 * ****************************************************************/
4479 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4481 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4482 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4483 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4488 /*******************************************************************
4490 * @brief Builds scheduling request config
4494 * Function : BuildSchedulingReqConfig
4496 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4498 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4500 * @return ROK - success
4503 * ****************************************************************/
4504 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4506 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4507 uint8_t idx, elementCnt;
4509 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4510 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4511 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4512 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4514 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4518 elementCnt = 1; //ODU_VALUE_ONE;
4519 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4520 schReqList->list.count = elementCnt;
4521 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4523 schReqList->list.array = NULLP;
4524 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4525 if(!schReqList->list.array)
4527 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4531 for(idx=0;idx<schReqList->list.count; idx++)
4533 schReqList->list.array[idx] = NULLP;
4534 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4535 if(!schReqList->list.array[idx])
4537 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4543 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4545 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4546 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4547 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4549 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4552 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4553 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4554 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4558 /*******************************************************************
4560 * @brief Builds Mac cell group config
4564 * Function : BuildMacCellGrpCfg
4566 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4568 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4570 * @return ROK - success
4573 * ****************************************************************/
4574 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4576 macCellGrpCfg->drx_Config = NULLP;
4577 macCellGrpCfg->schedulingRequestConfig = NULLP;
4578 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4579 if(!macCellGrpCfg->schedulingRequestConfig)
4581 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4585 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4587 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4591 macCellGrpCfg->bsr_Config = NULLP;
4592 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4593 if(!macCellGrpCfg->bsr_Config)
4595 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4599 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4601 DU_LOG("\nF1AP : BuildBsrConfig failed");
4605 macCellGrpCfg->tag_Config = NULLP;
4606 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4607 if(!macCellGrpCfg->tag_Config)
4609 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4613 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4615 DU_LOG("\nF1AP : BuildTagConfig failed");
4619 macCellGrpCfg->phr_Config = NULLP;
4620 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4621 if(!macCellGrpCfg->phr_Config)
4623 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4627 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4629 DU_LOG("\nF1AP : BuildPhrConfig failed");
4633 macCellGrpCfg->skipUplinkTxDynamic = false;
4634 macCellGrpCfg->ext1 = NULLP;
4638 /*******************************************************************
4640 * @brief Frees memeory allocated for SearchSpcToAddModList
4644 * Function : FreeSearchSpcToAddModList
4646 * Functionality: Deallocating memory of SearchSpcToAddModList
4648 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4652 4221 * ****************************************************************/
4653 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4657 struct SearchSpace *searchSpc=NULLP;
4659 if(searchSpcList->list.array)
4661 if(searchSpcList->list.array[idx2])
4663 searchSpc = searchSpcList->list.array[idx2];
4664 if(searchSpc->controlResourceSetId)
4666 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4668 if(searchSpc->monitoringSymbolsWithinSlot)
4670 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4672 if(searchSpc->nrofCandidates)
4674 if(searchSpc->searchSpaceType)
4676 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4677 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4678 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4679 SearchSpace__searchSpaceType));
4681 CU_FREE(searchSpc->nrofCandidates,
4682 sizeof(struct SearchSpace__nrofCandidates));
4684 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4685 searchSpc->monitoringSymbolsWithinSlot->size);
4687 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4688 sizeof(BIT_STRING_t));
4690 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4691 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4693 CU_FREE(searchSpc->controlResourceSetId,
4694 sizeof(ControlResourceSetId_t));
4697 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4699 CU_FREE(searchSpcList->list.array[idx1],
4700 sizeof(struct SearchSpace));
4702 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4705 /*******************************************************************
4707 * @brief Frees memory allocated for PdschTimeDomAllocList
4711 * Function : FreePdschTimeDomAllocList
4713 * Functionality: Deallocating memory of PdschTimeDomAllocList
4715 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4719 4221 * ****************************************************************/
4720 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4724 if(timeDomAllocList->choice.setup)
4726 if(timeDomAllocList->choice.setup->list.array)
4728 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4730 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4731 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4733 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4734 timeDomAllocList->choice.setup->list.size);
4736 CU_FREE(timeDomAllocList->choice.setup,\
4737 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4740 /*******************************************************************
4742 * @brief Frees memory allocated for PuschTimeDomAllocList
4746 * Function : FreePuschTimeDomAllocList
4748 * Functionality: Deallocating memory of PuschTimeDomAllocList
4750 * @params[in] PUSCH_Config_t *puschCfg
4754 ***********************************************************************/
4755 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4759 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4761 if(puschCfg->pusch_TimeDomainAllocationList)
4763 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4764 if(timeDomAllocList_t->choice.setup)
4766 if(timeDomAllocList_t->choice.setup->list.array)
4768 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4769 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4771 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4772 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4774 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4775 timeDomAllocList_t->choice.setup->list.size);
4777 CU_FREE(timeDomAllocList_t->choice.setup, \
4778 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4780 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4781 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4782 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4786 /*******************************************************************
4788 * @brief Frees memory allocated for InitialUlBWP
4792 * Function : FreeInitialUlBWP
4794 * Functionality: Deallocating memory of InitialUlBWP
4796 * @params[in] BWP_UplinkDedicated_t *ulBwp
4800 * ****************************************************************/
4801 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4803 uint8_t rSetIdx, rsrcIdx;
4804 SRS_Config_t *srsCfg = NULLP;
4805 PUSCH_Config_t *puschCfg = NULLP;
4806 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4807 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4808 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4809 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4811 if(ulBwp->pusch_Config)
4813 if(ulBwp->pusch_Config->choice.setup)
4815 puschCfg=ulBwp->pusch_Config->choice.setup;
4816 if(puschCfg->dataScramblingIdentityPUSCH)
4818 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4820 FreePuschTimeDomAllocList(puschCfg);
4821 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4822 if(dmrsUlCfg->choice.setup)
4824 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4826 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4828 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4830 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4831 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4833 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4836 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4838 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4839 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4841 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4843 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4845 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4847 /* Free SRS-Config */
4848 if(ulBwp->srs_Config)
4850 if(ulBwp->srs_Config->choice.setup)
4852 srsCfg = ulBwp->srs_Config->choice.setup;
4854 /* Free Resource Set to add/mod list */
4855 if(srsCfg->srs_ResourceSetToAddModList)
4857 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4858 if(rsrcSetList->list.array)
4862 /* Free SRS resource Id list in this SRS resource set */
4863 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4865 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4867 if(rsrcIdList->list.array)
4869 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4871 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4873 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4875 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4876 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4879 /* Free resource type info for this SRS resource set */
4880 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4881 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4883 /* Free memory for each resource set */
4884 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4886 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4888 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4890 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4891 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4894 /* Free resource to add/modd list */
4895 if(srsCfg->srs_ResourceToAddModList)
4897 resourceList = srsCfg->srs_ResourceToAddModList;
4898 if(resourceList->list.array)
4901 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4902 sizeof(struct SRS_Resource__transmissionComb__n2));
4903 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4904 sizeof(struct SRS_Resource__resourceType__aperiodic));
4906 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4908 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4910 CU_FREE(resourceList->list.array, resourceList->list.size);
4912 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4913 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4916 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4918 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4922 /*******************************************************************
4924 * @brief Frees memory allocated for initialUplinkBWP
4928 * Function : FreeinitialUplinkBWP
4930 * Functionality: Deallocating memory of initialUplinkBWP
4932 * @params[in] UplinkConfig_t *ulCfg
4937 * ****************************************************************/
4938 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4940 BWP_UplinkDedicated_t *ulBwp=NULLP;
4941 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4943 if(ulCfg->initialUplinkBWP)
4945 ulBwp=ulCfg->initialUplinkBWP;
4946 if(ulCfg->firstActiveUplinkBWP_Id)
4948 if(ulCfg->pusch_ServingCellConfig)
4950 puschCfg=ulCfg->pusch_ServingCellConfig;
4951 if(puschCfg->choice.setup)
4953 if(puschCfg->choice.setup->ext1)
4955 CU_FREE(puschCfg->choice.setup->ext1->\
4956 processingType2Enabled,sizeof(BOOLEAN_t));
4957 CU_FREE(puschCfg->choice.setup->ext1->\
4958 maxMIMO_Layers,sizeof(long));
4959 CU_FREE(puschCfg->choice.setup->ext1, \
4960 sizeof(struct PUSCH_ServingCellConfig__ext1));
4962 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4964 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4966 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4968 FreeInitialUlBWP(ulBwp);
4969 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4972 /*******************************************************************
4974 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4978 * Function : FreeBWPDlDedPdschCfg
4980 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4982 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4987 * ****************************************************************/
4988 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4990 struct PDSCH_Config *pdschCfg=NULLP;
4991 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4992 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4993 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4995 if(dlBwp->pdsch_Config->choice.setup)
4997 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4998 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5000 if(pdschCfg->pdsch_TimeDomainAllocationList)
5002 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5003 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5005 prbBndlType=&pdschCfg->prb_BundlingType;
5006 CU_FREE(prbBndlType->choice.staticBundling,\
5007 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5008 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5010 FreePdschTimeDomAllocList(timeDomAllocList);
5011 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5012 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5014 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5015 if(dmrsDlCfg->choice.setup)
5017 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5019 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5021 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5022 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5024 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5027 /*******************************************************************
5029 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5033 * Function : FreeBWPDlDedPdcchCfg
5035 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5037 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5042 * ****************************************************************/
5043 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5047 struct PDCCH_Config *pdcchCfg=NULLP;
5048 struct ControlResourceSet *controlRSet=NULLP;
5049 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5051 if(dlBwp->pdcch_Config->choice.setup)
5053 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5054 if(pdcchCfg->controlResourceSetToAddModList)
5056 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5057 if(controlRSetList->list.array)
5059 controlRSet = controlRSetList->list.array[idx2];
5062 if(controlRSet->frequencyDomainResources.buf)
5064 if(controlRSet->pdcch_DMRS_ScramblingID)
5066 if(pdcchCfg->searchSpacesToAddModList)
5068 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5069 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5070 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5072 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5074 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5075 controlRSet->frequencyDomainResources.size);
5078 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5080 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5082 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5084 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5085 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5087 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5090 /*******************************************************************
5092 * @brief Builds RLC Config
5096 * Function : BuildRlcConfig
5098 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5100 * @params[in] RLC_Config *rlcConfig
5102 * @return ROK - success
5105 * ****************************************************************/
5106 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5109 rlcConfig->present = RLC_Config_PR_am;
5111 rlcConfig->choice.am = NULLP;
5112 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5113 if(!rlcConfig->choice.am)
5115 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5120 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5121 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5122 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5124 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5127 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5128 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5129 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5130 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5131 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5134 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5135 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5136 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5138 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5141 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5142 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5143 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5148 /*******************************************************************
5150 * @brief Builds MAC LC Config
5154 * Function : BuildMacLCConfig
5156 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5158 * @params[in] struct LogicalChannelConfig macLcConfig
5160 * @return ROK - success
5163 * ****************************************************************/
5164 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5167 macLcConfig->ul_SpecificParameters = NULLP;
5168 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5169 if(!macLcConfig->ul_SpecificParameters)
5171 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5175 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5176 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5177 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5178 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5179 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5180 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5181 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5183 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5184 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5185 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5187 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5190 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5192 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5193 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5194 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5196 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5199 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5201 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5202 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5203 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5207 /*******************************************************************
5209 * @brief Builds RLC Bearer to Add/Mod list
5213 * Function :BuildRlcBearerToAddModList
5215 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5217 * @params[in] rlc_BearerToAddModList
5219 * @return ROK - success
5222 * ****************************************************************/
5223 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5225 uint8_t idx, elementCnt;
5228 rlcBearerList->list.count = elementCnt;
5229 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5231 rlcBearerList->list.array = NULLP;
5232 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5233 if(!rlcBearerList->list.array)
5235 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5239 for(idx=0; idx<rlcBearerList->list.count; idx++)
5241 rlcBearerList->list.array[idx] = NULLP;
5242 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5243 if(!rlcBearerList->list.array[idx])
5245 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5251 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5253 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5254 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5256 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5260 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5261 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5263 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5264 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5265 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5266 if(!rlcBearerList->list.array[idx]->rlc_Config)
5268 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5272 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5274 DU_LOG("\nF1AP : BuildRlcConfig failed");
5278 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5279 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5280 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5282 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5286 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5288 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5295 /*******************************************************************
5297 * @brief Free memory allocated for CellGroupConfig
5301 * Function : FreeMemCellGrpCfg
5303 * Functionality: Deallocating memory of CellGroupConfig
5305 * @params[in] pointer to CellGroupConfigRrc_t
5307 * @return ROK - success
5310 ******************************************************************/
5311 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5314 SpCellConfig_t *spCellCfg=NULLP;
5315 ServingCellConfig_t *srvCellCfg=NULLP;
5316 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5317 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5318 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5319 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5320 struct RLC_Config *rlcConfig=NULLP;
5321 struct LogicalChannelConfig *macLcConfig=NULLP;
5322 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5323 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5324 struct TAG_Config *tagConfig=NULLP;
5325 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5326 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5327 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5329 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5332 if(rlcBearerList->list.array)
5334 for(idx=0; idx<rlcBearerList->list.count; idx++)
5336 if(rlcBearerList->list.array[idx])
5338 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5339 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5342 if(rlcConfig->choice.am)
5344 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5345 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5346 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5348 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5350 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5353 if(macLcConfig->ul_SpecificParameters)
5355 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5356 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5357 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5359 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5361 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5364 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5366 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5369 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5372 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5373 if(schedulingRequestConfig)
5375 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5378 if(schReqList->list.array)
5380 for(idx=0;idx<schReqList->list.count; idx++)
5382 if(schReqList->list.array[idx])
5384 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5385 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5388 CU_FREE(schReqList->list.array, schReqList->list.size);
5390 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5391 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5392 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5394 if(macCellGrpCfg->bsr_Config)
5396 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5398 tagConfig = macCellGrpCfg->tag_Config;
5401 tagList = tagConfig->tag_ToAddModList;
5404 if(tagList->list.array)
5406 for(idx=0; idx<tagList->list.count; idx++)
5408 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5410 CU_FREE(tagList->list.array, tagList->list.size);
5412 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5414 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5417 phrConfig = macCellGrpCfg->phr_Config;
5420 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5421 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5424 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5427 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5430 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5431 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5434 spCellCfg = cellGrpCfg->spCellConfig;
5437 if(spCellCfg->servCellIndex)
5439 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5441 if(spCellCfg->spCellConfigDedicated)
5443 srvCellCfg = spCellCfg->spCellConfigDedicated;
5444 if(srvCellCfg->initialDownlinkBWP)
5446 dlBwp = srvCellCfg->initialDownlinkBWP;
5447 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5449 if(srvCellCfg->defaultDownlinkBWP_Id)
5451 if(srvCellCfg->uplinkConfig)
5453 if(srvCellCfg->pdsch_ServingCellConfig)
5455 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5456 if(pdschCfg->choice.setup)
5458 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5459 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5461 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5462 ServingCellConfig__pdsch_ServingCellConfig));
5464 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5465 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5467 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5469 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5471 if(dlBwp->pdcch_Config)
5473 if(dlBwp->pdsch_Config)
5475 FreeBWPDlDedPdschCfg(dlBwp);
5476 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5478 FreeBWPDlDedPdcchCfg(dlBwp);
5479 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5481 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5483 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5485 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5487 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5489 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5494 /*******************************************************************
5496 * @brief Fills CellGroupConfig
5500 * Function : fillCellGrpCfg
5502 * Functionality: Fills CellGroupConfig
5504 * @params[in] pointer to CellGroupConfigRrc_t
5506 * @return ROK - success
5509 ******************************************************************/
5511 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5513 uint8_t ret = RFAILED;
5514 CellGroupConfigRrc_t cellGrpCfg;
5515 asn_enc_rval_t encRetVal;
5519 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5521 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5522 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5523 if(!cellGrpCfg.rlc_BearerToAddModList)
5525 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5528 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5530 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5534 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5535 cellGrpCfg.mac_CellGroupConfig = NULLP;
5536 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5537 if(!cellGrpCfg.mac_CellGroupConfig)
5539 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5542 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5544 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5549 cellGrpCfg.physicalCellGroupConfig = NULLP;
5550 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5551 if(!cellGrpCfg.physicalCellGroupConfig)
5553 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5556 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5558 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5562 cellGrpCfg.spCellConfig = NULLP;
5563 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5564 if(!cellGrpCfg.spCellConfig)
5566 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5569 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5571 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5575 cellGrpCfg.sCellToAddModList = NULLP;
5576 cellGrpCfg.sCellToReleaseList = NULLP;
5577 cellGrpCfg.ext1 = NULLP;
5579 /* encode cellGrpCfg into duToCuRrcContainer */
5580 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5581 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5583 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5584 /* Encode results */
5585 if(encRetVal.encoded == ENCODE_FAIL)
5587 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5588 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5593 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5594 for(int i=0; i< encBufSize; i++)
5596 printf("%x",encBuf[i]);
5600 cellGrp->size = encBufSize;
5601 CU_ALLOC(cellGrp->buf, cellGrp->size);
5604 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5607 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5611 FreeMemCellGrpCfg(&cellGrpCfg);
5615 /*******************************************************************
5617 * @brief Free UE Capability RAT container
5621 * Function : freeUeCapRatCont
5624 * Free UE Capability RAT conatiner
5627 * @return ROK - success
5630 * ****************************************************************/
5631 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5634 FeatureSets_t *featureSets;
5636 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5638 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5640 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5641 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5643 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5646 if(ueNrCap->featureSets)
5648 featureSets = ueNrCap->featureSets;
5649 if(featureSets->featureSetsDownlinkPerCC)
5651 if(featureSets->featureSetsDownlinkPerCC->list.array)
5653 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5655 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5656 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5657 sizeof(ModulationOrder_t));
5658 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5660 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5662 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5665 if(featureSets->featureSetsUplinkPerCC)
5667 if(featureSets->featureSetsUplinkPerCC->list.array)
5669 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5671 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5673 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5674 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5675 sizeof(ModulationOrder_t));
5676 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5679 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5681 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5683 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5687 /*******************************************************************
5689 * @brief Free UE capability RAT container list
5693 * Function : freeUeCapRatContList
5695 * Functionality: Free UE capability RAT container list
5698 * @return ROK - success
5701 * ****************************************************************/
5702 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5705 if(ueCapablityList->list.array)
5707 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5709 if(ueCapablityList->list.array[idx])
5710 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5712 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5716 /*******************************************************************
5718 * @brief Fill feature sets
5722 * Function : fillFeatureSets
5724 * Functionality: Fill feature sets
5727 * @return ROK - success
5730 * ****************************************************************/
5731 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5733 uint8_t idx, elementCnt;
5735 featureSets->featureSetsDownlink = NULLP;
5736 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5737 if(!featureSets->featureSetsDownlinkPerCC)
5739 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5744 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5745 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5746 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5747 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5749 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5753 for(idx = 0; idx < elementCnt; idx++)
5755 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5756 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5758 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5764 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5765 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5766 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5767 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5768 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5770 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5771 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5773 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5776 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5778 featureSets->featureSetsUplink = NULLP;
5779 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5780 if(!featureSets->featureSetsUplinkPerCC)
5782 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5787 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5788 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5789 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5790 if(!featureSets->featureSetsUplinkPerCC->list.array)
5792 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5796 for(idx = 0; idx < elementCnt; idx++)
5798 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5799 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5801 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5807 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5808 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5809 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5810 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5811 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5812 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5814 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5815 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5817 DU_LOG("\nMemory allocation failed in fillFeatureSets");
5820 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5825 /*******************************************************************
5827 * @brief Fill UE capability RAT container
5831 * Function : fillUeCapRatCont
5833 * Functionality: Fill UE capability RAT container
5835 * @params[in] UE Capability RAT container buffer
5836 * @return ROK - success
5839 * ****************************************************************/
5840 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5843 uint8_t idx, elementCnt;
5844 asn_enc_rval_t encRetVal;
5845 UE_NR_Capability_t ueNrCap;
5849 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5851 /* Filling PDCP parameters */
5852 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5853 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5854 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5855 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5856 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5857 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5858 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5859 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5860 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5861 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5862 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5863 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5864 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5865 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5866 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5867 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5868 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5870 ueNrCap.rlc_Parameters = NULLP;
5871 ueNrCap.mac_Parameters = NULLP;
5873 /* Filling PHY parameters */
5874 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5875 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5876 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5877 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5878 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5880 /* Filling RF parameters */
5882 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5883 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5884 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5885 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5887 DU_LOG("\nMemory allocation failed in fillUeCapRatCont");
5892 for(idx = 0; idx < elementCnt; idx++)
5894 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5895 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
5905 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
5906 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
5907 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
5909 ueNrCap.measAndMobParameters = NULLP;
5910 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
5911 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
5912 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
5913 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
5914 ueNrCap.featureSets = NULLP;
5916 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
5917 if(!ueNrCap.featureSets)
5919 DU_LOG("\nMemory allocation failed in fillUeCapRatCont");
5924 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
5926 DU_LOG("\nfillDLFeatureSets() failed ");
5931 ueNrCap.featureSetCombinations = NULLP;
5932 ueNrCap.lateNonCriticalExtension = NULLP;
5933 ueNrCap.nonCriticalExtension = NULLP;
5935 /* encode UE Capability RAT Container List into duToCuRrcContainer */
5936 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
5937 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5939 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
5941 /* Encode results */
5942 if(encRetVal.encoded == ENCODE_FAIL)
5944 DU_LOG( "\n F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
5945 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5950 DU_LOG("\n F1AP : Created APER encoded buffer for UE Capability RAT Container\n");
5951 for(int i=0; i< encBufSize; i++)
5953 printf("%x",encBuf[i]);
5957 ueCapRatContBuf->size = encBufSize;
5958 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
5959 if(!ueCapRatContBuf->buf)
5961 DU_LOG("\nF1AP : Memory allocation failed in fillUeCapabilityContainer");
5964 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
5968 freeUeCapRatCont(&ueNrCap);
5972 /*******************************************************************
5974 * @brief Fill UE Capability RAT container list
5978 * Function : fillUeCapRatContList
5980 * Functionality: Fill UE Capability RAT container list
5983 * @params[in] UE capability RAT container list buffer
5984 * @return ROK - success
5987 * ****************************************************************/
5988 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
5990 uint8_t ret = RFAILED;
5991 uint8_t idx, elementCnt;
5992 asn_enc_rval_t encRetVal;
5993 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
5998 ueCapablityList.list.count = elementCnt;
5999 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6001 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6002 if(!ueCapablityList.list.array)
6004 DU_LOG("\nMemory allocation failed in fillUeCapRatContList");
6009 for(idx=0; idx<elementCnt; idx++)
6011 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6012 if(ueCapablityList.list.array[idx] == NULLP)
6014 DU_LOG("\nMemory allocation failed in fillUeCapRatContList");
6020 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6021 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6023 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6024 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6025 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6027 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6028 &ueCapablityList, PrepFinalEncBuf, encBuf);
6030 /* Encode results */
6031 if(encRetVal.encoded == ENCODE_FAIL)
6033 DU_LOG( "\n F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6034 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6039 DU_LOG("\n F1AP : Created APER encoded buffer for UE Capability RAT Container\n");
6040 for(int i=0; i< encBufSize; i++)
6042 printf("%x",encBuf[i]);
6046 ueCapablityListBuf->size = encBufSize;
6047 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6048 if(!ueCapablityListBuf->buf)
6050 DU_LOG("\nF1AP : Memory allocation failed in fillUeCapabilityContainer");
6053 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6057 freeUeCapRatContList(&ueCapablityList);
6061 /*******************************************************************
6063 * @brief Fills CuToDuContainer
6067 * Function : fillCuToDuContainer
6069 * Functionality: Fills CuToDuContainer
6071 * @params[in] pointer to CUtoDURRCInformation_t
6073 * @return ROK - success
6076 ******************************************************************/
6078 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6080 uint8_t elementCnt = 0;
6082 uint8_t idx, idx2, rrcBufLen;
6084 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6085 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6087 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6090 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6092 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6093 if(rrcMsg->iE_Extensions)
6096 rrcMsg->iE_Extensions->list.count = elementCnt;
6097 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6099 /* Initialize the CUtoDURRCInformation_ExtIEs */
6100 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6102 if(rrcMsg->iE_Extensions->list.array == NULLP)
6104 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6108 for(idx=0; idx<elementCnt; idx++)
6110 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6111 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6117 /* Filling CellGroupConfig_t IE */
6118 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6119 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6120 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6121 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6122 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6127 /*******************************************************************
6129 * @brief Free CuToDuContainer
6133 * Function : FreeCuToDuInfo
6135 * Functionality: Free CuToDuContainer
6137 * @params[in] pointer to CUtoDURRCInformation_t
6139 * @return ROK - success
6142 ******************************************************************/
6144 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6148 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6150 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6151 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6152 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6154 if(rrcMsg->iE_Extensions)
6156 if(rrcMsg->iE_Extensions->list.array)
6158 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6160 if(rrcMsg->iE_Extensions->list.array[idx])
6162 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6164 case ProtocolIE_ID_id_CellGroupConfig:
6165 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6167 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6168 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6173 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
6174 rrcMsg->iE_Extensions->list.array[idx]->id);
6180 for(idx2 = 0; idx2 < idx; idx2++)
6182 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6184 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6188 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6191 /*******************************************************************
6193 * @brief Builds and sends the UE Setup Request
6197 * Function : BuildAndSendUeContextSetupReq
6199 * Functionality: Constructs the UE Setup Request and sends
6200 * it to the CU through SCTP.
6204 * @return ROK - success
6207 * ****************************************************************/
6208 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6209 uint16_t rrcContLen, uint8_t *rrcContainer)
6212 uint8_t SplCellListret;
6213 uint8_t SrbSetupret;
6215 uint8_t idx, bufLen;
6217 F1AP_PDU_t *f1apMsg = NULLP;
6218 UEContextSetupRequest_t *ueSetReq = NULLP;
6219 asn_enc_rval_t encRetVal; /* Encoder return value */
6220 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6221 uint8_t ret= RFAILED;
6225 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
6227 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6228 if(f1apMsg == NULLP)
6230 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6234 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6235 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6236 if(f1apMsg->choice.initiatingMessage == NULLP)
6238 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6242 f1apMsg->choice.initiatingMessage->procedureCode = \
6243 ProcedureCode_id_UEContextSetup;
6244 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6245 f1apMsg->choice.initiatingMessage->value.present = \
6246 InitiatingMessage__value_PR_UEContextSetupRequest;
6248 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6251 ueSetReq->protocolIEs.list.count = elementCnt;
6252 ueSetReq->protocolIEs.list.size = \
6253 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6255 /* Initialize the UESetup members */
6256 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6258 if(ueSetReq->protocolIEs.list.array == NULLP)
6260 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
6264 for(idx1=0; idx1<elementCnt; idx1++)
6266 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6267 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6275 /*GNB CU UE F1AP ID*/
6276 ueSetReq->protocolIEs.list.array[idx]->id = \
6277 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6278 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6279 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6280 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6281 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6283 /*GNB DU UE F1AP ID*/
6285 ueSetReq->protocolIEs.list.array[idx]->id = \
6286 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6287 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6288 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6289 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6290 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6294 ueSetReq->protocolIEs.list.array[idx]->id = \
6295 ProtocolIE_ID_id_SpCell_ID;
6296 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6297 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6298 UEContextSetupRequestIEs__value_PR_NRCGI;
6299 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6305 /*Served Cell Index*/
6307 ueSetReq->protocolIEs.list.array[idx]->id = \
6308 ProtocolIE_ID_id_ServCellIndex;
6309 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6310 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6311 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6312 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6315 /*CellULConfigured*/
6317 ueSetReq->protocolIEs.list.array[idx]->id = \
6318 ProtocolIE_ID_id_SpCellULConfigured;
6319 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6320 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6321 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6322 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6323 CellULConfigured_none;
6325 /*CUtoDURRCContainer*/
6327 ueSetReq->protocolIEs.list.array[idx]->id = \
6328 ProtocolIE_ID_id_CUtoDURRCInformation;
6329 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6330 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6331 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6332 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6337 /*Special Cells to be SetupList*/
6339 ueSetReq->protocolIEs.list.array[idx]->id = \
6340 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6341 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6342 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6343 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6344 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6345 if(SplCellListret != ROK)
6349 /*SRBs To Be Setup List*/
6351 ueSetReq->protocolIEs.list.array[idx]->id = \
6352 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6353 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6354 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6355 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6356 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6357 if(SrbSetupret != ROK)
6361 /*DRBs to Be Setup List*/
6363 ueSetReq->protocolIEs.list.array[idx]->id = \
6364 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6365 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6366 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6367 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6368 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6373 /* RRC Container for security mode */
6375 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6376 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6377 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6378 UEContextSetupRequestIEs__value_PR_RRCContainer;
6379 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6381 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6382 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6383 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6384 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6386 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6389 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6390 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6392 /* RRC delivery status request */
6394 ueSetReq->protocolIEs.list.array[idx]->id = \
6395 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6396 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6397 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6398 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6399 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6400 RRCDeliveryStatusRequest_true;
6402 /* Bit Rate hardcoded as in reference logs */
6404 ueSetReq->protocolIEs.list.array[idx]->id = \
6405 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6406 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6407 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6408 UEContextSetupRequestIEs__value_PR_BitRate;
6409 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6411 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6412 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6413 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6414 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6416 DU_LOG(" F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6419 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6420 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6422 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6424 /* Encode the F1SetupRequest type as APER */
6425 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6427 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6429 /* Encode results */
6430 if(encRetVal.encoded == ENCODE_FAIL)
6432 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6433 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6438 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
6439 for(int i=0; i< encBufSize; i++)
6441 printf("%x",encBuf[i]);
6446 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6448 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
6454 FreeUeContextSetupReq(f1apMsg);
6457 }/* End of BuildAndSendUeContextSetupReq*/
6459 /****************************************************************
6460 * @brief Function to process Ul Rrc Msg received from DU
6464 * Function : procUlRrcMsg
6467 * - Function to process Ul Rrc Msg received from DU
6470 * @return ROK - success
6473 * ****************************************************************/
6475 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6477 uint8_t idx, ret, srbId, rrcMsgType;
6478 uint8_t cuUeF1apId, duUeF1apId;
6479 uint8_t *rrcContainer = NULLP;
6480 uint16_t rrcContLen;
6481 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6484 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6486 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6488 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6490 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6492 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6495 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6497 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6500 case ProtocolIE_ID_id_SRBID:
6501 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6503 case ProtocolIE_ID_id_RRCContainer:
6505 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6506 CU_ALLOC(rrcContainer, rrcContLen)
6509 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
6512 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6518 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6524 f1apMsgDb.dlRrcMsgCount++;
6525 rrcMsgType = setDlRRCMsgType();
6526 if(rrcMsgType == REGISTRATION_ACCEPT)
6528 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Registration Accept");
6529 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6531 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6533 DU_LOG("\nF1AP: Sending Ue Context Setup Req");
6534 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6535 rrcContLen, rrcContainer);
6537 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6539 /* To trigger the DL RRC Msg for RRC Reconfig */
6540 f1apMsgDb.dlRrcMsgCount++;
6541 rrcMsgType = setDlRRCMsgType();
6542 if(rrcMsgType == RRC_RECONFIG)
6544 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Reconfig");
6545 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6552 /****************************************************************
6553 * @brief Build And Send F1ResetAck
6557 * Function : FreeF1ResetAck
6560 * - Build And Send F1ResetRSP
6563 * @return ROK - success
6566 * ****************************************************************/
6567 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6570 ResetAcknowledge_t *f1ResetAck;
6574 if(f1apMsg->choice.successfulOutcome)
6576 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6578 if(f1ResetAck->protocolIEs.list.array)
6580 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6582 if(f1ResetAck->protocolIEs.list.array[idx])
6584 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6587 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6589 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6591 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6595 /****************************************************************
6596 * @brief Build And Send F1ResetAck
6600 * Function : BuildAndSendF1ResetAck
6603 * - Build And Send F1ResetRSP
6606 * @return ROK - success
6609 * ****************************************************************/
6611 uint8_t BuildAndSendF1ResetAck()
6614 uint8_t elementCnt = 0;
6615 uint8_t ret = RFAILED;
6616 F1AP_PDU_t *f1apMsg = NULL;
6617 ResetAcknowledge_t *f1ResetAck = NULLP;
6618 asn_enc_rval_t encRetVal;
6619 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6622 /* Allocate the memory for F1ResetRequest_t */
6623 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6624 if(f1apMsg == NULLP)
6626 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6630 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6632 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6633 if(f1apMsg->choice.successfulOutcome == NULLP)
6635 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6639 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6640 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6641 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6642 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6646 f1ResetAck->protocolIEs.list.count = elementCnt;
6647 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6649 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6650 if(f1ResetAck->protocolIEs.list.array == NULLP)
6652 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6656 for(idx=0; idx<elementCnt; idx++)
6658 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6659 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6666 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6667 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6668 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6669 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6671 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6673 /* Encode the F1SetupRequest type as UPER */
6674 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6676 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6678 /* Check encode results */
6679 if(encRetVal.encoded == ENCODE_FAIL)
6681 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6682 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6687 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6688 for(int i=0; i< encBufSize; i++)
6690 printf("%x",encBuf[i]);
6694 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6696 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6704 FreeF1ResetAck(f1apMsg);
6708 /*******************************************************************
6710 * @brief Handles received F1AP message and sends back response
6714 * Function : F1APMsgHdlr
6717 * - Decodes received F1AP control message
6718 * - Prepares response message, encodes and sends to SCTP
6721 * @return ROK - success
6724 * ****************************************************************/
6725 void F1APMsgHdlr(Buffer *mBuf)
6731 F1AP_PDU_t *f1apMsg = NULLP;
6732 asn_dec_rval_t rval; /* Decoder return value */
6733 F1AP_PDU_t f1apasnmsg ;
6735 DU_LOG("\nF1AP : Received F1AP message buffer");
6736 ODU_PRINT_MSG(mBuf, 0,0);
6738 /* Copy mBuf into char array to decode it */
6739 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6740 CU_ALLOC(recvBuf, (Size)recvBufLen);
6742 if(recvBuf == NULLP)
6744 DU_LOG("\nF1AP : Memory allocation failed");
6747 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6749 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6753 printf("\nF1AP : Received flat buffer to be decoded : ");
6754 for(i=0; i< recvBufLen; i++)
6756 printf("%x",recvBuf[i]);
6759 /* Decoding flat buffer into F1AP messsage */
6760 f1apMsg = &f1apasnmsg;
6761 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6763 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6764 CU_FREE(recvBuf, (Size)recvBufLen);
6766 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6768 DU_LOG("\nF1AP : ASN decode failed");
6772 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6774 switch(f1apMsg->present)
6776 case F1AP_PDU_PR_initiatingMessage:
6778 switch(f1apMsg->choice.initiatingMessage->value.present)
6780 case InitiatingMessage__value_PR_Reset:
6782 DU_LOG("\nF1AP : F1 reset request received ");
6783 BuildAndSendF1ResetAck();
6787 case InitiatingMessage__value_PR_F1SetupRequest:
6789 DU_LOG("\nF1AP : F1 setup request received");
6790 BuildAndSendF1SetupRsp();
6794 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
6796 DU_LOG("\nF1AP : GNB-DU config update received");
6797 BuildAndSendDUUpdateAck();
6798 DU_LOG("\nF1AP : Sending F1 reset request");
6799 BuildAndSendF1ResetReq();
6802 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
6804 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
6805 procInitULRRCMsg(f1apMsg);
6808 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
6810 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
6811 procUlRrcMsg(f1apMsg);
6815 case InitiatingMessage__value_PR_RRCDeliveryReport:
6817 DU_LOG("\nF1AP : Received RRC delivery report");
6822 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
6825 }/* End of switch(initiatingMessage) */
6829 case F1AP_PDU_PR_successfulOutcome:
6831 switch(f1apMsg->choice.successfulOutcome->value.present)
6833 case SuccessfulOutcome__value_PR_ResetAcknowledge:
6835 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
6838 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
6840 DU_LOG("\nF1AP : UE ContextSetupResponse received");
6841 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
6846 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
6847 f1apMsg->choice.successfulOutcome->value.present);
6850 }/* End of switch(successfulOutcome) */
6855 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6858 }/* End of switch(f1apMsg->present) */
6860 } /* End of F1APMsgHdlr */
6862 /**********************************************************************
6864 **********************************************************************/