1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
29 #include "ProtocolIE-SingleContainer.h"
31 #include "ModulationOrder.h"
33 #include "UE-CapabilityRAT-Container.h"
34 #include "UE-CapabilityRAT-ContainerList.h"
35 #include "UE-CapabilityRAT-ContainerListRRC.h"
36 #include "SupportedBandwidth.h"
37 #include "FeatureSetUplinkPerCC.h"
38 #include "FeatureSetDownlinkPerCC.h"
39 #include "FeatureSets.h"
40 #include "RF-Parameters.h"
41 #include "UE-NR-Capability.h"
42 #include "ProtocolExtensionContainer.h"
43 #include "CellGroupConfigRrc.h"
44 #include "MAC-CellGroupConfig.h"
45 #include "SchedulingRequestConfig.h"
46 #include "SchedulingRequestToAddMod.h"
47 #include "BSR-Config.h"
48 #include "TAG-Config.h"
50 #include "PHR-Config.h"
51 #include "RLC-Config.h"
52 #include "UL-AM-RLC.h"
53 #include "DL-AM-RLC.h"
54 #include "LogicalChannelConfig.h"
55 #include "RLC-BearerConfig.h"
56 #include "PhysicalCellGroupConfig.h"
57 #include "SpCellConfig.h"
58 #include "ServingCellConfig.h"
59 #include "ControlResourceSet.h"
60 #include "SearchSpace.h"
61 #include "PDCCH-Config.h"
62 #include "PDSCH-TimeDomainResourceAllocation.h"
63 #include "PDSCH-TimeDomainResourceAllocationList.h"
64 #include "DMRS-DownlinkConfig.h"
65 #include "PDSCH-Config.h"
66 #include "BWP-DownlinkDedicated.h"
67 #include "PUSCH-TimeDomainResourceAllocation.h"
68 #include "PUSCH-TimeDomainResourceAllocationList.h"
69 #include "DMRS-UplinkConfig.h"
70 #include "PUSCH-Config.h"
71 #include "SRS-ResourceId.h"
72 #include "SRS-Resource.h"
73 #include "SRS-ResourceSet.h"
74 #include "SRS-Config.h"
75 #include "BWP-UplinkDedicated.h"
76 #include "PUSCH-ServingCellConfig.h"
77 #include "UplinkConfig.h"
78 #include "PDSCH-ServingCellConfig.h"
79 #include "EUTRANQoS.h"
80 #include "GBR-QosInformation.h"
81 #include "DRBs-ToBeSetupMod-List.h"
82 #include "DRBs-ToBeSetupMod-Item.h"
84 /* MACRO for CUtoDURRCInformation */
86 #define FREQ_DOM_RSRC_SIZE 6
87 #define CORESET0_END_PRB 48
88 #define CORESET1_NUM_PRB 24
89 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
90 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
91 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
92 #define PDCCH_SRCH_SPC_TWO_ID 2
94 #define SCRAMBLING_ID NR_PCI
95 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
96 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
97 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
98 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
99 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
100 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
101 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
102 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
103 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
105 /* MACRO Ddefine for PDSCH Configuration */
107 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
108 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
109 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
110 #define PDSCH_NUM_HARQ_PROC 5
111 #define PDSCH_MAPPING_TYPE_A 0
112 #define PDSCH_MAPPING_TYPE_B 1
114 /* MACRO Define for PUSCH Configuration */
117 #define PUSCH_MSG3_DELTA_PREAMBLE 0
118 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
119 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
120 #define PUSCH_MAX_MIMO_LAYERS 1
121 #define PUSCH_PROCESS_TYPE2_ENABLED false
122 #define PUSCH_MAPPING_TYPE_A 0
123 #define PUSCH_MAPPING_TYPE_B 1
125 /* MACRO defines for SRC config */
126 #define SRS_RSRC_ID 1
127 #define SRS_RSET_ID 1
128 #define SRS_COMB_OFFSET_N2 0
129 #define SRS_CYCLIC_SHIFT_N2 0
130 #define SRS_FREQ_DOM_POS 0
131 #define SRS_FREQ_DOM_SHIFT 0
136 #define APERIODIC_SRS_RESRC_TRIGGER 1
138 /* Macro definitions for DUtoCuRrcContainer */
139 #define CELL_GRP_ID 1
141 #define SR_PROHIBIT_TMR 5
142 #define SR_TRANS_MAX 2
143 #define PERIODIC_BSR_TMR 2
144 #define RETX_BSR_TMR 5
145 #define SR_DELAY_TMR 6
147 #define TIME_ALIGNMENT_TMR 7
148 #define PHR_PERIODIC_TMR 7
149 #define PHR_PROHIBHIT_TMR 0
150 #define PHR_PWR_FACTOR_CHANGE 3
151 #define PHR_MODE_OTHER_CG 0
154 #define SN_FIELD_LEN 0
155 #define T_POLL_RETRANSMIT 8
158 #define MAX_RETX_THRESHOLD 5
159 #define T_REASSEMBLY 8
160 #define T_STATUS_PROHIBHIT 7
161 #define MAC_LC_PRIORITY 1
162 #define PRIORTISIED_BIT_RATE 15
163 #define BUCKET_SIZE_DURATION 5
166 #define PDSCH_HARQ_ACK_CODEBOOK 1
167 #define SERV_CELL_IDX 0
168 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
169 #define ACTIVE_DL_BWP_ID 0
170 #define ACTIVE_UL_BWP_ID 0
171 #define SCRAMBLING_ID NR_PCI
172 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
173 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
174 #define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/
176 /*******************************************************************
178 * @brief Sends F1 msg over SCTP
182 * Function : SendF1APMsg
184 * Functionality: Sends F1 msg over SCTP
186 * @params[in] Region region
188 * @return ROK - success
191 * ****************************************************************/
192 S16 SendF1APMsg(Region region, Pool pool)
194 Buffer *mBuf = NULLP;
196 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
198 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
200 ODU_PRINT_MSG(mBuf, 0,0);
202 if(sctpSend(mBuf) != ROK)
204 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
205 ODU_PUT_MSG_BUF(mBuf);
211 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
212 ODU_PUT_MSG_BUF(mBuf);
215 ODU_PUT_MSG_BUF(mBuf);
219 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
226 /*******************************************************************
228 * @brief Builds NRCell ID
232 * Function : BuildNrCellId
234 * Functionality: Building the NR Cell ID
236 * @params[in] BIT_STRING_t *nrcell
237 * @return ROK - success
240 * ****************************************************************/
242 S16 BuildNrCellId(BIT_STRING_t *nrcell)
244 memset(nrcell->buf, 0, nrcell->size);
246 nrcell->bits_unused = 4;
247 nrcell->size = 5 * sizeof(uint8_t);
251 /********************************************************************
253 * @brief Builds and sends the F1SetupResponse
257 * Function : BuildAndSendF1SetupRsp
259 * Functionality: Constructs the F1SetupResponse message and sends
260 * it back to the DU through SCTP.
262 * @params[in] void **buf,Buffer to which encoded pattern is written into
263 * @params[in] int *size,size of buffer
265 * @return ROK - success
268 * ****************************************************************/
269 S16 BuildAndSendF1SetupRsp()
272 uint8_t elementCnt,cellCnt;
273 F1AP_PDU_t *f1apMsg = NULL;
274 F1SetupResponse_t *f1SetupRsp;
275 GNB_CU_Name_t *cuName;
276 Cells_to_be_Activated_List_t *cellToActivate;
277 RRC_Version_t *rrcVer;
278 asn_enc_rval_t encRetVal;
279 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
281 /* Allocate the memory for F1SetupRequest_t */
282 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
285 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
288 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
290 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
291 if(f1apMsg->choice.successfulOutcome == NULLP)
293 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
294 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
298 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
299 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
300 f1apMsg->choice.successfulOutcome->value.present = \
301 SuccessfulOutcome__value_PR_F1SetupResponse;
302 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
305 f1SetupRsp->protocolIEs.list.count = elementCnt;
306 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
308 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
309 elementCnt * sizeof(F1SetupResponseIEs_t *));
310 if(f1SetupRsp->protocolIEs.list.array == NULLP)
312 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
313 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
314 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
318 for(idx=0; idx<elementCnt; idx++)
320 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
321 sizeof(F1SetupResponseIEs_t));
322 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
324 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
325 elementCnt * sizeof(F1SetupResponseIEs_t *));
326 CU_FREE(f1apMsg->choice.successfulOutcome, \
327 sizeof(SuccessfulOutcome_t));
328 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
335 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
336 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
337 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
338 F1SetupResponseIEs__value_PR_TransactionID;
339 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
344 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
345 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
346 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
347 F1SetupResponseIEs__value_PR_GNB_CU_Name;
348 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
349 cuName->size = sizeof(cuCfgParams.cuName);
351 CU_ALLOC(cuName->buf, sizeof(cuName->size));
352 if(cuName->buf == NULLP)
354 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
356 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
357 sizeof(F1SetupResponseIEs_t));
359 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
360 elementCnt * sizeof(F1SetupResponseIEs_t *));
361 CU_FREE(f1apMsg->choice.successfulOutcome,\
362 sizeof(SuccessfulOutcome_t));
363 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
366 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
368 /*Cells to be activated list*/
370 f1SetupRsp->protocolIEs.list.array[idx]->id = \
371 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
372 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
373 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
374 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
375 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
376 Cells_to_be_Activated_List;
378 cellToActivate->list.count = cellCnt;
379 cellToActivate->list.size = \
380 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
381 CU_ALLOC(cellToActivate->list.array,\
382 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
383 if(cellToActivate->list.array == NULLP)
385 CU_FREE(cuName->buf, sizeof(cuName->size));
386 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
388 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
389 sizeof(F1SetupResponseIEs_t));
391 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
392 elementCnt * sizeof(F1SetupResponseIEs_t *));
393 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
394 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
397 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
399 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
400 if(cellToActivate->list.array[ieIdx] == NULLP)
402 CU_FREE(cellToActivate->list.array,\
403 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
404 CU_FREE(cuName->buf, sizeof(cuName->size));
405 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
407 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
408 sizeof(F1SetupResponseIEs_t));
410 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
411 elementCnt * sizeof(F1SetupResponseIEs_t *));
412 CU_FREE(f1apMsg->choice.successfulOutcome, \
413 sizeof(SuccessfulOutcome_t));
414 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
418 cellToActivate->list.array[0]->id = \
419 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
420 cellToActivate->list.array[0]->criticality = Criticality_ignore;
421 cellToActivate->list.array[0]->value.present = \
422 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
423 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
424 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
425 CU_ALLOC(cellToActivate->list.array[0]->\
426 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
428 if(cellToActivate->list.array[0]->value.choice.\
429 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
432 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
434 CU_FREE(cellToActivate->list.array[ieIdx],\
435 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
438 CU_FREE(cellToActivate->list.array,\
439 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
440 CU_FREE(cuName->buf, sizeof(cuName->size));
441 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
443 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
444 sizeof(F1SetupResponseIEs_t));
446 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
447 elementCnt * sizeof(F1SetupResponseIEs_t *));
448 CU_FREE(f1apMsg->choice.successfulOutcome, \
449 sizeof(SuccessfulOutcome_t));
450 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
453 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
454 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
455 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
456 nRCGI.nRCellIdentity.size = 5;
457 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
458 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
460 if(cellToActivate->list.array[0]->value.choice.\
461 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
463 CU_FREE(cellToActivate->list.array[0]->\
464 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
466 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
468 CU_FREE(cellToActivate->list.array[ieIdx],\
469 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
472 CU_FREE(cellToActivate->list.array,\
473 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
474 CU_FREE(cuName->buf, sizeof(cuName->size));
475 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
477 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
478 sizeof(F1SetupResponseIEs_t));
480 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
481 elementCnt * sizeof(F1SetupResponseIEs_t *));
482 CU_FREE(f1apMsg->choice.successfulOutcome, \
483 sizeof(SuccessfulOutcome_t));
484 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
487 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
490 f1SetupRsp->protocolIEs.list.array[idx]->id = \
491 ProtocolIE_ID_id_GNB_CU_RRC_Version;
492 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
493 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
494 F1SetupResponseIEs__value_PR_RRC_Version;
495 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
496 rrcVer->latest_RRC_Version.size = RRC_SIZE;
498 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
499 if(rrcVer->latest_RRC_Version.buf == NULLP)
501 CU_FREE(cuName->buf, sizeof(cuName->size));
502 for(ieIdx=0; ieIdx<elementCnt; idx++)
504 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
505 sizeof(F1SetupResponseIEs_t));
507 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
508 elementCnt * sizeof(F1SetupResponseIEs_t *));
509 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
510 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
514 /* Need to check RRC Version */
515 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
516 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
517 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
518 if(rrcVer->iE_Extensions == NULLP)
520 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
521 CU_FREE(cuName->buf, sizeof(cuName->size));
522 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
524 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
525 sizeof(F1SetupResponseIEs_t));
527 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
528 elementCnt * sizeof(F1SetupResponseIEs_t *));
529 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
530 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
533 rrcVer->iE_Extensions->list.count = 1;
534 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
535 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
536 sizeof(struct RRC_Version_ExtIEs *));
537 if(rrcVer->iE_Extensions->list.array == NULLP)
539 CU_FREE(rrcVer->iE_Extensions,\
540 sizeof(ProtocolExtensionContainer_4624P81_t));
541 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
542 CU_FREE(cuName->buf, sizeof(cuName->size));
543 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
545 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
546 sizeof(F1SetupResponseIEs_t));
548 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
549 elementCnt * sizeof(F1SetupResponseIEs_t *));
550 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
551 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
554 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
555 sizeof(struct RRC_Version_ExtIEs));
556 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
558 CU_FREE(rrcVer->iE_Extensions->list.array,\
559 sizeof(struct RRC_Version_ExtIEs *));
560 CU_FREE(rrcVer->iE_Extensions,\
561 sizeof(ProtocolExtensionContainer_4624P81_t));
562 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
563 CU_FREE(cuName->buf, sizeof(cuName->size));
564 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
566 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
567 sizeof(F1SetupResponseIEs_t));
569 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
570 elementCnt * sizeof(F1SetupResponseIEs_t *));
571 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
572 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
575 rrcVer->iE_Extensions->list.array[0]->id = \
576 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
577 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
578 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
579 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
580 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
581 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
582 CU_ALLOC(rrcVer->iE_Extensions->list.\
583 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
585 if(rrcVer->iE_Extensions->list.\
586 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
588 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
589 sizeof(struct RRC_Version_ExtIEs));
590 CU_FREE(rrcVer->iE_Extensions->list.array,\
591 sizeof(struct RRC_Version_ExtIEs *));
592 CU_FREE(rrcVer->iE_Extensions,\
593 sizeof(ProtocolExtensionContainer_4624P81_t));
594 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
595 CU_FREE(cuName->buf, sizeof(cuName->size));
596 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
598 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
599 sizeof(F1SetupResponseIEs_t));
601 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
602 elementCnt * sizeof(F1SetupResponseIEs_t *));
603 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
604 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
607 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
608 Latest_RRC_Version_Enhanced.buf[0] = 0;
609 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
610 Latest_RRC_Version_Enhanced.buf[1] = 5;
611 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
612 Latest_RRC_Version_Enhanced.buf[2] = 15;
614 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
616 /* Encode the F1SetupRequest type as UPER */
617 memset(encBuf, 0, ENC_BUF_MAX_LEN);
619 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
622 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
623 CU_FREE(cuName->buf, sizeof(cuName->size));
624 for(idx=0; idx<elementCnt; idx++)
626 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
628 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
629 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
630 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
632 /* Check encode results */
633 if(encRetVal.encoded == ENCODE_FAIL)
635 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
636 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
641 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
642 for(int i=0; i< encBufSize; i++)
644 DU_LOG("%x",encBuf[i]);
649 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
651 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
656 }/* End of BuildAndSendF1SetupRsp */
658 /*******************************************************************
660 * @brief Builds and sends the DUUpdateAcknowledge
664 * Function : BuildAndSendDUUpdateAck
666 * Functionality: Constructs the DU Update Acknowledge message and sends
667 * it to the DU through SCTP.
669 * @params[in] void **buf,Buffer to which encoded pattern is written into
670 * @params[in] int *size,size of buffer
672 * @return ROK - success
675 * ****************************************************************/
677 S16 BuildAndSendDUUpdateAck()
681 F1AP_PDU_t *f1apMsg = NULL;
682 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
683 asn_enc_rval_t enRetVal; /* Encoder return value */
685 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
687 /* Allocate the memory for F1SetupRequest_t */
688 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
691 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
695 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
697 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
698 if(f1apMsg->choice.successfulOutcome == NULLP)
700 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
701 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
705 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
706 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
707 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
708 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
711 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
712 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
714 /* Initialize the F1Setup members */
715 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
716 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
718 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
719 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
720 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
724 for(idx=0; idx<elementCnt; idx++)
726 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
727 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
729 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
730 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
731 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
738 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
739 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
740 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
741 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
743 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
745 /* Encode the F1SetupRequest type as UPER */
746 memset(encBuf, 0, ENC_BUF_MAX_LEN);
748 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
751 for(idx=0; idx<elementCnt; idx++)
753 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
755 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
756 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
757 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
759 /* Checking encode results */
760 if(enRetVal.encoded == ENCODE_FAIL)
762 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
767 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
768 for(int i=0; i< encBufSize; i++)
770 DU_LOG("%x",encBuf[i]);
775 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
777 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
783 }/* End of BuildAndSendDUUpdateAck*/
784 /*******************************************************************
786 * @brief deallocating the memory of F1reset msg
790 * Function : FreeF1ResetReq
793 * - freeing memory of F1reset request msg
799 * ****************************************************************/
800 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
803 Reset_t *f1ResetMsg = NULLP;
807 if(f1apMsg->choice.initiatingMessage)
809 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
810 if(f1ResetMsg->protocolIEs.list.array)
812 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
814 if(f1ResetMsg->protocolIEs.list.array[idx])
816 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
819 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
821 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
823 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
826 /*******************************************************************
828 * @brief build ansld ans send f1reset msg
832 * Function : BuildAndSendF1ResetReq
834 * Functionality: build and send f1reset msg
836 * @return ROK - success
839 * ****************************************************************/
840 uint8_t BuildAndSendF1ResetReq()
842 uint8_t elementCnt=0;
844 uint8_t ret= RFAILED;
845 Reset_t *f1ResetMsg = NULLP;
846 F1AP_PDU_t *f1apMsg = NULLP;
847 asn_enc_rval_t encRetVal;
848 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
851 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
854 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
857 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
858 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
859 if(f1apMsg->choice.initiatingMessage == NULLP)
861 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
864 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
865 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
866 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
868 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
871 f1ResetMsg->protocolIEs.list.count = elementCnt;
872 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
874 /* Initialize the F1Reset members */
875 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
876 if(f1ResetMsg->protocolIEs.list.array == NULLP)
878 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
881 for(idx=0; idx<elementCnt; idx++)
883 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
884 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
886 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
893 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
894 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
895 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
896 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
900 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
901 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
902 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
903 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
904 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
908 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
909 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
910 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
911 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
912 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
914 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
916 /* Encode the F1SetupRequest type as APER */
917 memset(encBuf, 0, ENC_BUF_MAX_LEN);
919 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
923 if(encRetVal.encoded == ENCODE_FAIL)
925 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
926 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
931 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
932 for(idx=0; idx< encBufSize; idx++)
934 DU_LOG("%x",encBuf[idx]);
938 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
940 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
948 FreeF1ResetReq(f1apMsg);
952 /*******************************************************************
954 * @brief Fills Radio Bearer Config
958 * Function : fillSrbCfg
960 * Functionality: Fills Radio Bearer Config
962 * @params[in] SRB_ToAddModList *
964 * @return ROK - success
967 * ****************************************************************/
968 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
972 if(bearerCfg != NULLP)
975 bearerCfg->list.count = elementCnt;
976 bearerCfg->list.size =\
977 elementCnt * sizeof(SRB_ToAddMod_t *);
978 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
979 if(bearerCfg->list.array != NULLP)
981 for(idx = 0; idx < elementCnt; idx++)
983 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
984 if(bearerCfg->list.array[idx] == NULLP)
986 for(ieId = 0; ieId < idx; ieId++)
988 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
990 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1000 bearerCfg->list.array[idx]->srb_Identity = srbId;
1005 /*******************************************************************
1007 * @brief Fills Master CellGroup Info
1011 * Function : fillMasterCellGroup
1013 * Functionality: Fills Master Cell Group IE
1015 * @params[in] RRCSetup_IEs_t *
1017 * @return ROK - success
1020 * ****************************************************************/
1022 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1025 masterCellGroup->buf = NULLP;
1026 if(f1apMsgDb.duToCuContainer.buf)
1028 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1029 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1030 if(masterCellGroup->buf != NULLP)
1032 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1033 masterCellGroup->size);
1047 /*******************************************************************
1049 * @brief Fills RRC setup IE
1053 * Function : fillRRCSetupIE
1055 * Functionality: Fills RRC Setup IE
1057 * @params[in] RRCSetup_IEs_t *
1059 * @return ROK - success
1062 * ****************************************************************/
1064 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1069 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1070 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1072 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1076 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1080 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1086 /*******************************************************************
1088 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1092 * Function : fillDlCcchRrcMsg
1094 * Functionality: Fills DL DCCCH Message required for
1095 * DLRRCMessageTransfer
1097 * @params[in] RRCContainer_t *rrcContainer
1099 * @return ROK - success
1102 * ****************************************************************/
1104 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1108 DL_CCCH_Message_t dl_CCCH_Msg;
1109 asn_enc_rval_t encRetVal;
1111 if(rrcContainer != NULLP)
1113 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1115 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1116 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1118 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1119 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1120 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1122 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1123 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1124 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1125 /* Fill RRC Setup IE */
1126 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1127 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1128 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1129 criticalExtensions.choice.rrcSetup != NULLP)
1131 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1132 criticalExtensions.choice.rrcSetup);
1136 /* encode DL-CCCH message into RRC Container */
1137 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1138 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1140 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1141 /* Encode results */
1142 if(encRetVal.encoded == ENCODE_FAIL)
1144 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1145 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1150 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1151 for(int i = 0; i< encBufSize; i++)
1153 DU_LOG("%x",encBuf[i]);
1155 rrcContainer->size = encBufSize;
1156 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1157 if(rrcContainer->buf != NULLP)
1159 memset(rrcContainer->buf, 0, encBufSize);
1160 for(idx2 = 0; idx2 < encBufSize; idx2++)
1162 rrcContainer->buf[idx2] = encBuf[idx2];
1174 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1180 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1186 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1192 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1197 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1199 uint8_t idx, ied, elementCnt;
1202 qosFlow->list.count = elementCnt;
1203 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1204 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1205 if(qosFlow->list.array != NULLP)
1207 for(idx = 0; idx < elementCnt; idx++)
1209 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1210 if(qosFlow->list.array[idx] == NULLP)
1212 for(ied = 0; ied < idx; ied++)
1214 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1216 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1222 *qosFlow->list.array[idx] = 9;
1226 /*******************************************************************
1228 * @brief Fills CN Assoc for Drb to Add/Mod List
1232 * Function : fillCnAssoc
1234 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1236 * @params[in] struct DRB_ToAddMod__cnAssociation *
1238 * @return ROK - success
1241 * ****************************************************************/
1243 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1247 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1248 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1250 cnAssoc->choice.eps_BearerIdentity = 5;
1252 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1254 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1255 if(cnAssoc->choice.sdap_Config)
1257 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1258 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1259 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1260 cnAssoc->choice.sdap_Config->defaultDRB = true;
1261 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1262 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1263 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1264 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1265 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1267 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1271 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1272 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1278 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1285 /*******************************************************************
1287 * @brief Fills Radio Bearer Config for Drb
1291 * Function : fillDrbCfg
1293 * Functionality: Fills Radio Bearer Config for Drb
1295 * @params[in] drbId, DRB_ToAddModList *
1297 * @return ROK - success
1300 * ****************************************************************/
1301 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1303 uint8_t idx, ied, ret, elementCnt;
1309 drbCfg->list.count = elementCnt;
1310 drbCfg->list.size =\
1311 elementCnt * sizeof(DRB_ToAddMod_t *);
1312 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1313 if(drbCfg->list.array != NULLP)
1315 for(idx = 0; idx < elementCnt; idx++)
1317 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1318 if(drbCfg->list.array[idx] == NULLP)
1320 for(ied = 0; ied < idx; ied++)
1322 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1324 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1334 /* CN ASSOCIATION */
1335 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1336 if(drbCfg->list.array[idx]->cnAssociation)
1338 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1341 drbCfg->list.array[idx]->drb_Identity = drbId;
1346 /*******************************************************************
1348 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1352 * Function : fillRrcReconfigIE
1354 * Functionality: Fills RRC Reconfig Message required for
1355 * DLRRCMessageTransfer
1357 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1359 * @return ROK - success
1362 * ****************************************************************/
1364 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1367 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1368 if(rrcReconfigMsg->radioBearerConfig)
1370 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1371 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1373 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1378 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1379 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1381 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1384 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1385 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1386 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1392 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1393 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1399 /*******************************************************************
1401 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1405 * Function : fillDlDcchRrcMsg
1407 * Functionality: Fills DL DCCH Message required for
1408 * DLRRCMessageTransfer
1410 * @params[in] RRCContainer_t *rrcContainer
1412 * @return ROK - success
1415 * ****************************************************************/
1417 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1421 DL_DCCH_Message_t dl_DCCH_Msg;
1422 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1423 asn_enc_rval_t encRetVal;
1425 if(rrcContainer != NULLP)
1427 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1429 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1430 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1432 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1433 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1434 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1436 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1437 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1438 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1439 /* Fill RRC Reconfig IE */
1440 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1441 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1442 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1443 criticalExtensions.choice.rrcReconfiguration != NULLP)
1445 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1446 criticalExtensions.choice.rrcReconfiguration);
1450 /* encode DL-DCCH message into RRC Container */
1451 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1452 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1454 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1455 /* Encode results */
1456 if(encRetVal.encoded == ENCODE_FAIL)
1458 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1459 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1464 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1465 for(int i = 0; i< encBufSize; i++)
1467 DU_LOG("%x",encBuf[i]);
1469 rrcContainer->size = encBufSize;
1470 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1471 if(rrcContainer->buf != NULLP)
1473 memset(rrcContainer->buf, 0, encBufSize);
1474 for(idx2 = 0; idx2 < encBufSize; idx2++)
1476 rrcContainer->buf[idx2] = encBuf[idx2];
1483 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1488 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1494 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1500 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1506 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1512 /*******************************************************************
1514 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1518 * Function : BuildDLRRCContainer
1520 * Functionality: Builds RRC Container IE required for
1521 * DLRRCMessageTransfer
1525 * @return ROK - success
1528 * ****************************************************************/
1530 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1532 uint8_t ret, bufLen;
1535 if(rrcMsgType == RRC_SETUP)
1537 ret = fillDlCcchRrcMsg(rrcContainer);
1539 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1541 else if(rrcMsgType == REGISTRATION_ACCEPT)
1543 /*Hardcoded RRC Container from reference logs*/
1544 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1546 rrcContainer->size = bufLen;
1547 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1548 if(rrcContainer->buf != NULLP)
1550 memset(rrcContainer->buf, 0, bufLen);
1551 memcpy(rrcContainer->buf, buf, bufLen);
1554 else if(rrcMsgType == RRC_RECONFIG)
1556 /*Hardcoded RRC Container from reference logs*/
1558 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1559 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1560 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1561 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1562 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1563 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1564 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1565 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1566 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1567 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1568 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1569 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1570 0x00, 0x00, 0x00, 0x00};
1572 rrcContainer->size = bufLen;
1573 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1574 if(rrcContainer->buf != NULLP)
1576 memset(rrcContainer->buf, 0, bufLen);
1577 memcpy(rrcContainer->buf, buf, bufLen);
1584 /*******************************************************************
1586 * @brief Builds and sends the DLRRCMessageTransfer
1590 * Function : BuildAndSendDLRRCMessageTransfer
1592 * Functionality: Constructs the DL RRC Message Transfer and sends
1593 * it to the CU through SCTP.
1597 * @return ROK - success
1600 * ****************************************************************/
1601 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1603 uint8_t elementCnt = 0;
1606 F1AP_PDU_t *f1apMsg = NULLP;
1607 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1608 asn_enc_rval_t encRetVal; /* Encoder return value */
1610 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1612 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1613 if(f1apMsg == NULLP)
1615 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1619 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1620 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1621 sizeof(InitiatingMessage_t));
1622 if(f1apMsg->choice.initiatingMessage == NULLP)
1624 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1625 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1629 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1630 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1631 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1632 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1635 dlRRCMsg->protocolIEs.list.count = elementCnt;
1636 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1638 /* Initialize the F1Setup members */
1639 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1640 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1642 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1643 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1644 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1648 for(idx=0; idx<elementCnt; idx++)
1650 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1651 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1653 for(ieId=0; ieId<idx; ieId++)
1655 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1656 sizeof(DLRRCMessageTransferIEs_t));
1658 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1659 dlRRCMsg->protocolIEs.list.size);
1660 CU_FREE(f1apMsg->choice.initiatingMessage,\
1661 sizeof(InitiatingMessage_t));
1662 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1667 /* GNB CU UE F1AP ID */
1669 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1670 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1671 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1672 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1673 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1675 /* GNB DU UE F1AP ID */
1677 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1678 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1679 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1680 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1681 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1682 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1686 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1687 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1688 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1689 DLRRCMessageTransferIEs__value_PR_SRBID;
1690 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1694 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1695 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1696 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1697 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1698 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1700 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1702 /* Encode the F1SetupRequest type as APER */
1703 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1705 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1707 /* Encode results */
1708 if(encRetVal.encoded == ENCODE_FAIL)
1710 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1711 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1716 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1717 for(int i=0; i< encBufSize; i++)
1719 DU_LOG("%x",encBuf[i]);
1724 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1726 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1731 }/* End of BuildAndSendDLRRCMessageTransfer */
1733 /*******************************************************************
1735 * @brief Function to set the Dl RRC Msg Type
1739 * Function : setDlRRCMsgType
1741 * Functionality: Constructs the UE Setup Response and sends
1742 * it to the DU through SCTP.
1746 * @return ROK - success
1749 * ****************************************************************/
1751 uint8_t setDlRRCMsgType()
1753 uint8_t rrcMsgType = 0;
1754 switch(f1apMsgDb.dlRrcMsgCount)
1757 rrcMsgType = RRC_SETUP;
1759 case REGISTRATION_ACCEPT:
1760 rrcMsgType = REGISTRATION_ACCEPT;
1762 case UE_CONTEXT_SETUP_REQ:
1763 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1765 case SECURITY_MODE_COMPLETE:
1766 rrcMsgType = SECURITY_MODE_COMPLETE;
1769 rrcMsgType = RRC_RECONFIG;
1771 case UE_CONTEXT_MOD_REQ:
1772 rrcMsgType = UE_CONTEXT_MOD_REQ;
1780 /*******************************************************************
1782 * @brief Function to build Initial UL RRC Message
1786 * Function : procInitULRRCMsg
1788 * Functionality: Function to build Initial UL RRC Message
1792 * @return ROK - success
1795 * ****************************************************************/
1797 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1799 uint8_t idx, rrcMsgType;
1801 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1802 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1804 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1806 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1808 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1810 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1812 case ProtocolIE_ID_id_NRCGI:
1814 case ProtocolIE_ID_id_C_RNTI:
1816 case ProtocolIE_ID_id_RRCContainer:
1818 case ProtocolIE_ID_id_DUtoCURRCContainer:
1820 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1821 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1822 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1824 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1825 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1826 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1827 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1828 f1apMsgDb.duToCuContainer.size);
1829 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1831 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1832 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1833 .duToCuContainer.size);
1838 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1844 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1850 f1apMsgDb.dlRrcMsgCount++;
1851 rrcMsgType = setDlRRCMsgType();
1852 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1857 /*******************************************************************
1859 * @brief Builds Nrcgi
1863 * Function : BuildNrcgi
1865 * Functionality: Building the PLMN ID and NR Cell id
1867 * @params[in] NRCGI_t *nrcgi
1868 * @return ROK - success
1871 * ****************************************************************/
1872 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1875 uint8_t unused_bits = 4;
1876 uint8_t byteSize = 5;
1878 /* Allocate Buffer Memory */
1879 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1880 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1881 if(nrcgi->pLMN_Identity.buf == NULLP)
1885 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1891 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1892 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1893 if(nrcgi->nRCellIdentity.buf == NULLP)
1898 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1904 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1905 nrcgi->nRCellIdentity.buf[0] |= val;
1906 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1910 /*******************************************************************
1912 * @brief Builds Special cell list for UE Setup Request
1916 * Function : BuildSplCellList
1918 * Functionality: Constructs the Special Cell list for UESetReq
1920 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1922 * @return ROK - success
1925 * ****************************************************************/
1926 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1932 spCellLst->list.count = cellCnt;
1933 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1934 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1935 if(spCellLst->list.array == NULLP)
1939 for(idx=0; idx<cellCnt; idx++)
1941 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1942 if(spCellLst->list.array[idx] == NULLP)
1948 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1949 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1950 spCellLst->list.array[idx]->value.present =\
1951 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1952 /* Special Cell ID -NRCGI */
1953 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1958 /*Special Cell Index*/
1959 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1961 }/* End of BuildSplCellList*/
1963 /*******************************************************************
1965 * @brief Builds SRBS to be setup
1969 * Function : BuildSRBSetup
1971 * Functionality: Constructs the SRB's for UESetReq
1973 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1975 * @return ROK - success
1978 * ****************************************************************/
1979 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1984 srbSet->list.count = srbCnt;
1985 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1986 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1987 if(srbSet->list.array == NULLP)
1991 for(idx=0; idx<srbCnt; idx++)
1993 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1994 if(srbSet->list.array[idx] == NULLP)
2000 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2001 srbSet->list.array[idx]->criticality = Criticality_ignore;
2002 srbSet->list.array[idx]->value.present = \
2003 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2004 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2006 }/* End of BuildSRBSetup*/
2008 /*******************************************************************
2010 * @brief Builds QOS Info for DRB Setum Item
2014 * Function : BuildQOSInfo
2016 * Functionality: Constructs the QOS Info for DRB Setup Item
2018 * @params[in] QoSInformation_t *qosinfo
2020 * @return ROK - success
2023 * ****************************************************************/
2024 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2026 /* NonDynamic5QIDescriptor */
2027 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2028 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2029 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2034 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
2036 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2037 sizeof(AveragingWindow_t));
2038 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2043 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2044 /*MaxDataBurstVolume*/
2045 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2046 sizeof(MaxDataBurstVolume_t));
2047 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2052 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2054 /*nRGRAN Allocation Retention Priority*/
2055 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2056 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2057 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2060 }/*End of BuildQOSInfo*/
2062 /*******************************************************************
2064 * @brief Builds SNSSAI
2068 * Function : BuildSNSSAI
2070 * Functionality: Constructs the SNSSAI For DRB list
2072 * @params[in] SNSSAI_t *snssai
2074 * @return ROK - success
2077 * ****************************************************************/
2078 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2082 snssai->sST.size = sizeof(uint8_t);
2083 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2084 if(snssai->sST.buf == NULLP)
2088 snssai->sST.buf[0] = 3;
2090 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2091 if(snssai->sD == NULLP)
2095 snssai->sD->size = 3*sizeof(uint8_t);
2096 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2097 if(snssai->sD->buf == NULLP)
2101 snssai->sD->buf[0] = 3;
2102 snssai->sD->buf[1] = 6;
2103 snssai->sD->buf[2] = 9;
2105 }/*End of BuildSNSSAI*/
2107 /*******************************************************************
2109 * @brief Builds the flow map.
2113 * Function : BuildFlowsMap
2115 * Functionality: Constructs the flowmap For DRB list
2117 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2119 * @return ROK - success
2122 * ****************************************************************/
2123 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2129 flowMap->list.count = flowCnt;
2130 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2131 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2132 if(flowMap->list.array == NULLP)
2136 for(idx=0; idx<flowCnt; idx++)
2138 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2139 if(flowMap->list.array[idx] == NULLP)
2145 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2146 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2152 }/*End of BuildFlowsMap*/
2154 /*******************************************************************
2156 * @brief Builds the Uplink Tunnel Info
2160 * Function : BuildULTnlInfo
2162 * Functionality: Constructs the UL TnlInfo For DRB list
2164 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2166 * @return ROK - success
2169 * ****************************************************************/
2170 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2175 ulInfo->list.count = ulCnt;
2176 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2177 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2178 if(ulInfo->list.array == NULLP)
2182 for(idx=0; idx<ulCnt; idx++)
2184 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2185 if(ulInfo->list.array[idx] == NULLP)
2191 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2192 UPTransportLayerInformation_PR_gTPTunnel;
2194 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2195 sizeof(GTPTunnel_t));
2196 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2200 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2201 transportLayerAddress.size = 4*sizeof(uint8_t);
2202 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2203 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2204 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2205 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2206 transportLayerAddress.buf == NULLP)
2210 /* NOTE: Below IP address must be changed if running on different IP configuration */
2211 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2212 transportLayerAddress.buf[0] = 192;
2213 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2214 transportLayerAddress.buf[1] = 168;
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 transportLayerAddress.buf[2] = 130;
2217 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2218 transportLayerAddress.buf[3] = 82;
2219 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2220 transportLayerAddress.bits_unused = 0;
2222 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2223 = 4 * sizeof(uint8_t);
2224 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2225 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2226 gTPTunnel->gTP_TEID.size);
2227 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2232 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2233 gTP_TEID.buf[0] = 0;
2234 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2235 gTP_TEID.buf[1] = 0;
2236 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2237 gTP_TEID.buf[2] = 0;
2238 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2239 gTP_TEID.buf[3] = 1;
2242 }/*End of BuildULTnlInfo*/
2244 /*******************************************************************
2246 * @brief Builds DRBS to be setup
2250 * Function : BuildDRBSetup
2252 * Functionality: Constructs the DRB's for UESetReq
2254 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2256 * @return ROK - success
2259 * ****************************************************************/
2260 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2262 uint8_t BuildQOSInforet;
2263 uint8_t BuildSNSSAIret;
2264 uint8_t BuildFlowsMapret;
2265 uint8_t BuildULTnlInforet;
2268 DRBs_ToBeSetup_Item_t *drbSetItem;
2270 drbSet->list.count = drbCnt;
2271 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2272 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2273 if(drbSet->list.array == NULLP)
2277 for(idx=0; idx<drbCnt; idx++)
2279 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2280 if(drbSet->list.array[idx] == NULLP)
2286 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2287 drbSet->list.array[idx]->criticality = Criticality_ignore;
2288 drbSet->list.array[idx]->value.present = \
2289 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2290 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2292 drbSetItem->dRBID = 1;
2294 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2295 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2296 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2300 drbSetItem->qoSInformation.choice.choice_extension->id = \
2301 ProtocolIE_ID_id_DRB_Information;
2302 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2304 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2305 QoSInformation_ExtIEs__value_PR_DRB_Information;
2306 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2307 choice_extension->value.choice.DRB_Information.dRB_QoS);
2308 if(BuildQOSInforet != ROK)
2313 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2314 choice_extension->value.choice.DRB_Information.sNSSAI);
2315 if(BuildSNSSAIret != ROK)
2319 /*Flows mapped to DRB List*/
2320 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2321 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2322 if(BuildFlowsMapret != ROK)
2326 /*ULUPTNLInformation To Be Setup List*/
2327 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2328 if(BuildULTnlInforet != ROK)
2333 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2335 /*UL Configuration*/
2336 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2337 if(drbSetItem->uLConfiguration == NULLP)
2341 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2343 }/* End of BuildDRBSetup*/
2345 /*******************************************************************
2347 * @brief Deallocating memory of function BuildAndSendUESetReq
2351 * Function : FreeNrcgi
2353 * Functionality: Deallocating memory for function BuildNrcgi
2355 * @params[in] NRCGI_t *nrcgi
2359 *******************************************************************/
2360 void FreeNrcgi(NRCGI_t *nrcgi)
2362 if(nrcgi->pLMN_Identity.buf != NULLP)
2364 if(nrcgi->nRCellIdentity.buf != NULLP)
2366 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2368 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2371 /*******************************************************************
2373 * @brief Deallocating memory of function BuildAndSendUESetReq
2377 * Function : FreeSplCellList
2379 * Functionality: Deallocating memory for function BuildSplCellList
2381 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2386 * *****************************************************************/
2387 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2390 if(spCellLst->list.array != NULLP)
2392 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2394 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2396 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2398 if(spCellLst->list.array[cellidx]!=NULLP)
2400 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2403 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2406 /*******************************************************************
2408 * @brief Deallocating memory of function BuildAndSendUESetReq
2412 * Function : FreeSRBSetup
2414 * Functionality: Deallocating memory for function BuildSRBSetup
2416 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2421 * ******************************************************************/
2422 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2425 if(srbSet->list.array != NULLP)
2427 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2429 if(srbSet->list.array[srbidx]!=NULLP)
2431 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2434 CU_FREE(srbSet->list.array,srbSet->list.size);
2437 /*******************************************************************
2439 * @brief Deallocating memory of function BuildAndSendUESetReq
2443 * Function : FreeQOSInfo
2445 * Functionality: Deallocating memory for function BuildQOSInfo
2447 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2451 * ****************************************************************/
2452 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2454 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2456 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2458 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2460 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2461 sizeof(MaxDataBurstVolume_t));
2463 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2464 sizeof(AveragingWindow_t));
2466 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2467 sizeof(NonDynamic5QIDescriptor_t));
2470 /*******************************************************************
2472 * @brief Deallocating memory of function BuildAndSendUESetReq
2476 * Function : FreeULTnlInfo
2478 * Functionality: Deallocating memory for function BuildULTnlInfo
2480 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2485 * ****************************************************************/
2486 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2489 if(ulInfo->list.array != NULLP)
2491 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2493 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2495 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2497 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2498 transportLayerAddress.buf != NULLP)
2500 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2503 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2504 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2505 gTPTunnel->gTP_TEID.size);
2507 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2508 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2509 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2511 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2512 sizeof(GTPTunnel_t));
2515 if(ulInfo->list.array[ulidx]!=NULLP)
2517 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2520 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2523 /*******************************************************************
2525 * @brief Deallocating memory for BuildAndSendUESetReq
2529 * Function : FreeDRBSetup
2531 * Functionality: Deallocating memory for BuildDRBSetup
2533 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2537 * ****************************************************************/
2538 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2540 DRBs_ToBeSetup_Item_t *drbSetItem;
2543 if(drbSet->list.array == NULLP)
2545 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2547 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2549 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2550 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2552 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2553 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2555 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2556 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2558 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2559 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2561 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2563 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2565 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2567 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2568 flows_Mapped_To_DRB_List.list.array != NULLP)
2570 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2571 flows_Mapped_To_DRB_List.list.count; flowidx++)
2573 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2574 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2576 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2577 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2578 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2580 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2581 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2582 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2584 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2585 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2586 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2588 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2589 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_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->maxDataBurstVolume,\
2594 sizeof(MaxDataBurstVolume_t));
2596 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2597 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2598 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2600 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2601 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2602 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2605 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2606 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2608 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2609 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2612 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2613 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2614 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2616 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2617 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2619 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2620 sizeof(OCTET_STRING_t));
2622 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2623 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2625 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2626 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2628 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2629 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2631 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2632 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2634 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2637 if(drbSet->list.array[drbidx]!=NULLP)
2639 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2642 CU_FREE(drbSet->list.array,drbSet->list.size);
2647 /*******************************************************************
2649 * @brief Free the UE Setup Request
2653 * Function : FreeUeContextSetupReq
2655 * Functionality: Deallocate the memory of BuildUESetReq
2657 * @params[in] F1AP_PDU_t *f1apMsg
2662 * ****************************************************************/
2663 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2666 UEContextSetupRequest_t *ueSetReq = NULLP;
2668 if(f1apMsg != NULLP)
2670 if(f1apMsg->choice.initiatingMessage != NULLP)
2672 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2673 if(ueSetReq->protocolIEs.list.array != NULLP)
2675 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2677 if(ueSetReq->protocolIEs.list.array[idx])
2679 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2681 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2683 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2685 case ProtocolIE_ID_id_SpCell_ID:
2686 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2688 case ProtocolIE_ID_id_ServCellIndex:
2690 case ProtocolIE_ID_id_SpCellULConfigured:
2692 case ProtocolIE_ID_id_CUtoDURRCInformation:
2693 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2695 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2696 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2698 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2699 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2701 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2702 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2704 case ProtocolIE_ID_id_RRCContainer:
2705 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2707 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2708 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2712 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2717 for(ieId=0; ieId<idx; ieId++)
2719 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2721 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2724 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2726 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2728 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2732 /**Filling cell group info **/
2733 /*******************************************************************
2735 * @brief Build Control resource set to add/modify list
2739 * Function : BuildControlRSetToAddModList
2741 * Functionality: Build Control resource set to add/modify list
2744 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2746 * @return ROK - success
2749 * ****************************************************************/
2750 uint8_t BuildControlRSetToAddModList
2752 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2757 uint8_t numBytes, bitsUnused;
2758 struct ControlResourceSet *controlRSet;
2759 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2760 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2763 controlRSetList->list.count = elementCnt;
2764 controlRSetList->list.size = \
2765 elementCnt * sizeof(struct ControlResourceSet *);
2767 controlRSetList->list.array = NULLP;
2768 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2769 if(!controlRSetList->list.array)
2771 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2775 for(idx = 0; idx < elementCnt; idx++)
2777 controlRSetList->list.array[idx] = NULLP;
2778 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2779 if(!controlRSetList->list.array[idx])
2781 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2787 controlRSet = controlRSetList->list.array[idx];
2788 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2790 /* Values harcoded according to our design:
2793 * Bit string stored ff0000000000
2797 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2798 controlRSet->frequencyDomainResources.buf = NULLP;
2799 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2800 controlRSet->frequencyDomainResources.size);
2801 if(!controlRSet->frequencyDomainResources.buf)
2803 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2807 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2808 coreset0EndPrb = CORESET0_END_PRB;
2809 coreset1StartPrb = coreset0EndPrb + 6;
2810 coreset1NumPrb = CORESET1_NUM_PRB;
2811 /* calculate the PRBs */
2812 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2813 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2814 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2816 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2817 controlRSet->cce_REG_MappingType.present = \
2818 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2820 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2821 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2822 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2823 controlRSet->tci_PresentInDCI = NULLP;
2825 uint8_t tciStateIdx;
2827 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2828 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2829 if(!controlRset->tci_StatesPDCCH_ToAddList)
2831 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2836 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2837 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2838 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2839 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2840 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2842 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2846 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2848 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2849 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2851 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2858 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2860 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2861 if(!controlRset->tci_PresentInDCI)
2863 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2867 *(controlRset->tci_PresentInDCI);
2870 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2871 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2872 if(!controlRSet->pdcch_DMRS_ScramblingID)
2874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2877 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2880 } /* End BuildControlRSetToAddModList */
2882 /*******************************************************************
2884 * @brief Build search space to add/modify list
2888 * Function : BuildSearchSpcToAddModList
2890 * Functionality: Build search space to add/modify list
2893 * @return ROK - success
2896 * ****************************************************************/
2897 uint8_t BuildSearchSpcToAddModList
2899 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2907 struct SearchSpace *searchSpc;
2910 searchSpcList->list.count = elementCnt;
2911 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2913 searchSpcList->list.array = NULLP;
2914 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2915 if(!searchSpcList->list.array)
2917 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2921 for(idx = 0; idx < elementCnt; idx++)
2923 searchSpcList->list.array[idx] = NULLP;
2924 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2925 if(!searchSpcList->list.array[idx])
2927 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2933 searchSpc = searchSpcList->list.array[idx];
2935 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2937 searchSpc->controlResourceSetId = NULLP;
2938 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2939 if(!searchSpc->controlResourceSetId)
2941 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2944 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2946 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2947 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2948 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2949 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2951 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2954 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2955 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2957 searchSpc->duration = NULLP;
2958 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2959 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2960 if(!searchSpc->monitoringSymbolsWithinSlot)
2962 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2966 /* Values taken from reference logs :
2969 * Bit string stores 8000
2974 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2975 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2976 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2977 searchSpc->monitoringSymbolsWithinSlot->size);
2978 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2980 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2985 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2986 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2987 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2988 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2990 searchSpc->nrofCandidates = NULLP;
2991 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2992 if(!searchSpc->nrofCandidates)
2994 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2998 searchSpc->nrofCandidates->aggregationLevel1 = \
2999 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3000 searchSpc->nrofCandidates->aggregationLevel2 = \
3001 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3002 searchSpc->nrofCandidates->aggregationLevel4 = \
3003 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3004 searchSpc->nrofCandidates->aggregationLevel8 = \
3005 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3006 searchSpc->nrofCandidates->aggregationLevel16 = \
3007 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3009 searchSpc->searchSpaceType = NULLP;
3010 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3011 if(!searchSpc->searchSpaceType)
3013 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3017 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3019 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3020 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3021 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3022 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3024 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3027 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3028 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3031 }/* End BuildSearchSpcToAddModList */
3033 /*******************************************************************
3035 * @brief Builds BWP DL dedicated PDCCH config
3039 * Function : BuildBWPDlDedPdcchCfg
3041 * Functionality: Builds BWP DL dedicated PDCCH config
3043 * @params[in] struct PDCCH_Config *pdcchCfg
3045 * @return ROK - success
3048 * ****************************************************************/
3049 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3051 pdcchCfg->controlResourceSetToAddModList = NULLP;
3052 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3053 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3054 if(!pdcchCfg->controlResourceSetToAddModList)
3056 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3060 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3065 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3067 pdcchCfg->searchSpacesToAddModList = NULLP;
3068 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3069 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3070 if(!pdcchCfg->searchSpacesToAddModList)
3072 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3076 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3081 pdcchCfg->searchSpacesToReleaseList = NULLP;
3082 pdcchCfg->downlinkPreemption = NULLP;
3083 pdcchCfg->tpc_PUSCH = NULLP;
3084 pdcchCfg->tpc_PUCCH = NULLP;
3085 pdcchCfg->tpc_SRS = NULLP;
3090 /*******************************************************************
3092 * @brief Builds DMRS DL PDSCH Mapping type A
3096 * Function : BuildDMRSDLPdschMapTypeA
3098 * Functionality: Builds DMRS DL PDSCH Mapping type A
3101 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3102 * @return ROK - success
3105 * ****************************************************************/
3106 uint8_t BuildDMRSDLPdschMapTypeA
3108 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3111 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3112 dmrsDlCfg->choice.setup = NULLP;
3113 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3114 if(!dmrsDlCfg->choice.setup)
3116 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3120 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3121 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3122 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3123 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3125 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3128 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3130 dmrsDlCfg->choice.setup->maxLength = NULLP;
3131 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3132 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3133 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3138 /*******************************************************************
3140 * @brief Builds TCI states to add/modify list
3144 * Function : BuildTCIStatesToAddModList
3146 * Functionality:Builds TCI states to add/modify list
3149 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3151 * @return ROK - success
3154 * ****************************************************************/
3155 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3160 /*******************************************************************
3162 * @brief Builds PDSCH time domain allocation list
3166 * Function : BuildPdschTimeDomAllocList
3168 * Functionality: Builds PDSCH time domain allocation list
3171 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3173 * @return ROK - success
3176 * ****************************************************************/
3177 uint8_t BuildPdschTimeDomAllocList
3179 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3184 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3186 timeDomAllocList->present = \
3187 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3189 timeDomAllocList->choice.setup = NULLP;
3190 CU_ALLOC(timeDomAllocList->choice.setup, \
3191 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3192 if(!timeDomAllocList->choice.setup)
3194 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3199 timeDomAllocList->choice.setup->list.count = elementCnt;
3200 timeDomAllocList->choice.setup->list.size = \
3201 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3203 timeDomAllocList->choice.setup->list.array = NULLP;
3204 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3205 timeDomAllocList->choice.setup->list.size);
3206 if(!timeDomAllocList->choice.setup->list.array)
3208 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3212 for(idx = 0; idx < elementCnt; idx++)
3214 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3215 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3216 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3217 if(!timeDomAllocList->choice.setup->list.array[idx])
3219 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3225 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3227 timeDomAlloc->k0 = NULLP;
3228 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3229 timeDomAlloc->startSymbolAndLength = 53;
3234 /*******************************************************************
3236 * @brief Builds PDSCH PRB Bundling type
3240 * Function : BuildPdschPrbBundlingType
3242 * Functionality: Builds PDSCH PRB Bundling type
3245 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3247 * @return ROK - success
3250 * ****************************************************************/
3251 uint8_t BuildPdschPrbBundlingType
3253 struct PDSCH_Config__prb_BundlingType *prbBndlType
3256 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3258 prbBndlType->choice.staticBundling = NULLP;
3259 CU_ALLOC(prbBndlType->choice.staticBundling, \
3260 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3261 if(!prbBndlType->choice.staticBundling)
3263 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3266 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3271 /*******************************************************************
3273 * @brief Builds BWP DL dedicated PDSCH config
3277 * Function : BuildBWPDlDedPdschCfg
3279 * Functionality: Builds BWP DL dedicated PDSCH config
3281 * @params[in] struct PDSCH_Config *pdschCfg
3283 * @return ROK - success
3286 * ****************************************************************/
3287 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3289 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3291 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3292 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3293 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3294 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3296 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3300 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3305 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3306 pdschCfg->tci_StatesToAddModList = NULLP;
3307 pdschCfg->tci_StatesToReleaseList = NULLP;
3308 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3310 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3311 if(!pdschCfg->tci_StatesToAddModList)
3313 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3316 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3322 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3324 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3325 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3326 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3327 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3329 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3332 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3336 pdschCfg->pdsch_AggregationFactor = NULLP;
3337 pdschCfg->rateMatchPatternToAddModList = NULLP;
3338 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3339 pdschCfg->rateMatchPatternGroup1 = NULLP;
3340 pdschCfg->rateMatchPatternGroup2 = NULLP;
3341 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3342 pdschCfg->mcs_Table = NULLP;
3344 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3345 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3346 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3348 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3351 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3353 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3358 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3359 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3360 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3361 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3362 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3363 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3364 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3369 /*******************************************************************
3371 * @brief Builds intitial DL BWP
3374 * Function : BuildInitialDlBWP
3376 * Functionality: Builds intitial DL BWP in spCellCfgDed
3378 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3380 * @return ROK - success
3383 * ****************************************************************/
3384 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3386 dlBwp->pdcch_Config = NULLP;
3387 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3388 if(!dlBwp->pdcch_Config)
3390 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3393 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3395 dlBwp->pdcch_Config->choice.setup = NULLP;
3396 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3397 if(!dlBwp->pdcch_Config->choice.setup)
3399 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3402 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3407 dlBwp->pdsch_Config = NULLP;
3408 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3409 if(!dlBwp->pdsch_Config)
3411 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3414 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3416 dlBwp->pdsch_Config->choice.setup = NULLP;
3417 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3418 if(!dlBwp->pdsch_Config->choice.setup)
3420 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3424 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3429 dlBwp->sps_Config = NULLP;
3430 dlBwp->radioLinkMonitoringConfig = NULLP;
3434 /*******************************************************************
3436 * @brief Builds DMRS UL Pusch Mapping type A
3440 * Function : BuildDMRSULPuschMapTypeA
3442 * Functionality: Builds DMRS UL Pusch Mapping type A
3445 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3446 * @return ROK - success
3449 * ****************************************************************/
3450 uint8_t BuildDMRSULPuschMapTypeA
3452 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3455 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3456 dmrsUlCfg->choice.setup= NULLP;
3457 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3458 if(!dmrsUlCfg->choice.setup)
3460 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3464 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3465 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3466 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3467 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3469 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3472 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3474 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3475 dmrsUlCfg->choice.setup->maxLength = NULLP;
3476 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3477 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3478 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3479 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3481 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3485 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3486 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3488 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3490 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3493 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3495 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3496 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3500 /*******************************************************************
3502 * @brief Build PUSCH time domain allocation list
3506 * Function : BuildPuschTimeDomAllocList
3508 * Functionality: Build PUSCH time domain allocation list
3511 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3513 * @return ROK - success
3516 * ****************************************************************/
3517 uint8_t BuildPuschTimeDomAllocList
3519 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3524 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3526 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3527 timeDomAllocList->choice.setup = NULLP;
3528 CU_ALLOC(timeDomAllocList->choice.setup, \
3529 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3530 if(!timeDomAllocList->choice.setup)
3532 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3537 timeDomAllocList->choice.setup->list.count = elementCnt;
3538 timeDomAllocList->choice.setup->list.size = \
3539 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3540 timeDomAllocList->choice.setup->list.array = NULLP;
3541 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3542 timeDomAllocList->choice.setup->list.size);
3543 if(!timeDomAllocList->choice.setup->list.array)
3545 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3549 for(idx = 0; idx < elementCnt; idx++)
3551 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3552 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3553 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3554 if(!timeDomAllocList->choice.setup->list.array[idx])
3556 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3562 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3563 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3564 if(!timeDomAlloc->k2)
3566 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3569 *(timeDomAlloc->k2) = PUSCH_K2;
3570 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3571 timeDomAlloc->startSymbolAndLength = 27;
3575 /*******************************************************************
3577 * @brief Builds BWP UL dedicated PUSCH Config
3581 * Function : BuildBWPUlDedPuschCfg
3584 * Builds BWP UL dedicated PUSCH Config
3586 * @params[in] : PUSCH_Config_t *puschCfg
3588 * @return ROK - success
3591 * ****************************************************************/
3592 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3594 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3595 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3596 if(!puschCfg->dataScramblingIdentityPUSCH)
3598 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3601 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3603 puschCfg->txConfig = NULLP;
3604 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3605 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3606 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3607 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3609 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3613 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3618 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3619 puschCfg->pusch_PowerControl = NULLP;
3620 puschCfg->frequencyHopping = NULLP;
3621 puschCfg->frequencyHoppingOffsetLists = NULLP;
3622 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3624 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3625 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3626 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3627 if(!puschCfg->pusch_TimeDomainAllocationList)
3629 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3633 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3638 puschCfg->pusch_AggregationFactor = NULLP;
3639 puschCfg->mcs_Table = NULLP;
3640 puschCfg->mcs_TableTransformPrecoder = NULLP;
3641 puschCfg->transformPrecoder = NULLP;
3642 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3643 if(!puschCfg->transformPrecoder)
3645 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3648 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3650 puschCfg->codebookSubset = NULLP;
3651 puschCfg->maxRank = NULLP;
3652 puschCfg->rbg_Size = NULLP;
3653 puschCfg->uci_OnPUSCH = NULLP;
3654 puschCfg->tp_pi2BPSK = NULLP;
3659 /*******************************************************************
3661 * @brief Fills SRS resource to add/modify list
3665 * Function : BuildSrsRsrcAddModList
3667 * Functionality: Fills SRS resource to add/modify list
3670 * @return ROK - success
3673 * ****************************************************************/
3674 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3680 resourceList->list.count = elementCnt;
3681 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3682 resourceList->list.array = NULLP;
3683 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3684 if(!resourceList->list.array)
3686 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3690 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3692 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3693 if(!resourceList->list.array[rsrcIdx])
3695 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3701 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3702 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3703 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3705 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3706 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3707 sizeof(struct SRS_Resource__transmissionComb__n2));
3708 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3710 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3713 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3714 = SRS_COMB_OFFSET_N2;
3715 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3716 = SRS_CYCLIC_SHIFT_N2;
3718 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3720 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3721 SRS_Resource__resourceMapping__nrofSymbols_n1;
3722 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3723 SRS_Resource__resourceMapping__repetitionFactor_n1;
3725 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3726 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3727 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3728 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3729 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3730 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3731 SRS_Resource__groupOrSequenceHopping_neither;
3733 /* Setting resource type to aperiodic for intergration purposes */
3734 resourceList->list.array[rsrcIdx]->resourceType.present = \
3735 SRS_Resource__resourceType_PR_aperiodic;
3736 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3737 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3738 sizeof(struct SRS_Resource__resourceType__aperiodic));
3739 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3741 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3744 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3749 /*******************************************************************
3751 * @brief Build SRS resource set Add/mod list
3755 * Function : BuildSrsRsrcSetAddModList
3757 * Functionality: Build SRS resource set Add/mod list
3760 * @return ROK - success
3763 * ****************************************************************/
3764 uint8_t BuildSrsRsrcSetAddModList
3766 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3772 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3775 rsrcSetList->list.count = elementCnt;
3776 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3777 rsrcSetList->list.array = NULLP;
3778 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3779 if(!rsrcSetList->list.array)
3781 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3785 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3787 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3788 if(!rsrcSetList->list.array[rSetIdx])
3790 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3796 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3798 /* Fill Resource Id list in resource set */
3799 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3800 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3801 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3802 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3804 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
3809 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3810 rsrcIdList->list.count = elementCnt;
3811 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3812 rsrcIdList->list.array = NULLP;
3813 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3814 if(!rsrcIdList->list.array)
3816 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3820 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3822 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3823 if(!rsrcIdList->list.array[rsrcIdx])
3825 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3831 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3833 /* Fill resource type */
3834 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3835 SRS_ResourceSet__resourceType_PR_aperiodic;
3837 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3838 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3839 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3840 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3842 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3845 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3846 = APERIODIC_SRS_RESRC_TRIGGER;
3848 /* TODO : Fill values for below IEs as expected by Viavi */
3849 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3850 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3853 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3854 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3855 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3856 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3857 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3862 /*******************************************************************
3864 * @brief Builds BWP UL dedicated SRS Config
3868 * Function : BuildBWPUlDedSrsCfg
3870 * Functionality: Builds BWP UL dedicated SRS Config
3872 * @params[in] SRS Config
3873 * @return ROK - success
3876 * ****************************************************************/
3877 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3879 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3880 srsCfg->srs_ResourceSetToAddModList = NULLP;
3881 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3882 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3883 if(!srsCfg->srs_ResourceSetToAddModList)
3885 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3888 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3893 srsCfg->srs_ResourceToReleaseList = NULLP;
3895 /* Resource to Add/Modify list */
3896 srsCfg->srs_ResourceToAddModList = NULLP;
3897 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3898 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3899 if(!srsCfg->srs_ResourceToAddModList)
3901 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3905 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3910 srsCfg->tpc_Accumulation = NULLP;
3915 /*******************************************************************
3917 * @brief Builds inital UL BWP
3921 * Function : BuildInitialUlBWP
3923 * Functionality: Builds initial UL BWP
3925 * @params[in] BWP_UplinkDedicated_t *ulBwp
3926 * @return ROK - success
3929 * ****************************************************************/
3930 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3932 ulBwp->pucch_Config = NULLP;
3934 /* Fill BWP UL dedicated PUSCH config */
3935 ulBwp->pusch_Config = NULLP;
3936 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3937 if(!ulBwp->pusch_Config)
3939 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3943 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3944 ulBwp->pusch_Config->choice.setup = NULLP;
3945 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3946 if(!ulBwp->pusch_Config->choice.setup)
3948 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3952 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3957 ulBwp->configuredGrantConfig = NULLP;
3959 /* Fill BPW UL dedicated SRS config */
3960 ulBwp->srs_Config = NULLP;
3961 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3962 if(!ulBwp->srs_Config)
3964 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3968 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3969 ulBwp->srs_Config->choice.setup = NULLP;
3970 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3971 if(!ulBwp->srs_Config->choice.setup)
3973 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
3977 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3982 ulBwp->beamFailureRecoveryConfig = NULLP;
3987 /*******************************************************************
3989 * @brief Builds Pusch Serving cell Config
3993 * Function : BuildPuschSrvCellCfg
3995 * Functionality: Builds Pusch Serving cell Config
3997 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3999 * @return ROK - success
4002 * ****************************************************************/
4003 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4005 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4006 puschCfg->choice.setup = NULLP;
4007 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4008 if(!puschCfg->choice.setup)
4010 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4014 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4015 puschCfg->choice.setup->rateMatching = NULLP;
4016 puschCfg->choice.setup->xOverhead = NULLP;
4017 puschCfg->choice.setup->ext1 = NULLP;
4018 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4019 if(!puschCfg->choice.setup->ext1)
4021 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4025 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4026 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4027 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4029 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4032 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4034 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4035 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4036 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4038 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4041 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4045 /*******************************************************************
4047 * @brief Builds UL config
4050 * Function : BuildUlCfg
4052 * Functionality: Builds UL config in spCellCfgDed
4054 * @params[in] UplinkConfig_t *ulCfg
4056 * @return ROK - success
4059 * ****************************************************************/
4060 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4062 ulCfg->initialUplinkBWP = NULLP;
4063 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4064 if(!ulCfg->initialUplinkBWP)
4066 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4070 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4075 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4076 ulCfg->uplinkBWP_ToAddModList = NULLP;
4077 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4078 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4079 if(!ulCfg->firstActiveUplinkBWP_Id)
4081 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4084 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4086 ulCfg->pusch_ServingCellConfig = NULLP;
4087 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4088 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4089 if(!ulCfg->pusch_ServingCellConfig)
4091 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4095 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4100 ulCfg->carrierSwitching = NULLP;
4101 ulCfg->ext1 = NULLP;
4105 /*******************************************************************
4107 * @brief Builds PDSCH serving cell config
4110 * Function : BuildPdschSrvCellCfg
4112 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4114 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4116 * @return ROK - success
4119 * ****************************************************************/
4120 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4122 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4123 pdschCfg->choice.setup = NULLP;
4124 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4125 if(!pdschCfg->choice.setup)
4127 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4131 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4132 pdschCfg->choice.setup->xOverhead = NULLP;
4133 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4134 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4135 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4137 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4140 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4141 pdschCfg->choice.setup->pucch_Cell = NULLP;
4142 pdschCfg->choice.setup->ext1 = NULLP;
4147 /*******************************************************************
4149 * @brief Builds CSI Meas config
4152 * Function : BuildCsiMeasCfg
4154 * Functionality: Builds CSI Meas config in spCellCfgDed
4156 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4158 * @return ROK - success
4161 * ****************************************************************/
4162 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4168 /*******************************************************************
4170 * @brief Builds Spcell config dedicated
4173 * Function : BuildSpCellCfgDed
4175 * Functionality: Builds sp cell config dedicated in spCellCfg
4177 * @params[in] ServingCellConfig_t srvCellCfg
4179 * @return ROK - success
4182 * ****************************************************************/
4183 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4185 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4187 srvCellCfg->initialDownlinkBWP = NULLP;
4188 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4189 if(!srvCellCfg->initialDownlinkBWP)
4191 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4195 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4197 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4200 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4201 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4203 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4204 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4205 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4207 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4210 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4212 srvCellCfg->bwp_InactivityTimer = NULLP;
4214 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4215 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4216 if(!srvCellCfg->defaultDownlinkBWP_Id)
4218 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4221 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4223 srvCellCfg->uplinkConfig = NULLP;
4224 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4225 if(!srvCellCfg->uplinkConfig)
4227 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4231 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4233 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4236 srvCellCfg->supplementaryUplink = NULLP;
4237 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4239 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4240 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4241 if(!srvCellCfg->pdsch_ServingCellConfig)
4243 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4247 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4249 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4253 srvCellCfg->csi_MeasConfig = NULLP;
4255 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4256 if(!srvCellCfg->csi_MeasConfig)
4258 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4262 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4264 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4268 srvCellCfg->sCellDeactivationTimer = NULLP;
4269 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4270 srvCellCfg->tag_Id = TAG_ID;
4271 srvCellCfg->dummy = NULLP;
4272 srvCellCfg->pathlossReferenceLinking = NULLP;
4273 srvCellCfg->servingCellMO = NULLP;
4274 srvCellCfg->ext1 = NULLP;
4278 /*******************************************************************
4280 * @brief Builds Spcell config
4284 * Function : BuildSpCellCfg
4286 * Functionality: Builds sp cell config in DuToCuRrcContainer
4288 * @params[in] SpCellConfig_t spCellCfg
4290 * @return ROK - success
4293 * ****************************************************************/
4294 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4297 spCellCfg->servCellIndex = NULLP;
4298 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4299 if(!spCellCfg->servCellIndex)
4301 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4304 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4306 spCellCfg->reconfigurationWithSync = NULLP;
4307 spCellCfg->rlf_TimersAndConstants = NULLP;
4308 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4309 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4310 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4312 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4315 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4317 spCellCfg->spCellConfigDedicated = NULLP;
4318 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4319 if(!spCellCfg->spCellConfigDedicated)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4324 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4326 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4331 /*******************************************************************
4333 * @brief Builds Phy cell group config
4337 * Function : BuildPhyCellGrpCfg
4339 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4341 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4343 * @return ROK - success
4346 * ****************************************************************/
4347 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4349 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4350 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4352 phyCellGrpCfg->p_NR_FR1 = NULLP;
4353 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4354 if(!phyCellGrpCfg->p_NR_FR1)
4356 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4359 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4360 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4361 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4362 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4363 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4364 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4365 phyCellGrpCfg->cs_RNTI = NULLP;
4366 phyCellGrpCfg->ext1 = NULLP;
4367 phyCellGrpCfg->ext2 = NULLP;
4372 /*******************************************************************
4374 * @brief Builds tag config
4378 * Function : BuildTagConfig
4380 * Functionality: Builds tag config in MacCellGroupConfig
4382 * @params[in] TAG_Config *tag_Config
4384 * @return ROK - success
4387 * ****************************************************************/
4388 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4390 struct TAG_Config__tag_ToAddModList *tagList;
4391 uint8_t idx, elementCnt;
4393 tagConfig->tag_ToReleaseList = NULLP;
4394 tagConfig->tag_ToAddModList = NULLP;
4395 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4396 if(!tagConfig->tag_ToAddModList)
4398 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4402 elementCnt = 1; //ODU_VALUE_ONE;
4403 tagList = tagConfig->tag_ToAddModList;
4404 tagList->list.count = elementCnt;
4405 tagList->list.size = elementCnt * sizeof(struct TAG *);
4407 tagList->list.array = NULLP;
4408 CU_ALLOC(tagList->list.array, tagList->list.size);
4409 if(!tagList->list.array)
4411 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4415 for(idx=0; idx<tagList->list.count; idx++)
4417 tagList->list.array[idx] = NULLP;
4418 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4419 if(!tagList->list.array[idx])
4421 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4427 tagList->list.array[idx]->tag_Id = TAG_ID;
4428 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4433 /*******************************************************************
4435 * @brief Builds PHR Config
4439 * Function : BuildPhrConfig
4441 * Functionality: Builds phrConfig in MacCellGroupConfig
4443 * @params[in] PHR Config *
4445 * @return ROK - success
4448 * ****************************************************************/
4449 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4452 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4453 phrConfig->choice.setup = NULLP;
4454 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4455 if(!phrConfig->choice.setup)
4457 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4461 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4462 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4463 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4464 phrConfig->choice.setup->multiplePHR = false;
4465 phrConfig->choice.setup->dummy = false;
4466 phrConfig->choice.setup->phr_Type2OtherCell = false;
4467 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4472 /*******************************************************************
4474 * @brief Builds BSR Config
4478 * Function : BuildBsrConfig
4480 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4482 * @params[in] BSR_Config *bsrConfig
4484 * @return ROK - success
4487 * ****************************************************************/
4488 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4490 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4491 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4492 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4497 /*******************************************************************
4499 * @brief Builds scheduling request config
4503 * Function : BuildSchedulingReqConfig
4505 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4507 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4509 * @return ROK - success
4512 * ****************************************************************/
4513 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4515 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4516 uint8_t idx, elementCnt;
4518 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4519 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4520 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4521 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4523 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4527 elementCnt = 1; //ODU_VALUE_ONE;
4528 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4529 schReqList->list.count = elementCnt;
4530 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4532 schReqList->list.array = NULLP;
4533 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4534 if(!schReqList->list.array)
4536 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4540 for(idx=0;idx<schReqList->list.count; idx++)
4542 schReqList->list.array[idx] = NULLP;
4543 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4544 if(!schReqList->list.array[idx])
4546 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4552 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4554 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4555 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4556 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4558 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4561 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4562 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4563 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4567 /*******************************************************************
4569 * @brief Builds Mac cell group config
4573 * Function : BuildMacCellGrpCfg
4575 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4577 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4579 * @return ROK - success
4582 * ****************************************************************/
4583 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4585 macCellGrpCfg->drx_Config = NULLP;
4586 macCellGrpCfg->schedulingRequestConfig = NULLP;
4587 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4588 if(!macCellGrpCfg->schedulingRequestConfig)
4590 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4594 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4596 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4600 macCellGrpCfg->bsr_Config = NULLP;
4601 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4602 if(!macCellGrpCfg->bsr_Config)
4604 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4608 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4610 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4614 macCellGrpCfg->tag_Config = NULLP;
4615 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4616 if(!macCellGrpCfg->tag_Config)
4618 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4622 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4624 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4628 macCellGrpCfg->phr_Config = NULLP;
4629 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4630 if(!macCellGrpCfg->phr_Config)
4632 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4636 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4638 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
4642 macCellGrpCfg->skipUplinkTxDynamic = false;
4643 macCellGrpCfg->ext1 = NULLP;
4647 /*******************************************************************
4649 * @brief Frees memeory allocated for SearchSpcToAddModList
4653 * Function : FreeSearchSpcToAddModList
4655 * Functionality: Deallocating memory of SearchSpcToAddModList
4657 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4661 4221 * ****************************************************************/
4662 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4666 struct SearchSpace *searchSpc=NULLP;
4668 if(searchSpcList->list.array)
4670 if(searchSpcList->list.array[idx2])
4672 searchSpc = searchSpcList->list.array[idx2];
4673 if(searchSpc->controlResourceSetId)
4675 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4677 if(searchSpc->monitoringSymbolsWithinSlot)
4679 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4681 if(searchSpc->nrofCandidates)
4683 if(searchSpc->searchSpaceType)
4685 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4686 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4687 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4688 SearchSpace__searchSpaceType));
4690 CU_FREE(searchSpc->nrofCandidates,
4691 sizeof(struct SearchSpace__nrofCandidates));
4693 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4694 searchSpc->monitoringSymbolsWithinSlot->size);
4696 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4697 sizeof(BIT_STRING_t));
4699 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4700 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4702 CU_FREE(searchSpc->controlResourceSetId,
4703 sizeof(ControlResourceSetId_t));
4706 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4708 CU_FREE(searchSpcList->list.array[idx1],
4709 sizeof(struct SearchSpace));
4711 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4714 /*******************************************************************
4716 * @brief Frees memory allocated for PdschTimeDomAllocList
4720 * Function : FreePdschTimeDomAllocList
4722 * Functionality: Deallocating memory of PdschTimeDomAllocList
4724 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4728 4221 * ****************************************************************/
4729 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4733 if(timeDomAllocList->choice.setup)
4735 if(timeDomAllocList->choice.setup->list.array)
4737 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4739 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4740 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4742 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4743 timeDomAllocList->choice.setup->list.size);
4745 CU_FREE(timeDomAllocList->choice.setup,\
4746 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4749 /*******************************************************************
4751 * @brief Frees memory allocated for PuschTimeDomAllocList
4755 * Function : FreePuschTimeDomAllocList
4757 * Functionality: Deallocating memory of PuschTimeDomAllocList
4759 * @params[in] PUSCH_Config_t *puschCfg
4763 ***********************************************************************/
4764 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4768 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4770 if(puschCfg->pusch_TimeDomainAllocationList)
4772 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4773 if(timeDomAllocList_t->choice.setup)
4775 if(timeDomAllocList_t->choice.setup->list.array)
4777 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4778 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4780 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4781 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4783 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4784 timeDomAllocList_t->choice.setup->list.size);
4786 CU_FREE(timeDomAllocList_t->choice.setup, \
4787 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4789 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4790 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4791 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4795 /*******************************************************************
4797 * @brief Frees memory allocated for InitialUlBWP
4801 * Function : FreeInitialUlBWP
4803 * Functionality: Deallocating memory of InitialUlBWP
4805 * @params[in] BWP_UplinkDedicated_t *ulBwp
4809 * ****************************************************************/
4810 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4812 uint8_t rSetIdx, rsrcIdx;
4813 SRS_Config_t *srsCfg = NULLP;
4814 PUSCH_Config_t *puschCfg = NULLP;
4815 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4816 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4817 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4818 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4820 if(ulBwp->pusch_Config)
4822 if(ulBwp->pusch_Config->choice.setup)
4824 puschCfg=ulBwp->pusch_Config->choice.setup;
4825 if(puschCfg->dataScramblingIdentityPUSCH)
4827 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4829 FreePuschTimeDomAllocList(puschCfg);
4830 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4831 if(dmrsUlCfg->choice.setup)
4833 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4835 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4837 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4839 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4840 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4842 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4845 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4847 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4848 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4850 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4852 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4854 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4856 /* Free SRS-Config */
4857 if(ulBwp->srs_Config)
4859 if(ulBwp->srs_Config->choice.setup)
4861 srsCfg = ulBwp->srs_Config->choice.setup;
4863 /* Free Resource Set to add/mod list */
4864 if(srsCfg->srs_ResourceSetToAddModList)
4866 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4867 if(rsrcSetList->list.array)
4871 /* Free SRS resource Id list in this SRS resource set */
4872 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4874 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4876 if(rsrcIdList->list.array)
4878 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4880 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4882 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4884 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4885 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4888 /* Free resource type info for this SRS resource set */
4889 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4890 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4892 /* Free memory for each resource set */
4893 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4895 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4897 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4899 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4900 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4903 /* Free resource to add/modd list */
4904 if(srsCfg->srs_ResourceToAddModList)
4906 resourceList = srsCfg->srs_ResourceToAddModList;
4907 if(resourceList->list.array)
4910 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4911 sizeof(struct SRS_Resource__transmissionComb__n2));
4912 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4913 sizeof(struct SRS_Resource__resourceType__aperiodic));
4915 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4917 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4919 CU_FREE(resourceList->list.array, resourceList->list.size);
4921 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4922 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4925 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4927 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4931 /*******************************************************************
4933 * @brief Frees memory allocated for initialUplinkBWP
4937 * Function : FreeinitialUplinkBWP
4939 * Functionality: Deallocating memory of initialUplinkBWP
4941 * @params[in] UplinkConfig_t *ulCfg
4946 * ****************************************************************/
4947 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4949 BWP_UplinkDedicated_t *ulBwp=NULLP;
4950 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4952 if(ulCfg->initialUplinkBWP)
4954 ulBwp=ulCfg->initialUplinkBWP;
4955 if(ulCfg->firstActiveUplinkBWP_Id)
4957 if(ulCfg->pusch_ServingCellConfig)
4959 puschCfg=ulCfg->pusch_ServingCellConfig;
4960 if(puschCfg->choice.setup)
4962 if(puschCfg->choice.setup->ext1)
4964 CU_FREE(puschCfg->choice.setup->ext1->\
4965 processingType2Enabled,sizeof(BOOLEAN_t));
4966 CU_FREE(puschCfg->choice.setup->ext1->\
4967 maxMIMO_Layers,sizeof(long));
4968 CU_FREE(puschCfg->choice.setup->ext1, \
4969 sizeof(struct PUSCH_ServingCellConfig__ext1));
4971 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4973 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4975 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4977 FreeInitialUlBWP(ulBwp);
4978 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4981 /*******************************************************************
4983 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4987 * Function : FreeBWPDlDedPdschCfg
4989 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4991 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4996 * ****************************************************************/
4997 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4999 struct PDSCH_Config *pdschCfg=NULLP;
5000 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5001 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5002 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5004 if(dlBwp->pdsch_Config->choice.setup)
5006 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5007 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5009 if(pdschCfg->pdsch_TimeDomainAllocationList)
5011 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5012 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5014 prbBndlType=&pdschCfg->prb_BundlingType;
5015 CU_FREE(prbBndlType->choice.staticBundling,\
5016 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5017 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5019 FreePdschTimeDomAllocList(timeDomAllocList);
5020 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5021 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5023 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5024 if(dmrsDlCfg->choice.setup)
5026 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5028 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5030 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5031 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5033 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5036 /*******************************************************************
5038 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5042 * Function : FreeBWPDlDedPdcchCfg
5044 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5046 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5051 * ****************************************************************/
5052 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5056 struct PDCCH_Config *pdcchCfg=NULLP;
5057 struct ControlResourceSet *controlRSet=NULLP;
5058 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5060 if(dlBwp->pdcch_Config->choice.setup)
5062 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5063 if(pdcchCfg->controlResourceSetToAddModList)
5065 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5066 if(controlRSetList->list.array)
5068 controlRSet = controlRSetList->list.array[idx2];
5071 if(controlRSet->frequencyDomainResources.buf)
5073 if(controlRSet->pdcch_DMRS_ScramblingID)
5075 if(pdcchCfg->searchSpacesToAddModList)
5077 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5078 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5079 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5081 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5083 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5084 controlRSet->frequencyDomainResources.size);
5087 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5089 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5091 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5093 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5094 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5096 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5099 /*******************************************************************
5101 * @brief Builds RLC Config
5105 * Function : BuildRlcConfig
5107 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5109 * @params[in] RLC_Config *rlcConfig
5111 * @return ROK - success
5114 * ****************************************************************/
5115 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5118 rlcConfig->present = RLC_Config_PR_am;
5120 rlcConfig->choice.am = NULLP;
5121 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5122 if(!rlcConfig->choice.am)
5124 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5129 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5130 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5131 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5133 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5136 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5137 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5138 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5139 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5140 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5143 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5144 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5145 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5147 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5150 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5151 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5152 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5157 /*******************************************************************
5159 * @brief Builds MAC LC Config
5163 * Function : BuildMacLCConfig
5165 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5167 * @params[in] struct LogicalChannelConfig macLcConfig
5169 * @return ROK - success
5172 * ****************************************************************/
5173 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5176 macLcConfig->ul_SpecificParameters = NULLP;
5177 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5178 if(!macLcConfig->ul_SpecificParameters)
5180 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5184 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5185 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5186 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5187 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5188 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5189 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5190 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5192 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5193 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5194 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5196 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5199 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5201 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5202 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5203 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5205 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5208 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5210 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5211 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5212 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5216 /*******************************************************************
5218 * @brief Builds RLC Bearer to Add/Mod list
5222 * Function :BuildRlcBearerToAddModList
5224 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5226 * @params[in] rlc_BearerToAddModList
5228 * @return ROK - success
5231 * ****************************************************************/
5232 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5234 uint8_t idx, elementCnt;
5237 rlcBearerList->list.count = elementCnt;
5238 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5240 rlcBearerList->list.array = NULLP;
5241 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5242 if(!rlcBearerList->list.array)
5244 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5248 for(idx=0; idx<rlcBearerList->list.count; idx++)
5250 rlcBearerList->list.array[idx] = NULLP;
5251 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5252 if(!rlcBearerList->list.array[idx])
5254 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5260 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5262 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5263 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5265 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5269 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5270 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5272 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5273 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5274 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5275 if(!rlcBearerList->list.array[idx]->rlc_Config)
5277 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5281 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5283 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5287 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5288 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5289 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5291 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5295 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5297 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5304 /*******************************************************************
5306 * @brief Free memory allocated for CellGroupConfig
5310 * Function : FreeMemCellGrpCfg
5312 * Functionality: Deallocating memory of CellGroupConfig
5314 * @params[in] pointer to CellGroupConfigRrc_t
5316 * @return ROK - success
5319 ******************************************************************/
5320 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5323 SpCellConfig_t *spCellCfg=NULLP;
5324 ServingCellConfig_t *srvCellCfg=NULLP;
5325 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5326 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5327 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5328 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5329 struct RLC_Config *rlcConfig=NULLP;
5330 struct LogicalChannelConfig *macLcConfig=NULLP;
5331 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5332 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5333 struct TAG_Config *tagConfig=NULLP;
5334 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5335 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5336 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5338 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5341 if(rlcBearerList->list.array)
5343 for(idx=0; idx<rlcBearerList->list.count; idx++)
5345 if(rlcBearerList->list.array[idx])
5347 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5348 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5351 if(rlcConfig->choice.am)
5353 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5354 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5355 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5357 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5359 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5362 if(macLcConfig->ul_SpecificParameters)
5364 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5365 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5366 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5368 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5370 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5373 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5375 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5378 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5381 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5382 if(schedulingRequestConfig)
5384 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5387 if(schReqList->list.array)
5389 for(idx=0;idx<schReqList->list.count; idx++)
5391 if(schReqList->list.array[idx])
5393 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5394 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5397 CU_FREE(schReqList->list.array, schReqList->list.size);
5399 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5400 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5401 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5403 if(macCellGrpCfg->bsr_Config)
5405 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5407 tagConfig = macCellGrpCfg->tag_Config;
5410 tagList = tagConfig->tag_ToAddModList;
5413 if(tagList->list.array)
5415 for(idx=0; idx<tagList->list.count; idx++)
5417 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5419 CU_FREE(tagList->list.array, tagList->list.size);
5421 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5423 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5426 phrConfig = macCellGrpCfg->phr_Config;
5429 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5430 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5433 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5436 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5439 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5440 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5443 spCellCfg = cellGrpCfg->spCellConfig;
5446 if(spCellCfg->servCellIndex)
5448 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5450 if(spCellCfg->spCellConfigDedicated)
5452 srvCellCfg = spCellCfg->spCellConfigDedicated;
5453 if(srvCellCfg->initialDownlinkBWP)
5455 dlBwp = srvCellCfg->initialDownlinkBWP;
5456 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5458 if(srvCellCfg->defaultDownlinkBWP_Id)
5460 if(srvCellCfg->uplinkConfig)
5462 if(srvCellCfg->pdsch_ServingCellConfig)
5464 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5465 if(pdschCfg->choice.setup)
5467 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5468 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5470 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5471 ServingCellConfig__pdsch_ServingCellConfig));
5473 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5474 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5476 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5478 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5480 if(dlBwp->pdcch_Config)
5482 if(dlBwp->pdsch_Config)
5484 FreeBWPDlDedPdschCfg(dlBwp);
5485 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5487 FreeBWPDlDedPdcchCfg(dlBwp);
5488 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5490 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5492 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5494 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5496 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5498 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5503 /*******************************************************************
5505 * @brief Fills CellGroupConfig
5509 * Function : fillCellGrpCfg
5511 * Functionality: Fills CellGroupConfig
5513 * @params[in] pointer to CellGroupConfigRrc_t
5515 * @return ROK - success
5518 ******************************************************************/
5520 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5522 uint8_t ret = RFAILED;
5523 CellGroupConfigRrc_t cellGrpCfg;
5524 asn_enc_rval_t encRetVal;
5528 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5530 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5531 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5532 if(!cellGrpCfg.rlc_BearerToAddModList)
5534 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
5537 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5539 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
5543 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5544 cellGrpCfg.mac_CellGroupConfig = NULLP;
5545 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5546 if(!cellGrpCfg.mac_CellGroupConfig)
5548 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
5551 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5553 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
5558 cellGrpCfg.physicalCellGroupConfig = NULLP;
5559 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5560 if(!cellGrpCfg.physicalCellGroupConfig)
5562 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5565 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5567 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
5571 cellGrpCfg.spCellConfig = NULLP;
5572 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5573 if(!cellGrpCfg.spCellConfig)
5575 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5578 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5580 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
5584 cellGrpCfg.sCellToAddModList = NULLP;
5585 cellGrpCfg.sCellToReleaseList = NULLP;
5586 cellGrpCfg.ext1 = NULLP;
5588 /* encode cellGrpCfg into duToCuRrcContainer */
5589 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5590 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5592 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5593 /* Encode results */
5594 if(encRetVal.encoded == ENCODE_FAIL)
5596 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5597 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5602 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
5603 for(int i=0; i< encBufSize; i++)
5605 DU_LOG("%x",encBuf[i]);
5609 cellGrp->size = encBufSize;
5610 CU_ALLOC(cellGrp->buf, cellGrp->size);
5613 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5616 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5620 FreeMemCellGrpCfg(&cellGrpCfg);
5624 /*******************************************************************
5626 * @brief Free UE Capability RAT container
5630 * Function : freeUeCapRatCont
5633 * Free UE Capability RAT conatiner
5636 * @return ROK - success
5639 * ****************************************************************/
5640 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
5643 FeatureSets_t *featureSets;
5645 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5647 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5649 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5650 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5652 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
5655 if(ueNrCap->featureSets)
5657 featureSets = ueNrCap->featureSets;
5658 if(featureSets->featureSetsDownlinkPerCC)
5660 if(featureSets->featureSetsDownlinkPerCC->list.array)
5662 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5664 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5665 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
5666 sizeof(ModulationOrder_t));
5667 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5669 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5671 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5674 if(featureSets->featureSetsUplinkPerCC)
5676 if(featureSets->featureSetsUplinkPerCC->list.array)
5678 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5680 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5682 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5683 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
5684 sizeof(ModulationOrder_t));
5685 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5688 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5690 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5692 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
5696 /*******************************************************************
5698 * @brief Free UE capability RAT container list
5702 * Function : freeUeCapRatContList
5704 * Functionality: Free UE capability RAT container list
5707 * @return ROK - success
5710 * ****************************************************************/
5711 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
5714 if(ueCapablityList->list.array)
5716 for(idx = 0; idx < ueCapablityList->list.count; idx++)
5718 if(ueCapablityList->list.array[idx])
5719 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
5721 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
5725 /*******************************************************************
5727 * @brief Fill feature sets
5731 * Function : fillFeatureSets
5733 * Functionality: Fill feature sets
5736 * @return ROK - success
5739 * ****************************************************************/
5740 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
5742 uint8_t idx, elementCnt;
5744 featureSets->featureSetsDownlink = NULLP;
5745 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
5746 if(!featureSets->featureSetsDownlinkPerCC)
5748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5753 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
5754 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
5755 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
5756 if(!featureSets->featureSetsDownlinkPerCC->list.array)
5758 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5762 for(idx = 0; idx < elementCnt; idx++)
5764 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
5765 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
5767 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5773 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
5774 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
5775 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5776 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5777 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
5779 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
5780 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5785 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
5787 featureSets->featureSetsUplink = NULLP;
5788 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
5789 if(!featureSets->featureSetsUplinkPerCC)
5791 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5796 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
5797 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
5798 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
5799 if(!featureSets->featureSetsUplinkPerCC->list.array)
5801 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5805 for(idx = 0; idx < elementCnt; idx++)
5807 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
5808 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
5810 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5816 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
5817 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
5818 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
5819 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
5820 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
5821 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
5823 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
5824 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5826 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
5829 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
5834 /*******************************************************************
5836 * @brief Fill UE capability RAT container
5840 * Function : fillUeCapRatCont
5842 * Functionality: Fill UE capability RAT container
5844 * @params[in] UE Capability RAT container buffer
5845 * @return ROK - success
5848 * ****************************************************************/
5849 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
5852 uint8_t idx, elementCnt;
5853 asn_enc_rval_t encRetVal;
5854 UE_NR_Capability_t ueNrCap;
5858 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
5860 /* Filling PDCP parameters */
5861 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
5862 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
5863 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
5864 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
5865 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
5866 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
5867 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
5868 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
5869 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
5870 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
5871 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
5872 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
5873 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
5874 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
5875 ueNrCap.pdcp_Parameters.shortSN = NULLP;
5876 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
5877 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
5879 ueNrCap.rlc_Parameters = NULLP;
5880 ueNrCap.mac_Parameters = NULLP;
5882 /* Filling PHY parameters */
5883 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
5884 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
5885 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
5886 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
5887 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
5889 /* Filling RF parameters */
5891 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
5892 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
5893 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
5894 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
5896 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5901 for(idx = 0; idx < elementCnt; idx++)
5903 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
5904 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
5914 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
5915 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
5916 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
5918 ueNrCap.measAndMobParameters = NULLP;
5919 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
5920 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
5921 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
5922 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
5923 ueNrCap.featureSets = NULLP;
5925 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
5926 if(!ueNrCap.featureSets)
5928 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
5933 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
5935 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
5940 ueNrCap.featureSetCombinations = NULLP;
5941 ueNrCap.lateNonCriticalExtension = NULLP;
5942 ueNrCap.nonCriticalExtension = NULLP;
5944 /* encode UE Capability RAT Container List into duToCuRrcContainer */
5945 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
5946 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5948 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
5950 /* Encode results */
5951 if(encRetVal.encoded == ENCODE_FAIL)
5953 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
5954 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5959 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
5960 for(int i=0; i< encBufSize; i++)
5962 DU_LOG("%x",encBuf[i]);
5966 ueCapRatContBuf->size = encBufSize;
5967 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
5968 if(!ueCapRatContBuf->buf)
5970 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
5973 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
5977 freeUeCapRatCont(&ueNrCap);
5981 /*******************************************************************
5983 * @brief Fill UE Capability RAT container list
5987 * Function : fillUeCapRatContList
5989 * Functionality: Fill UE Capability RAT container list
5992 * @params[in] UE capability RAT container list buffer
5993 * @return ROK - success
5996 * ****************************************************************/
5997 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
5999 uint8_t ret = RFAILED;
6000 uint8_t idx, elementCnt;
6001 asn_enc_rval_t encRetVal;
6002 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6007 ueCapablityList.list.count = elementCnt;
6008 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6010 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6011 if(!ueCapablityList.list.array)
6013 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6018 for(idx=0; idx<elementCnt; idx++)
6020 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6021 if(ueCapablityList.list.array[idx] == NULLP)
6023 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6029 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6030 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6032 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6033 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6034 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6036 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6037 &ueCapablityList, PrepFinalEncBuf, encBuf);
6039 /* Encode results */
6040 if(encRetVal.encoded == ENCODE_FAIL)
6042 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6043 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6048 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6049 for(int i=0; i< encBufSize; i++)
6051 DU_LOG("%x",encBuf[i]);
6055 ueCapablityListBuf->size = encBufSize;
6056 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6057 if(!ueCapablityListBuf->buf)
6059 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6062 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6066 freeUeCapRatContList(&ueCapablityList);
6070 /*******************************************************************
6072 * @brief Fills CuToDuContainer
6076 * Function : fillCuToDuContainer
6078 * Functionality: Fills CuToDuContainer
6080 * @params[in] pointer to CUtoDURRCInformation_t
6082 * @return ROK - success
6085 ******************************************************************/
6087 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6089 uint8_t elementCnt = 0;
6091 uint8_t idx, idx2, rrcBufLen;
6093 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6094 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6096 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6099 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6101 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6102 if(rrcMsg->iE_Extensions)
6105 rrcMsg->iE_Extensions->list.count = elementCnt;
6106 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6108 /* Initialize the CUtoDURRCInformation_ExtIEs */
6109 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6111 if(rrcMsg->iE_Extensions->list.array == NULLP)
6113 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6117 for(idx=0; idx<elementCnt; idx++)
6119 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6120 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6126 /* Filling CellGroupConfig_t IE */
6127 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6128 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6129 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6130 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6131 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6136 /*******************************************************************
6138 * @brief Free CuToDuContainer
6142 * Function : FreeCuToDuInfo
6144 * Functionality: Free CuToDuContainer
6146 * @params[in] pointer to CUtoDURRCInformation_t
6148 * @return ROK - success
6151 ******************************************************************/
6153 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6157 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6159 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6160 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6161 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6163 if(rrcMsg->iE_Extensions)
6165 if(rrcMsg->iE_Extensions->list.array)
6167 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6169 if(rrcMsg->iE_Extensions->list.array[idx])
6171 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6173 case ProtocolIE_ID_id_CellGroupConfig:
6174 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6176 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6177 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6182 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6183 rrcMsg->iE_Extensions->list.array[idx]->id);
6189 for(idx2 = 0; idx2 < idx; idx2++)
6191 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6193 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6197 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6200 /*******************************************************************
6202 * @brief Builds and sends the UE Setup Request
6206 * Function : BuildAndSendUeContextSetupReq
6208 * Functionality: Constructs the UE Setup Request and sends
6209 * it to the CU through SCTP.
6213 * @return ROK - success
6216 * ****************************************************************/
6217 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
6218 uint16_t rrcContLen, uint8_t *rrcContainer)
6221 uint8_t SplCellListret;
6222 uint8_t SrbSetupret;
6224 uint8_t idx, bufLen;
6226 F1AP_PDU_t *f1apMsg = NULLP;
6227 UEContextSetupRequest_t *ueSetReq = NULLP;
6228 asn_enc_rval_t encRetVal; /* Encoder return value */
6229 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6230 uint8_t ret= RFAILED;
6234 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6236 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6237 if(f1apMsg == NULLP)
6239 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6243 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6244 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6245 if(f1apMsg->choice.initiatingMessage == NULLP)
6247 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6251 f1apMsg->choice.initiatingMessage->procedureCode = \
6252 ProcedureCode_id_UEContextSetup;
6253 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6254 f1apMsg->choice.initiatingMessage->value.present = \
6255 InitiatingMessage__value_PR_UEContextSetupRequest;
6257 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6260 ueSetReq->protocolIEs.list.count = elementCnt;
6261 ueSetReq->protocolIEs.list.size = \
6262 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6264 /* Initialize the UESetup members */
6265 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6267 if(ueSetReq->protocolIEs.list.array == NULLP)
6269 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6273 for(idx1=0; idx1<elementCnt; idx1++)
6275 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6276 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6284 /*GNB CU UE F1AP ID*/
6285 ueSetReq->protocolIEs.list.array[idx]->id = \
6286 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6287 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6288 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6289 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6290 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
6292 /*GNB DU UE F1AP ID*/
6294 ueSetReq->protocolIEs.list.array[idx]->id = \
6295 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6296 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6297 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6298 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6299 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
6303 ueSetReq->protocolIEs.list.array[idx]->id = \
6304 ProtocolIE_ID_id_SpCell_ID;
6305 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6306 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6307 UEContextSetupRequestIEs__value_PR_NRCGI;
6308 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6314 /*Served Cell Index*/
6316 ueSetReq->protocolIEs.list.array[idx]->id = \
6317 ProtocolIE_ID_id_ServCellIndex;
6318 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6319 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6320 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6321 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6324 /*CellULConfigured*/
6326 ueSetReq->protocolIEs.list.array[idx]->id = \
6327 ProtocolIE_ID_id_SpCellULConfigured;
6328 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6329 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6330 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6331 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6332 CellULConfigured_none;
6334 /*CUtoDURRCContainer*/
6336 ueSetReq->protocolIEs.list.array[idx]->id = \
6337 ProtocolIE_ID_id_CUtoDURRCInformation;
6338 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6339 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6340 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6341 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6346 /*Special Cells to be SetupList*/
6348 ueSetReq->protocolIEs.list.array[idx]->id = \
6349 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6350 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6351 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6352 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6353 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6354 if(SplCellListret != ROK)
6358 /*SRBs To Be Setup List*/
6360 ueSetReq->protocolIEs.list.array[idx]->id = \
6361 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6362 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6363 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6364 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6365 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6366 if(SrbSetupret != ROK)
6370 /*DRBs to Be Setup List*/
6372 ueSetReq->protocolIEs.list.array[idx]->id = \
6373 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6374 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6375 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6376 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6377 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6382 /* RRC Container for security mode */
6384 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6385 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6386 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6387 UEContextSetupRequestIEs__value_PR_RRCContainer;
6388 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6390 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6391 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6392 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6393 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6395 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6398 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6399 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6401 /* RRC delivery status request */
6403 ueSetReq->protocolIEs.list.array[idx]->id = \
6404 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6405 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6406 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6407 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6408 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
6409 RRCDeliveryStatusRequest_true;
6411 /* Bit Rate hardcoded as in reference logs */
6413 ueSetReq->protocolIEs.list.array[idx]->id = \
6414 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6415 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6416 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6417 UEContextSetupRequestIEs__value_PR_BitRate;
6418 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6420 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6421 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6422 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6423 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6425 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6428 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6429 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6431 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6433 /* Encode the F1SetupRequest type as APER */
6434 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6436 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6438 /* Encode results */
6439 if(encRetVal.encoded == ENCODE_FAIL)
6441 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6442 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6447 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6448 for(int i=0; i< encBufSize; i++)
6450 DU_LOG("%x",encBuf[i]);
6455 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
6457 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6463 FreeUeContextSetupReq(f1apMsg);
6466 }/* End of BuildAndSendUeContextSetupReq*/
6468 /****************************************************************
6469 * @brief Function to process Ul Rrc Msg received from DU
6473 * Function : procUlRrcMsg
6476 * - Function to process Ul Rrc Msg received from DU
6479 * @return ROK - success
6482 * ****************************************************************/
6484 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6486 uint8_t idx, ret, srbId, rrcMsgType;
6487 uint8_t cuUeF1apId, duUeF1apId;
6488 uint8_t *rrcContainer = NULLP;
6489 uint16_t rrcContLen;
6490 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6493 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6495 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6497 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6499 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6501 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6504 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6506 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6509 case ProtocolIE_ID_id_SRBID:
6510 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6512 case ProtocolIE_ID_id_RRCContainer:
6514 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6515 CU_ALLOC(rrcContainer, rrcContLen)
6518 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
6521 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6527 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6533 f1apMsgDb.dlRrcMsgCount++;
6534 rrcMsgType = setDlRRCMsgType();
6535 if(rrcMsgType == REGISTRATION_ACCEPT)
6537 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
6538 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6540 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6542 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
6543 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6544 rrcContLen, rrcContainer);
6546 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6548 /* To trigger the DL RRC Msg for RRC Reconfig */
6549 f1apMsgDb.dlRrcMsgCount++;
6550 rrcMsgType = setDlRRCMsgType();
6551 if(rrcMsgType == RRC_RECONFIG)
6553 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
6554 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6557 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
6559 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
6560 BuildAndSendUeContextModificationReq();
6566 /****************************************************************
6567 * @brief Build And Send F1ResetAck
6571 * Function : FreeF1ResetAck
6574 * - Build And Send F1ResetRSP
6577 * @return ROK - success
6580 * ****************************************************************/
6581 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6584 ResetAcknowledge_t *f1ResetAck;
6588 if(f1apMsg->choice.successfulOutcome)
6590 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6592 if(f1ResetAck->protocolIEs.list.array)
6594 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6596 if(f1ResetAck->protocolIEs.list.array[idx])
6598 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6601 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6603 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6605 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6609 /****************************************************************
6610 * @brief Build And Send F1ResetAck
6614 * Function : BuildAndSendF1ResetAck
6617 * - Build And Send F1ResetRSP
6620 * @return ROK - success
6623 * ****************************************************************/
6625 uint8_t BuildAndSendF1ResetAck()
6628 uint8_t elementCnt = 0;
6629 uint8_t ret = RFAILED;
6630 F1AP_PDU_t *f1apMsg = NULL;
6631 ResetAcknowledge_t *f1ResetAck = NULLP;
6632 asn_enc_rval_t encRetVal;
6633 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
6636 /* Allocate the memory for F1ResetRequest_t */
6637 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6638 if(f1apMsg == NULLP)
6640 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6644 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6646 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6647 if(f1apMsg->choice.successfulOutcome == NULLP)
6649 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6653 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6654 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6655 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6656 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6660 f1ResetAck->protocolIEs.list.count = elementCnt;
6661 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6663 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6664 if(f1ResetAck->protocolIEs.list.array == NULLP)
6666 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
6670 for(idx=0; idx<elementCnt; idx++)
6672 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6673 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6680 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6681 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6682 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6683 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6685 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6687 /* Encode the F1SetupRequest type as UPER */
6688 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6690 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6692 /* Check encode results */
6693 if(encRetVal.encoded == ENCODE_FAIL)
6695 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
6696 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6701 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
6702 for(int i=0; i< encBufSize; i++)
6704 DU_LOG("%x",encBuf[i]);
6708 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6710 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
6718 FreeF1ResetAck(f1apMsg);
6721 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6725 if(ulInfo->list.array)
6727 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
6729 if(ulInfo->list.array[arrIdx])
6731 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
6733 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
6735 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
6737 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6738 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6739 gTPTunnel->gTP_TEID.size);
6741 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6742 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6743 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6745 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6746 sizeof(GTPTunnel_t));
6748 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6751 CU_FREE(ulInfo->list.array,ulInfo->list.size);
6754 /*******************************************************************
6756 * @brief Builds the Uplink Tunnel Info
6760 * Function : BuildUlTnlInfoforDrb2
6762 * Functionality: Constructs the UL TnlInfo For DRB list
6764 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
6766 * @return ROK - success
6769 * ****************************************************************/
6770 uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
6776 ulInfo->list.count = ulCnt;
6777 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
6778 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
6779 if(ulInfo->list.array == NULLP)
6781 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6784 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
6786 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
6787 if(ulInfo->list.array[arrIdx] == NULLP)
6789 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6795 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
6796 UPTransportLayerInformation_PR_gTPTunnel;
6799 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
6800 sizeof(GTPTunnel_t));
6801 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
6803 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6806 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6807 transportLayerAddress.size = 4*sizeof(uint8_t);
6808 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6809 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
6810 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
6811 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6812 transportLayerAddress.buf == NULLP)
6814 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6818 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6819 transportLayerAddress.buf[0] = 192;
6820 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6821 transportLayerAddress.buf[1] = 168;
6822 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6823 transportLayerAddress.buf[2] = 130;
6824 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6825 transportLayerAddress.buf[3] = 82;
6826 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6827 transportLayerAddress.bits_unused = 0;
6830 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
6831 = 4 * sizeof(uint8_t);
6832 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6833 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
6834 gTPTunnel->gTP_TEID.size);
6835 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
6838 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
6841 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6842 gTP_TEID.buf[0] = 0;
6843 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6844 gTP_TEID.buf[1] = 0;
6845 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6846 gTP_TEID.buf[2] = 0;
6847 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
6848 gTP_TEID.buf[3] = 2;
6851 }/*End of BuildULTnlInfo*/
6852 /*******************************************************************
6854 * @brief freeing the DRB 2 item
6858 * Function : FreeDrb2Item
6860 * Functionality: freeing the DRB 2 item
6862 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6864 * @return ROK - success
6867 * ****************************************************************/
6869 void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6872 SNSSAI_t *snssai =NULLP;
6873 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
6875 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6876 switch(drbItem->qoSInformation.present)
6878 case QoSInformation_PR_NOTHING:
6880 case QoSInformation_PR_eUTRANQoS:
6882 if(drbItem->qoSInformation.choice.eUTRANQoS)
6884 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6888 case QoSInformation_PR_choice_extension:
6890 if(drbItem->qoSInformation.choice.choice_extension)
6892 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
6894 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
6897 CU_FREE(snssai->sST.buf,snssai->sST.size);
6903 CU_FREE(snssai->sD->buf,snssai->sD->size);
6905 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
6908 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
6909 if(flowMap->list.array)
6911 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
6913 if(flowMap->list.array[arrIdx] )
6915 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
6916 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
6919 CU_FREE(flowMap->list.array,flowMap->list.size);
6922 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6928 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
6929 if(drbItem->uLConfiguration)
6931 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
6934 /*******************************************************************
6936 * @brief filling the DRB 2 item
6940 * Function : FillDrb2Item
6942 * Functionality: filling the DRB 2 item
6944 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
6946 * @return ROK - success
6949 * ****************************************************************/
6951 uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
6956 drbItem->dRBID = DRB2;
6959 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
6961 switch(drbItem->qoSInformation.present)
6963 case QoSInformation_PR_NOTHING:
6967 case QoSInformation_PR_eUTRANQoS:
6970 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
6971 if(drbItem->qoSInformation.choice.eUTRANQoS)
6973 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
6976 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
6977 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
6978 PriorityLevel_no_priority;
6980 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
6981 Pre_emptionCapability_may_trigger_pre_emption;
6983 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
6984 Pre_emptionVulnerability_pre_emptable;
6988 case QoSInformation_PR_choice_extension:
6990 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
6991 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
6993 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
6997 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
6998 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
6999 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7000 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7003 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7008 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7009 choice_extension->value.choice.DRB_Information.sNSSAI);
7012 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7016 /*Flows mapped to DRB List*/
7017 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7018 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
7021 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7027 /*ULUPTNLInformation To Be Setup List*/
7028 ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7031 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed");
7036 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7038 /*UL Configuration*/
7039 CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7040 if(drbItem->uLConfiguration == NULLP)
7042 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item");
7045 drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
7048 /*******************************************************************
7050 * @brief Builds the DRB to be Setup Mod ItemIes
7054 * Function : FillDrbItemList
7056 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7058 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7060 * @return ROK - success
7063 * ****************************************************************/
7065 uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7067 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7068 drbItemIe->criticality = Criticality_reject;
7069 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7071 if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
7073 DU_LOG("\nERROR --> F1AP : FillDrb2Item failed");
7078 /*******************************************************************
7080 * @brief free the DRB to be Setup Mod list
7084 * Function : FreeDrbToBeSetupModList
7086 * Functionality: free the DRB to be Setup Mod list
7088 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7090 * @return ROK - success
7093 * ****************************************************************/
7094 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7097 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7099 if(drbSet->list.array)
7101 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7103 if(drbSet->list.array[arrIdx] != NULLP)
7107 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7108 FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7110 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7113 CU_FREE(drbSet->list.array, drbSet->list.size);
7119 /*******************************************************************
7121 * @brief Builds the DRB to be Setup Mod list
7125 * Function : BuildDrbToBeSetupModList
7127 * Functionality: Constructs the DRB to be Setup Mod list
7129 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7131 * @return ROK - success
7134 * ****************************************************************/
7136 uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7143 drbSet->list.count = drbCnt;
7144 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7145 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7146 if(drbSet->list.array == NULLP)
7148 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7151 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7153 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7154 if(drbSet->list.array[arrIdx] == NULLP)
7156 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
7162 ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7165 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7170 /*******************************************************************
7172 * @brief free the UeContextModification Request
7176 * Function : FreeUeContextModicationRequest
7178 * Functionality : deallocation of memory allocated in UeContextModiification
7181 * @params[in] F1AP_PDU_t *f1apMsg
7185 * ****************************************************************/
7186 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
7188 uint8_t arrIdx =0 , ieId=0;
7189 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
7193 if(f1apMsg->choice.initiatingMessage)
7195 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7196 if(UeContextModifyReq->protocolIEs.list.array)
7198 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
7200 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
7202 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
7205 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7207 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7209 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
7211 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
7212 choice.DRBs_ToBeSetupMod_List);
7216 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
7219 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
7221 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7223 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7226 /*******************************************************************
7228 * @brief Builds the Ue Context Modification Req
7232 * Function : BuildAndSendUeContextModificationReq
7234 * Functionality: Constructs the Ue Context Modification Req
7238 * @return ROK - success
7241 * ****************************************************************/
7242 uint8_t BuildAndSendUeContextModificationReq()
7245 uint8_t elementCnt = 0;
7246 uint8_t ret = RFAILED;
7247 F1AP_PDU_t *f1apMsg = NULLP;
7248 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
7250 asn_enc_rval_t encRetVal;
7251 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
7255 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7256 if(f1apMsg == NULLP)
7258 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7262 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7264 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7265 if(f1apMsg->choice.initiatingMessage == NULLP)
7267 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
7270 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
7271 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7272 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
7274 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
7277 ueContextModifyReq->protocolIEs.list.count = elementCnt;
7278 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
7280 /* Initialize the UE context modification members */
7281 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
7282 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
7284 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7288 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
7290 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
7291 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
7293 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
7300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7301 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7302 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
7303 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
7304 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
7307 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7308 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7309 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
7310 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
7311 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
7314 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
7315 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7316 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
7317 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
7318 ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
7319 value.choice.DRBs_ToBeSetupMod_List));
7324 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7326 /* Encode the F1SetupRequest type as APER */
7327 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7329 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7332 /* Encode results */
7333 if(encRetVal.encoded == ENCODE_FAIL)
7335 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
7336 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7341 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
7342 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
7344 DU_LOG("%x",encBuf[ieIdx]);
7348 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
7350 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
7358 FreeUeContextModicationRequest(f1apMsg);
7361 /*******************************************************************
7363 * @brief Handles received F1AP message and sends back response
7367 * Function : F1APMsgHdlr
7370 * - Decodes received F1AP control message
7371 * - Prepares response message, encodes and sends to SCTP
7374 * @return ROK - success
7377 * ****************************************************************/
7378 void F1APMsgHdlr(Buffer *mBuf)
7384 F1AP_PDU_t *f1apMsg = NULLP;
7385 asn_dec_rval_t rval; /* Decoder return value */
7386 F1AP_PDU_t f1apasnmsg ;
7388 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
7389 ODU_PRINT_MSG(mBuf, 0,0);
7391 /* Copy mBuf into char array to decode it */
7392 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7393 CU_ALLOC(recvBuf, (Size)recvBufLen);
7395 if(recvBuf == NULLP)
7397 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
7400 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7402 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
7406 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
7407 for(i=0; i< recvBufLen; i++)
7409 DU_LOG("%x",recvBuf[i]);
7412 /* Decoding flat buffer into F1AP messsage */
7413 f1apMsg = &f1apasnmsg;
7414 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
7416 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
7417 CU_FREE(recvBuf, (Size)recvBufLen);
7419 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7421 DU_LOG("\nERROR --> F1AP : ASN decode failed");
7425 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7427 switch(f1apMsg->present)
7429 case F1AP_PDU_PR_initiatingMessage:
7431 switch(f1apMsg->choice.initiatingMessage->value.present)
7433 case InitiatingMessage__value_PR_Reset:
7435 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
7436 BuildAndSendF1ResetAck();
7440 case InitiatingMessage__value_PR_F1SetupRequest:
7442 DU_LOG("\nINFO --> F1AP : F1 setup request received");
7443 BuildAndSendF1SetupRsp();
7447 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
7449 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
7450 BuildAndSendDUUpdateAck();
7451 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
7452 BuildAndSendF1ResetReq();
7455 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
7457 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
7458 procInitULRRCMsg(f1apMsg);
7461 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
7463 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
7464 procUlRrcMsg(f1apMsg);
7468 case InitiatingMessage__value_PR_RRCDeliveryReport:
7470 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
7473 case InitiatingMessage__value_PR_UEContextReleaseRequest:
7475 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
7480 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
7481 f1apMsg->choice.initiatingMessage->value.present);
7484 }/* End of switch(initiatingMessage) */
7488 case F1AP_PDU_PR_successfulOutcome:
7490 switch(f1apMsg->choice.successfulOutcome->value.present)
7492 case SuccessfulOutcome__value_PR_ResetAcknowledge:
7494 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
7497 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
7499 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
7500 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7503 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
7505 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
7510 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
7511 f1apMsg->choice.successfulOutcome->value.present);
7514 }/* End of switch(successfulOutcome) */
7519 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
7522 }/* End of switch(f1apMsg->present) */
7524 } /* End of F1APMsgHdlr */
7526 /**********************************************************************
7528 **********************************************************************/