1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "cu_stub_sctp.h"
23 #include "cu_stub_egtp.h"
24 #include "cu_f1ap_msg_hdl.h"
27 #include "BIT_STRING.h"
28 #include "odu_common_codec.h"
29 #include "ProtocolIE-Field.h"
30 #include "ProtocolExtensionField.h"
31 #include "ProtocolIE-SingleContainer.h"
33 #include "ModulationOrder.h"
35 #include "UE-CapabilityRAT-Container.h"
36 #include "UE-CapabilityRAT-ContainerList.h"
37 #include "UE-CapabilityRAT-ContainerListRRC.h"
38 #include "SupportedBandwidth.h"
39 #include "FeatureSetUplinkPerCC.h"
40 #include "FeatureSetDownlinkPerCC.h"
41 #include "FeatureSets.h"
42 #include "RF-Parameters.h"
43 #include "UE-NR-Capability.h"
44 #include "ProtocolExtensionContainer.h"
45 #include "CellGroupConfigRrc.h"
46 #include "MAC-CellGroupConfig.h"
47 #include "SchedulingRequestConfig.h"
48 #include "SchedulingRequestToAddMod.h"
49 #include "BSR-Config.h"
50 #include "TAG-Config.h"
52 #include "PHR-Config.h"
53 #include "RLC-Config.h"
54 #include "UL-AM-RLC.h"
55 #include "DL-AM-RLC.h"
56 #include "LogicalChannelConfig.h"
57 #include "RLC-BearerConfig.h"
58 #include "PhysicalCellGroupConfig.h"
59 #include "SpCellConfig.h"
60 #include "ServingCellConfig.h"
61 #include "ControlResourceSet.h"
62 #include "SearchSpace.h"
63 #include "PDCCH-Config.h"
64 #include "PDSCH-TimeDomainResourceAllocation.h"
65 #include "PDSCH-TimeDomainResourceAllocationList.h"
66 #include "DMRS-DownlinkConfig.h"
67 #include "PDSCH-Config.h"
68 #include "BWP-DownlinkDedicated.h"
69 #include "PUSCH-TimeDomainResourceAllocation.h"
70 #include "PUSCH-TimeDomainResourceAllocationList.h"
71 #include "DMRS-UplinkConfig.h"
72 #include "PUSCH-Config.h"
73 #include "SRS-ResourceId.h"
74 #include "SRS-Resource.h"
75 #include "SRS-ResourceSet.h"
76 #include "SRS-Config.h"
77 #include "PUCCH-Config.h"
78 #include "PUCCH-ResourceSet.h"
79 #include "PUCCH-Resource.h"
80 #include "PUCCH-format1.h"
81 #include "PUCCH-FormatConfig.h"
82 #include "BWP-UplinkDedicated.h"
83 #include "PUSCH-ServingCellConfig.h"
84 #include "UplinkConfig.h"
85 #include "PDSCH-ServingCellConfig.h"
86 #include "EUTRANQoS.h"
87 #include "GBR-QosInformation.h"
88 #include "DRBs-ToBeSetupMod-List.h"
89 #include "DRBs-ToBeSetupMod-Item.h"
90 #include "DRBs-Setup-Item.h"
91 #include "DLUPTNLInformation-ToBeSetup-List.h"
92 #include "DLUPTNLInformation-ToBeSetup-Item.h"
93 #include "UPTransportLayerInformation.h"
94 #include "GTPTunnel.h"
95 #include "QoSInformation.h"
96 #include "Cells-to-be-Activated-List.h"
97 #include "DL-CCCH-Message.h"
98 #include "SRB-ToAddModList.h"
99 #include "SRB-ToAddMod.h"
100 #include "RRCSetup-IEs.h"
101 #include "RRCSetup.h"
102 #include "DL-DCCH-Message.h"
103 #include "RRCReconfiguration-IEs.h"
104 #include "RRCReconfiguration.h"
105 #include "DRB-ToAddModList.h"
106 #include "DRB-ToAddMod.h"
107 #include "SDAP-Config.h"
109 /* MACRO for CUtoDURRCInformation */
110 #define CELL_GRP_ID 1
111 #define FREQ_DOM_RSRC_SIZE 6
112 #define CORESET0_END_PRB 48
113 #define CORESET1_NUM_PRB 24
114 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
115 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
116 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
117 #define PDCCH_SRCH_SPC_TWO_ID 2
119 #define SCRAMBLING_ID NR_PCI
120 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
121 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
122 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
123 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
124 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
125 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
126 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
127 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
128 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
130 /* MACRO Ddefine for PDSCH Configuration */
132 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
133 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
134 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
135 #define PDSCH_NUM_HARQ_PROC 5
136 #define PDSCH_MAPPING_TYPE_A 0
137 #define PDSCH_MAPPING_TYPE_B 1
139 /* MACRO Define for PUSCH Configuration */
140 #define PUSCH_K2_CFG1 1
141 #define PUSCH_K2_CFG2 2
142 #define PUSCH_START_SYMBOL 3
144 #define PUSCH_MSG3_DELTA_PREAMBLE 0
145 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
146 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
147 #define PUSCH_MAX_MIMO_LAYERS 1
148 #define PUSCH_PROCESS_TYPE2_ENABLED false
149 #define PUSCH_MAPPING_TYPE_A 0
150 #define PUSCH_MAPPING_TYPE_B 1
152 /* MACRO defines for SRC config */
153 #define SRS_RSRC_ID 1
154 #define SRS_RSET_ID 1
155 #define SRS_COMB_OFFSET_N2 0
156 #define SRS_CYCLIC_SHIFT_N2 0
157 #define SRS_FREQ_DOM_POS 0
158 #define SRS_FREQ_DOM_SHIFT 0
163 #define APERIODIC_SRS_RESRC_TRIGGER 1
165 /* Macro definitions for DUtoCuRrcContainer */
166 #define CELL_GRP_ID 1
168 #define SR_PROHIBIT_TMR 5
169 #define SR_TRANS_MAX 2
170 #define PERIODIC_BSR_TMR 2
171 #define RETX_BSR_TMR 5
172 #define SR_DELAY_TMR 6
174 #define TIME_ALIGNMENT_TMR 7
175 #define PHR_PERIODIC_TMR 7
176 #define PHR_PROHIBHIT_TMR 0
177 #define PHR_PWR_FACTOR_CHANGE 3
178 #define PHR_MODE_OTHER_CG 0
181 #define SN_FIELD_LEN 0
182 #define T_POLL_RETRANSMIT 8
185 #define MAX_RETX_THRESHOLD 5
186 #define T_REASSEMBLY 8
187 #define T_STATUS_PROHIBHIT 7
188 #define MAC_LC_PRIORITY 1
189 #define PRIORTISIED_BIT_RATE 15
190 #define BUCKET_SIZE_DURATION 5
193 #define PDSCH_HARQ_ACK_CODEBOOK 1
194 #define SERV_CELL_IDX 0
195 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
196 #define ACTIVE_DL_BWP_ID 0
197 #define ACTIVE_UL_BWP_ID 0
198 #define SCRAMBLING_ID NR_PCI
199 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
200 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
201 #define FIVE_QI_VALUE9 9 /*spec 23.501, Table 5.7.4-1*/
202 #define FIVE_QI_VALUE8 8 /*spec 23.501, Table 5.7.4-1*/
203 #define PDU_SESSION_ID_1 1
204 #define PDU_SESSION_ID_2 2
205 #define INVALID_PDU_SESSION_ID -1
207 /*******************************************************************
209 * @brief Sends F1 msg over SCTP
213 * Function : SendF1APMsg
215 * Functionality: Sends F1 msg over SCTP
217 * @params[in] Region region
219 * @return ROK - success
222 * ****************************************************************/
223 S16 SendF1APMsg(Region region, Pool pool, uint32_t duId)
225 Buffer *mBuf = NULLP;
227 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
229 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
231 ODU_PRINT_MSG(mBuf, 0,0);
233 if(sctpSend(duId, mBuf) != ROK)
235 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
236 ODU_PUT_MSG_BUF(mBuf);
242 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
243 ODU_PUT_MSG_BUF(mBuf);
246 ODU_PUT_MSG_BUF(mBuf);
250 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
257 /*******************************************************************
259 * @brief Builds NRCell ID
263 * Function : BuildNrCellId
265 * Functionality: Building the NR Cell ID
267 * @params[in] BIT_STRING_t *nrcell
268 * @return ROK - success
271 * ****************************************************************/
273 S16 BuildNrCellId(BIT_STRING_t *nrcell)
275 memset(nrcell->buf, 0, nrcell->size);
277 nrcell->bits_unused = 4;
278 nrcell->size = 5 * sizeof(uint8_t);
282 /********************************************************************
284 * @brief Builds and sends the F1SetupResponse
288 * Function : BuildAndSendF1SetupRsp
290 * Functionality: Constructs the F1SetupResponse message and sends
291 * it back to the DU through SCTP.
293 * @params[in] void **buf,Buffer to which encoded pattern is written into
294 * @params[in] int *size,size of buffer
296 * @return ROK - success
299 * ****************************************************************/
300 uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId)
303 uint8_t elementCnt,cellCnt;
304 F1AP_PDU_t *f1apMsg = NULL;
305 F1SetupResponse_t *f1SetupRsp;
306 GNB_CU_Name_t *cuName;
307 Cells_to_be_Activated_List_t *cellToActivate;
308 RRC_Version_t *rrcVer;
309 asn_enc_rval_t encRetVal;
310 DU_LOG("\nINFO --> F1AP : Building F1 Setup Response\n");
312 /* Allocate the memory for F1SetupRequest_t */
313 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
316 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
319 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
321 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
322 if(f1apMsg->choice.successfulOutcome == NULLP)
324 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
325 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
329 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
330 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
331 f1apMsg->choice.successfulOutcome->value.present = \
332 SuccessfulOutcome__value_PR_F1SetupResponse;
333 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
336 f1SetupRsp->protocolIEs.list.count = elementCnt;
337 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
339 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
340 elementCnt * sizeof(F1SetupResponseIEs_t *));
341 if(f1SetupRsp->protocolIEs.list.array == NULLP)
343 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResponseIEs failed");
344 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
345 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
349 for(idx=0; idx<elementCnt; idx++)
351 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
352 sizeof(F1SetupResponseIEs_t));
353 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
355 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
356 elementCnt * sizeof(F1SetupResponseIEs_t *));
357 CU_FREE(f1apMsg->choice.successfulOutcome, \
358 sizeof(SuccessfulOutcome_t));
359 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
366 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
367 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
368 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
369 F1SetupResponseIEs__value_PR_TransactionID;
370 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
375 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
376 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
377 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
378 F1SetupResponseIEs__value_PR_GNB_CU_Name;
379 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
380 cuName->size = sizeof(cuCb.cuCfgParams.cuName);
382 CU_ALLOC(cuName->buf, sizeof(cuName->size));
383 if(cuName->buf == NULLP)
385 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
387 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
388 sizeof(F1SetupResponseIEs_t));
390 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
391 elementCnt * sizeof(F1SetupResponseIEs_t *));
392 CU_FREE(f1apMsg->choice.successfulOutcome,\
393 sizeof(SuccessfulOutcome_t));
394 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
397 strcpy((char*)cuName->buf, (char*)cuCb.cuCfgParams.cuName);
399 /*Cells to be activated list*/
401 f1SetupRsp->protocolIEs.list.array[idx]->id = \
402 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
403 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
404 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
405 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
406 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
407 Cells_to_be_Activated_List;
409 cellToActivate->list.count = cellCnt;
410 cellToActivate->list.size = \
411 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
412 CU_ALLOC(cellToActivate->list.array,\
413 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
414 if(cellToActivate->list.array == NULLP)
416 CU_FREE(cuName->buf, sizeof(cuName->size));
417 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
419 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
420 sizeof(F1SetupResponseIEs_t));
422 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
423 elementCnt * sizeof(F1SetupResponseIEs_t *));
424 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
425 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
428 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
430 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
431 if(cellToActivate->list.array[ieIdx] == NULLP)
433 CU_FREE(cellToActivate->list.array,\
434 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
435 CU_FREE(cuName->buf, sizeof(cuName->size));
436 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
438 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
439 sizeof(F1SetupResponseIEs_t));
441 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
442 elementCnt * sizeof(F1SetupResponseIEs_t *));
443 CU_FREE(f1apMsg->choice.successfulOutcome, \
444 sizeof(SuccessfulOutcome_t));
445 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
449 cellToActivate->list.array[0]->id = \
450 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
451 cellToActivate->list.array[0]->criticality = Criticality_ignore;
452 cellToActivate->list.array[0]->value.present = \
453 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
454 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
455 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
456 CU_ALLOC(cellToActivate->list.array[0]->\
457 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
459 if(cellToActivate->list.array[0]->value.choice.\
460 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
463 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
465 CU_FREE(cellToActivate->list.array[ieIdx],\
466 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
469 CU_FREE(cellToActivate->list.array,\
470 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
471 CU_FREE(cuName->buf, sizeof(cuName->size));
472 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
474 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
475 sizeof(F1SetupResponseIEs_t));
477 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
478 elementCnt * sizeof(F1SetupResponseIEs_t *));
479 CU_FREE(f1apMsg->choice.successfulOutcome, \
480 sizeof(SuccessfulOutcome_t));
481 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
484 buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
485 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
486 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
487 nRCGI.nRCellIdentity.size = 5;
488 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
489 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
491 if(cellToActivate->list.array[0]->value.choice.\
492 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
494 CU_FREE(cellToActivate->list.array[0]->\
495 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
497 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
499 CU_FREE(cellToActivate->list.array[ieIdx],\
500 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
503 CU_FREE(cellToActivate->list.array,\
504 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
505 CU_FREE(cuName->buf, sizeof(cuName->size));
506 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
508 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
509 sizeof(F1SetupResponseIEs_t));
511 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
512 elementCnt * sizeof(F1SetupResponseIEs_t *));
513 CU_FREE(f1apMsg->choice.successfulOutcome, \
514 sizeof(SuccessfulOutcome_t));
515 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
518 memcpy(&cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity, nrcellId, sizeof(BIT_STRING_t));
521 f1SetupRsp->protocolIEs.list.array[idx]->id = \
522 ProtocolIE_ID_id_GNB_CU_RRC_Version;
523 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
524 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
525 F1SetupResponseIEs__value_PR_RRC_Version;
526 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
527 rrcVer->latest_RRC_Version.size = RRC_SIZE;
529 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
530 if(rrcVer->latest_RRC_Version.buf == NULLP)
532 CU_FREE(cuName->buf, sizeof(cuName->size));
533 for(ieIdx=0; ieIdx<elementCnt; idx++)
535 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
536 sizeof(F1SetupResponseIEs_t));
538 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
539 elementCnt * sizeof(F1SetupResponseIEs_t *));
540 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
541 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
545 /* Need to check RRC Version */
546 rrcVer->latest_RRC_Version.buf[0] = cuCb.cuCfgParams.rrcVersion.rrcVer;
547 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
548 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
549 if(rrcVer->iE_Extensions == NULLP)
551 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
552 CU_FREE(cuName->buf, sizeof(cuName->size));
553 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
555 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
556 sizeof(F1SetupResponseIEs_t));
558 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
559 elementCnt * sizeof(F1SetupResponseIEs_t *));
560 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
561 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
564 rrcVer->iE_Extensions->list.count = 1;
565 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
566 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
567 sizeof(struct RRC_Version_ExtIEs *));
568 if(rrcVer->iE_Extensions->list.array == NULLP)
570 CU_FREE(rrcVer->iE_Extensions,\
571 sizeof(ProtocolExtensionContainer_4624P81_t));
572 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
573 CU_FREE(cuName->buf, sizeof(cuName->size));
574 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
576 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
577 sizeof(F1SetupResponseIEs_t));
579 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
580 elementCnt * sizeof(F1SetupResponseIEs_t *));
581 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
582 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
585 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
586 sizeof(struct RRC_Version_ExtIEs));
587 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
589 CU_FREE(rrcVer->iE_Extensions->list.array,\
590 sizeof(struct RRC_Version_ExtIEs *));
591 CU_FREE(rrcVer->iE_Extensions,\
592 sizeof(ProtocolExtensionContainer_4624P81_t));
593 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
594 CU_FREE(cuName->buf, sizeof(cuName->size));
595 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
597 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
598 sizeof(F1SetupResponseIEs_t));
600 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
601 elementCnt * sizeof(F1SetupResponseIEs_t *));
602 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
603 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
606 rrcVer->iE_Extensions->list.array[0]->id = \
607 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
608 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
609 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
610 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
611 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
612 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
613 CU_ALLOC(rrcVer->iE_Extensions->list.\
614 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
616 if(rrcVer->iE_Extensions->list.\
617 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
619 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
620 sizeof(struct RRC_Version_ExtIEs));
621 CU_FREE(rrcVer->iE_Extensions->list.array,\
622 sizeof(struct RRC_Version_ExtIEs *));
623 CU_FREE(rrcVer->iE_Extensions,\
624 sizeof(ProtocolExtensionContainer_4624P81_t));
625 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
626 CU_FREE(cuName->buf, sizeof(cuName->size));
627 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
629 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
630 sizeof(F1SetupResponseIEs_t));
632 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
633 elementCnt * sizeof(F1SetupResponseIEs_t *));
634 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
635 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
638 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
639 Latest_RRC_Version_Enhanced.buf[0] = 0;
640 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
641 Latest_RRC_Version_Enhanced.buf[1] = 5;
642 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
643 Latest_RRC_Version_Enhanced.buf[2] = 15;
645 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
647 /* Encode the F1SetupRequest type as UPER */
648 memset(encBuf, 0, ENC_BUF_MAX_LEN);
650 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
653 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
654 CU_FREE(cuName->buf, sizeof(cuName->size));
655 for(idx=0; idx<elementCnt; idx++)
657 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
659 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
660 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
661 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
663 /* Check encode results */
664 if(encRetVal.encoded == ENCODE_FAIL)
666 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
667 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
672 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupResponse\n");
673 for(int i=0; i< encBufSize; i++)
675 DU_LOG("%x",encBuf[i]);
680 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
682 DU_LOG("\nERROR --> F1AP : Sending F1 Setup Response failed");
687 }/* End of BuildAndSendF1SetupRsp */
689 /*******************************************************************
691 * @brief Builds and sends the DUUpdateAcknowledge
695 * Function : BuildAndSendDUUpdateAck
697 * Functionality: Constructs the DU Update Acknowledge message and sends
698 * it to the DU through SCTP.
702 * @return ROK - success
705 * ****************************************************************/
707 uint8_t BuildAndSendDUUpdateAck(uint32_t duId)
711 F1AP_PDU_t *f1apMsg = NULL;
712 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
713 asn_enc_rval_t enRetVal; /* Encoder return value */
715 DU_LOG("\nINFO --> F1AP : Building GNB-DU Config Update Ack\n");
717 /* Allocate the memory for F1SetupRequest_t */
718 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
721 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
725 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
727 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
728 if(f1apMsg->choice.successfulOutcome == NULLP)
730 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
731 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
735 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
736 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
737 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
738 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
741 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
742 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
744 /* Initialize the F1Setup members */
745 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
746 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
748 DU_LOG("\nERROR --> F1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
749 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
750 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
754 for(idx=0; idx<elementCnt; idx++)
756 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
757 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
759 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
760 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
761 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
768 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
769 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
770 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
771 GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
772 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
774 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
776 /* Encode the F1SetupRequest type as UPER */
777 memset(encBuf, 0, ENC_BUF_MAX_LEN);
779 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
782 for(idx=0; idx<elementCnt; idx++)
784 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
786 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
787 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
788 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
790 /* Checking encode results */
791 if(enRetVal.encoded == ENCODE_FAIL)
793 DU_LOG("\nERROR --> F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
794 enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
799 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
800 for(int i=0; i< encBufSize; i++)
802 DU_LOG("%x",encBuf[i]);
807 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
808 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
810 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update Ack failed");
816 }/* End of BuildAndSendDUUpdateAck*/
818 /*******************************************************************
820 * @brief deallocating the memory of F1reset msg
824 * Function : FreeF1ResetReq
827 * - freeing memory of F1reset request msg
833 * ****************************************************************/
834 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
837 Reset_t *f1ResetMsg = NULLP;
841 if(f1apMsg->choice.initiatingMessage)
843 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
844 if(f1ResetMsg->protocolIEs.list.array)
846 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
848 if(f1ResetMsg->protocolIEs.list.array[idx])
850 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
853 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
855 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
857 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
860 /*******************************************************************
862 * @brief build ansld ans send f1reset msg
866 * Function : BuildAndSendF1ResetReq
868 * Functionality: build and send f1reset msg
870 * @return ROK - success
873 * ****************************************************************/
874 uint8_t BuildAndSendF1ResetReq()
876 uint8_t elementCnt=0;
878 uint8_t ret= RFAILED;
879 Reset_t *f1ResetMsg = NULLP;
880 F1AP_PDU_t *f1apMsg = NULLP;
881 asn_enc_rval_t encRetVal;
882 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
885 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
888 DU_LOG("\nERROR --> F1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
891 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
892 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
893 if(f1apMsg->choice.initiatingMessage == NULLP)
895 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendF1ResetReq failed");
898 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
899 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
900 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
902 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
905 f1ResetMsg->protocolIEs.list.count = elementCnt;
906 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
908 /* Initialize the F1Reset members */
909 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
910 if(f1ResetMsg->protocolIEs.list.array == NULLP)
912 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq");
915 for(idx=0; idx<elementCnt; idx++)
917 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
918 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
920 DU_LOG("\nERROR --> F1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
927 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
928 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
929 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
930 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
934 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
935 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
936 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
937 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
938 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
942 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
943 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
944 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
945 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
946 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
948 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
950 /* Encode the F1SetupRequest type as APER */
951 memset(encBuf, 0, ENC_BUF_MAX_LEN);
953 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
957 if(encRetVal.encoded == ENCODE_FAIL)
959 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
960 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
965 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
966 for(idx=0; idx< encBufSize; idx++)
968 DU_LOG("%x",encBuf[idx]);
972 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
973 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
975 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
983 FreeF1ResetReq(f1apMsg);
987 /*******************************************************************
989 * @brief Fills Radio Bearer Config
993 * Function : fillSrbCfg
995 * Functionality: Fills Radio Bearer Config
997 * @params[in] SRB_ToAddModList *
999 * @return ROK - success
1002 * ****************************************************************/
1003 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
1007 if(bearerCfg != NULLP)
1010 bearerCfg->list.count = elementCnt;
1011 bearerCfg->list.size =\
1012 elementCnt * sizeof(SRB_ToAddMod_t *);
1013 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
1014 if(bearerCfg->list.array != NULLP)
1016 for(idx = 0; idx < elementCnt; idx++)
1018 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
1019 if(bearerCfg->list.array[idx] == NULLP)
1021 for(ieId = 0; ieId < idx; ieId++)
1023 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
1025 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
1035 bearerCfg->list.array[idx]->srb_Identity = srbId;
1040 /*******************************************************************
1042 * @brief Fills Master CellGroup Info
1046 * Function : fillMasterCellGroup
1048 * Functionality: Fills Master Cell Group IE
1050 * @params[in] RRCSetup_IEs_t *
1052 * @return ROK - success
1055 * ****************************************************************/
1057 uint8_t fillMasterCellGroup(CuUeCb *ueCb, OCTET_STRING_t *masterCellGroup)
1060 masterCellGroup->buf = NULLP;
1061 if(ueCb->f1apMsgDb.duToCuContainer.buf)
1063 masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
1064 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1065 if(masterCellGroup->buf != NULLP)
1067 memcpy(masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, masterCellGroup->size);
1071 DU_LOG( "\nERROR --> F1AP : Master Cell Group buffer is NULL");
1082 /*******************************************************************
1084 * @brief Fills RRC setup IE
1088 * Function : fillRRCSetupIE
1090 * Functionality: Fills RRC Setup IE
1092 * @params[in] RRCSetup_IEs_t *
1094 * @return ROK - success
1097 * ****************************************************************/
1099 uint8_t fillRRCSetupIE(CuUeCb *ueCb, RRCSetup_IEs_t *rrcSetupIE)
1104 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1105 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1107 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1111 ret = fillMasterCellGroup(ueCb, &rrcSetupIE->masterCellGroup);
1115 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1121 /*******************************************************************
1123 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1127 * Function : fillDlCcchRrcMsg
1129 * Functionality: Fills DL DCCCH Message required for
1130 * DLRRCMessageTransfer
1132 * @params[in] RRCContainer_t *rrcContainer
1134 * @return ROK - success
1137 * ****************************************************************/
1139 uint8_t fillDlCcchRrcMsg(CuUeCb *ueCb, RRCContainer_t *rrcContainer)
1143 DL_CCCH_Message_t dl_CCCH_Msg;
1144 asn_enc_rval_t encRetVal;
1146 if(rrcContainer != NULLP)
1148 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1150 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1151 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1153 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1154 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1155 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1157 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1158 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.present = \
1159 RRCSetup__criticalExtensions_PR_rrcSetup;
1161 /* Fill RRC Setup IE */
1162 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup, \
1163 sizeof(RRCSetup_IEs_t));
1164 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup != NULLP)
1166 ret = fillRRCSetupIE(ueCb, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup);
1170 /* encode DL-CCCH message into RRC Container */
1171 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1172 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1174 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1175 /* Encode results */
1176 if(encRetVal.encoded == ENCODE_FAIL)
1178 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1179 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1184 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1185 for(int i = 0; i< encBufSize; i++)
1187 DU_LOG("%x",encBuf[i]);
1189 rrcContainer->size = encBufSize;
1190 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1191 if(rrcContainer->buf != NULLP)
1193 memset(rrcContainer->buf, 0, encBufSize);
1194 for(idx2 = 0; idx2 < encBufSize; idx2++)
1196 rrcContainer->buf[idx2] = encBuf[idx2];
1208 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1214 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1220 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1226 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1231 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1233 uint8_t idx, ied, elementCnt;
1236 qosFlow->list.count = elementCnt;
1237 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1238 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1239 if(qosFlow->list.array != NULLP)
1241 for(idx = 0; idx < elementCnt; idx++)
1243 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1244 if(qosFlow->list.array[idx] == NULLP)
1246 for(ied = 0; ied < idx; ied++)
1248 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1250 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1256 *qosFlow->list.array[idx] = 9;
1260 /*******************************************************************
1262 * @brief Fills CN Assoc for Drb to Add/Mod List
1266 * Function : fillCnAssoc
1268 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1270 * @params[in] struct DRB_ToAddMod__cnAssociation *
1272 * @return ROK - success
1275 * ****************************************************************/
1277 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1281 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1282 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1284 cnAssoc->choice.eps_BearerIdentity = 5;
1286 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1288 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1289 if(cnAssoc->choice.sdap_Config)
1291 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1292 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1293 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1294 cnAssoc->choice.sdap_Config->defaultDRB = true;
1295 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1296 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1297 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1298 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1299 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1301 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1305 DU_LOG("\nERROR --> F1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1306 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1312 DU_LOG("\nERROR --> F1AP: Mem alloc failed at fillCnAssoc()");
1319 /*******************************************************************
1321 * @brief Fills Radio Bearer Config for Drb
1325 * Function : fillDrbCfg
1327 * Functionality: Fills Radio Bearer Config for Drb
1329 * @params[in] drbId, DRB_ToAddModList *
1331 * @return ROK - success
1334 * ****************************************************************/
1335 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1337 uint8_t idx, ied, ret, elementCnt;
1343 drbCfg->list.count = elementCnt;
1344 drbCfg->list.size =\
1345 elementCnt * sizeof(DRB_ToAddMod_t *);
1346 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1347 if(drbCfg->list.array != NULLP)
1349 for(idx = 0; idx < elementCnt; idx++)
1351 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1352 if(drbCfg->list.array[idx] == NULLP)
1354 for(ied = 0; ied < idx; ied++)
1356 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1358 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1368 /* CN ASSOCIATION */
1369 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1370 if(drbCfg->list.array[idx]->cnAssociation)
1372 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1375 drbCfg->list.array[idx]->drb_Identity = drbId;
1380 /*******************************************************************
1382 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1386 * Function : fillRrcReconfigIE
1388 * Functionality: Fills RRC Reconfig Message required for
1389 * DLRRCMessageTransfer
1391 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1393 * @return ROK - success
1396 * ****************************************************************/
1398 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1401 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1402 if(rrcReconfigMsg->radioBearerConfig)
1404 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1405 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1407 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1412 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1413 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1415 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1418 DU_LOG("\nERROR --> F1AP : Failed to fill DrbCfg at fillRrcReconfigIE()");
1419 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1420 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1426 DU_LOG("\nERROR --> F1AP : memory Alloc failed at fillRrcReconfigIE()");
1427 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1433 /*******************************************************************
1435 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1439 * Function : fillDlDcchRrcMsg
1441 * Functionality: Fills DL DCCH Message required for
1442 * DLRRCMessageTransfer
1444 * @params[in] RRCContainer_t *rrcContainer
1446 * @return ROK - success
1449 * ****************************************************************/
1451 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1455 DL_DCCH_Message_t dl_DCCH_Msg;
1456 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1457 asn_enc_rval_t encRetVal;
1459 if(rrcContainer != NULLP)
1461 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1463 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1464 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1466 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1467 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1468 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1470 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1471 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1472 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1473 /* Fill RRC Reconfig IE */
1474 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1475 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1476 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1477 criticalExtensions.choice.rrcReconfiguration != NULLP)
1479 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1480 criticalExtensions.choice.rrcReconfiguration);
1484 /* encode DL-DCCH message into RRC Container */
1485 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1486 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1488 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1489 /* Encode results */
1490 if(encRetVal.encoded == ENCODE_FAIL)
1492 DU_LOG( "\nERROR --> F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1493 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1498 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1499 for(int i = 0; i< encBufSize; i++)
1501 DU_LOG("%x",encBuf[i]);
1503 rrcContainer->size = encBufSize;
1504 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1505 if(rrcContainer->buf != NULLP)
1507 memset(rrcContainer->buf, 0, encBufSize);
1508 for(idx2 = 0; idx2 < encBufSize; idx2++)
1510 rrcContainer->buf[idx2] = encBuf[idx2];
1517 DU_LOG("\nERROR --> F1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1522 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1528 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1534 DU_LOG("\nERROR --> F1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1540 DU_LOG("\nERROR --> F1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1546 /*******************************************************************
1548 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1552 * Function : BuildDLRRCContainer
1554 * Functionality: Builds RRC Container IE required for
1555 * DLRRCMessageTransfer
1559 * @return ROK - success
1562 * ****************************************************************/
1564 uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1566 uint8_t ret, bufLen;
1569 if(rrcMsgType == RRC_SETUP)
1571 ret = fillDlCcchRrcMsg(ueCb, rrcContainer);
1573 DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1575 else if(rrcMsgType == REGISTRATION_ACCEPT)
1577 /*Hardcoded RRC Container from reference logs*/
1578 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1580 rrcContainer->size = bufLen;
1581 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1582 if(rrcContainer->buf != NULLP)
1584 memset(rrcContainer->buf, 0, bufLen);
1585 memcpy(rrcContainer->buf, buf, bufLen);
1589 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1593 else if(rrcMsgType == RRC_RECONFIG)
1595 /*Hardcoded RRC Container from reference logs*/
1597 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1598 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1599 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1600 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1601 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1602 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1603 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1604 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1605 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1606 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1607 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1608 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1609 0x00, 0x00, 0x00, 0x00};
1611 rrcContainer->size = bufLen;
1612 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1613 if(rrcContainer->buf != NULLP)
1615 memset(rrcContainer->buf, 0, bufLen);
1616 memcpy(rrcContainer->buf, buf, bufLen);
1620 DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer");
1628 /*******************************************************************
1630 * @brief Frees the DLRRCMessageTransfer
1634 * Function : freeDlRrcMessageTransfer
1636 * Functionality: Frees the DLRRCMessageTransfer
1640 * @return ROK - success
1643 * ****************************************************************/
1644 void freeDlRrcMessageTransfer(F1AP_PDU_t *f1apMsg)
1647 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1651 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1652 if(dlRRCMsg->protocolIEs.list.array)
1655 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
1656 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
1657 for(idx=0; idx<dlRRCMsg->protocolIEs.list.count; idx++)
1659 CU_FREE(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1661 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1663 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1667 /*******************************************************************
1669 * @brief Builds and sends the DLRRCMessageTransfer
1673 * Function : BuildAndSendDLRRCMessageTransfer
1675 * Functionality: Constructs the DL RRC Message Transfer and sends
1676 * it to the CU through SCTP.
1680 * @return ROK - success
1683 * ****************************************************************/
1684 uint8_t BuildAndSendDLRRCMessageTransfer(uint32_t duId, CuUeCb *ueCb, uint8_t srbId, uint8_t rrcMsgType)
1686 uint8_t elementCnt = 0;
1689 F1AP_PDU_t *f1apMsg = NULLP;
1690 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1691 asn_enc_rval_t encRetVal; /* Encoder return value */
1693 DU_LOG("\nINFO --> F1AP : Building DL RRC Message Transfer Message\n");
1695 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1696 if(f1apMsg == NULLP)
1698 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1702 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1703 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1704 if(f1apMsg->choice.initiatingMessage == NULLP)
1706 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
1707 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1711 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1712 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1713 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1714 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1717 dlRRCMsg->protocolIEs.list.count = elementCnt;
1718 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1720 /* Initialize the F1Setup members */
1721 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1722 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1724 DU_LOG("\nERROR --> F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1725 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1726 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1730 for(idx=0; idx<elementCnt; idx++)
1732 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1733 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1735 for(ieId=0; ieId<idx; ieId++)
1737 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId], sizeof(DLRRCMessageTransferIEs_t));
1739 CU_FREE(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1740 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1741 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1746 /* GNB CU UE F1AP ID */
1748 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1749 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1750 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1751 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
1753 /* GNB DU UE F1AP ID */
1755 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1756 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1757 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1758 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;;
1762 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1763 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1764 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_SRBID;
1765 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1769 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1770 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1771 dlRRCMsg->protocolIEs.list.array[idx]->value.present = DLRRCMessageTransferIEs__value_PR_RRCContainer;
1772 BuildDLRRCContainer(ueCb, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1774 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1776 /* Encode the F1SetupRequest type as APER */
1777 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1779 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1781 /* Encode results */
1782 if(encRetVal.encoded == ENCODE_FAIL)
1784 DU_LOG( "\nERROR --> F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1785 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1790 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1791 for(int i=0; i< encBufSize; i++)
1793 DU_LOG("%x",encBuf[i]);
1798 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL, duId) != ROK)
1800 DU_LOG("\nERROR --> F1AP : Sending DL RRC Message Transfer Failed");
1803 freeDlRrcMessageTransfer(f1apMsg);
1805 }/* End of BuildAndSendDLRRCMessageTransfer */
1807 /*******************************************************************
1809 * @brief Function to set the Dl RRC Msg Type
1813 * Function : setDlRRCMsgType
1815 * Functionality: Constructs the UE Setup Response and sends
1816 * it to the DU through SCTP.
1820 * @return ROK - success
1823 * ****************************************************************/
1825 uint8_t setDlRRCMsgType(CuUeCb *ueCb)
1827 uint8_t rrcMsgType = 0;
1828 switch(ueCb->f1apMsgDb.dlRrcMsgCount)
1831 rrcMsgType = RRC_SETUP;
1833 case REGISTRATION_ACCEPT:
1834 rrcMsgType = REGISTRATION_ACCEPT;
1836 case UE_CONTEXT_SETUP_REQ:
1837 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1839 case SECURITY_MODE_COMPLETE:
1840 rrcMsgType = SECURITY_MODE_COMPLETE;
1843 rrcMsgType = RRC_RECONFIG;
1845 case RRC_RECONFIG_COMPLETE:
1846 rrcMsgType = RRC_RECONFIG_COMPLETE;
1848 case UE_CONTEXT_MOD_REQ:
1849 rrcMsgType = UE_CONTEXT_MOD_REQ;
1857 /*******************************************************************
1859 * @brief Function to build Initial UL RRC Message
1863 * Function : procInitULRRCMsg
1865 * Functionality: Function to build Initial UL RRC Message
1869 * @return ROK - success
1872 * ****************************************************************/
1874 uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
1876 uint8_t idx,cellIdx=0, duIdx=0, rrcMsgType, gnbDuUeF1apId;
1878 uint32_t nrCellId, crnti;
1882 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1884 DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg");
1886 SEARCH_DU_DB(duIdx, duId, duDb);
1887 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1889 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1891 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1893 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1894 gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
1897 case ProtocolIE_ID_id_NRCGI:
1898 nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >>
1899 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused;
1900 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
1905 case ProtocolIE_ID_id_C_RNTI:
1906 crnti = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI;
1907 if(duDb->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == 0)
1909 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
1910 memset(ueCb, 0, sizeof(CuUeCb));
1911 ueCb->cellCb = cellCb;
1912 ueCb->crnti = crnti;
1913 ueCb->gnbDuUeF1apId = gnbDuUeF1apId;
1914 ueCb->gnbCuUeF1apId = ++cuCb.gnbCuUeF1apIdGenerator;
1915 ueCb->state = UE_ATTACH_IN_PROGRESS;
1918 cellCb->ueCb[cellCb->numUe] = ueCb;
1923 case ProtocolIE_ID_id_RRCContainer:
1926 case ProtocolIE_ID_id_DUtoCURRCContainer:
1928 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size > 0) && \
1929 (initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1931 DU_LOG("\nINFO --> Received Du to Cu RRC Container ");
1932 ueCb->f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.size;
1933 CU_ALLOC(ueCb->f1apMsgDb.duToCuContainer.buf, ueCb->f1apMsgDb.duToCuContainer.size);
1934 if(ueCb->f1apMsgDb.duToCuContainer.buf != NULLP)
1936 memcpy(ueCb->f1apMsgDb.duToCuContainer.buf, \
1937 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.DUtoCURRCContainer.buf, \
1938 ueCb->f1apMsgDb.duToCuContainer.size);
1943 DU_LOG("\nERROR --> Failed to receive Du to Cu RRC Container ");
1950 DU_LOG("\nERROR --> Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1957 ueCb->f1apMsgDb.dlRrcMsgCount++;
1958 rrcMsgType = setDlRRCMsgType(ueCb);
1959 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB0, rrcMsgType);
1964 /*******************************************************************
1966 * @brief Builds Nrcgi
1970 * Function : BuildNrcgi
1972 * Functionality: Building the PLMN ID and NR Cell id
1974 * @params[in] NRCGI_t *nrcgi
1975 * @return ROK - success
1978 * ****************************************************************/
1979 uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint32_t nrCellId)
1982 uint8_t unused_bits = 4;
1983 uint8_t byteSize = 5;
1984 uint8_t val = nrCellId << unused_bits;
1986 /* Allocate Buffer Memory */
1987 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1988 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1989 if(nrcgi->pLMN_Identity.buf == NULLP)
1993 ret = buildPlmnId(cuCb.cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1999 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
2000 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2001 if(nrcgi->nRCellIdentity.buf == NULLP)
2005 fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
2009 /*******************************************************************
2011 * @brief Builds Special cell list for UE Setup Request
2015 * Function : BuildSplCellList
2017 * Functionality: Constructs the Special Cell list for UESetReq
2019 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2021 * @return ROK - success
2024 * ****************************************************************/
2025 uint8_t BuildSplCellList(CuUeCb *ueCb, SCell_ToBeSetup_List_t *spCellLst)
2031 spCellLst->list.count = cellCnt;
2032 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2033 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2034 if(spCellLst->list.array == NULLP)
2038 for(idx=0; idx<cellCnt; idx++)
2040 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2041 if(spCellLst->list.array[idx] == NULLP)
2047 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2048 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2049 spCellLst->list.array[idx]->value.present = SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2051 /* Special Cell ID -NRCGI */
2052 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID, ueCb->cellCb->nrCellId);
2057 /*Special Cell Index*/
2058 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2060 }/* End of BuildSplCellList*/
2062 /*******************************************************************
2064 * @brief Builds SRBS to be setup
2068 * Function : BuildSRBSetup
2070 * Functionality: Constructs the SRB's for UESetReq
2072 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2074 * @return ROK - success
2077 * ****************************************************************/
2078 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2084 srbSet->list.count = srbCnt;
2085 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2086 CU_ALLOC(srbSet->list.array,srbSet->list.size);
2087 if(srbSet->list.array == NULLP)
2092 for(idx=0; idx<srbCnt; idx++)
2094 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2095 if(srbSet->list.array[idx] == NULLP)
2102 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2103 srbSet->list.array[idx]->criticality = Criticality_ignore;
2104 srbSet->list.array[idx]->value.present = SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2105 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2107 }/* End of BuildSRBSetup*/
2109 /*******************************************************************
2111 * @brief Builds QOS Info for DRB Setum Item
2115 * Function : BuildQOSInfo
2117 * Functionality: Constructs the QOS Info for DRB Setup Item
2119 * @params[in] QoSInformation_t *qosinfo
2120 * int16_t pduSessionID
2122 * @return ROK - success
2125 * ****************************************************************/
2126 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
2127 int16_t pduSessionID)
2129 uint8_t elementCnt = 0, qosCntIdx = 0;
2130 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2132 /* NonDynamic5QIDescriptor */
2133 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2134 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2135 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2140 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
2141 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
2143 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
2146 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2147 sizeof(AveragingWindow_t));
2148 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2153 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2154 /*MaxDataBurstVolume*/
2155 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2156 sizeof(MaxDataBurstVolume_t));
2157 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2162 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2164 /*nRGRAN Allocation Retention Priority*/
2165 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_lowest;
2166 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2167 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2169 /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
2170 if(pduSessionID <= INVALID_PDU_SESSION_ID)
2172 DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID");
2176 CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2177 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2181 elementCnt = NUM_QOS_EXT;
2182 qosIeExt->list.count = elementCnt;
2183 qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
2185 /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
2186 CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
2188 if(qosIeExt->list.array == NULLP)
2190 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
2194 for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
2196 CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2197 if(qosIeExt->list.array[qosCntIdx] == NULLP)
2199 DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
2202 /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
2203 qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
2204 /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
2205 qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore;
2206 qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
2207 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
2208 qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
2213 DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed");
2218 }/*End of BuildQOSInfo*/
2220 /*******************************************************************
2222 * @brief Builds SNSSAI
2226 * Function : BuildSNSSAI
2228 * Functionality: Constructs the SNSSAI For DRB list
2230 * @params[in] SNSSAI_t *snssai
2231 * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied
2233 * @return ROK - success
2236 * ****************************************************************/
2237 uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
2241 snssai->sST.size = sizeof(uint8_t);
2242 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2243 if(snssai->sST.buf == NULLP)
2247 memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
2249 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2250 if(snssai->sD == NULLP)
2254 snssai->sD->size = 3*sizeof(uint8_t);
2255 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2256 if(snssai->sD->buf == NULLP)
2260 memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
2262 }/*End of BuildSNSSAI*/
2264 /*******************************************************************
2266 * @brief Builds the flow map.
2270 * Function : BuildFlowsMap
2272 * Functionality: Constructs the flowmap For DRB list
2274 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2276 * @return ROK - success
2279 * ****************************************************************/
2280 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
2282 uint8_t ret = ROK, idx = 0, flowCnt = 0;
2285 flowMap->list.count = flowCnt;
2286 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2287 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2288 if(flowMap->list.array == NULLP)
2290 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()");
2293 for(idx=0; idx<flowCnt; idx++)
2295 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2296 if(flowMap->list.array[idx] == NULLP)
2298 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
2303 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2304 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
2305 actionType, INVALID_PDU_SESSION_ID);
2308 DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()");
2312 }/*End of BuildFlowsMap*/
2314 /*******************************************************************
2316 * @brief Builds the Uplink Tunnel Info
2320 * Function : BuildULTnlInfo
2322 * Functionality: Constructs the UL TnlInfo For DRB list
2324 * @params[in] UPTNLInformation_ToBeSetup_List_t *ulInfo
2326 * @return ROK - success
2329 * ****************************************************************/
2330 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2335 ulInfo->list.count = ulCnt;
2336 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2337 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2338 if(ulInfo->list.array == NULLP)
2340 DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()");
2343 for(idx=0; idx<ulCnt; idx++)
2345 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2346 if(ulInfo->list.array[idx] == NULLP)
2348 DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
2353 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2354 UPTransportLayerInformation_PR_gTPTunnel;
2356 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2357 sizeof(GTPTunnel_t));
2358 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2360 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
2363 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2364 transportLayerAddress.size = 4*sizeof(uint8_t);
2365 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2366 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2367 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2368 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2369 transportLayerAddress.buf == NULLP)
2371 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
2374 /* NOTE: Below IP address must be changed if running on different IP configuration */
2375 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2376 transportLayerAddress.buf[0] = 192;
2377 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2378 transportLayerAddress.buf[1] = 168;
2379 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2380 transportLayerAddress.buf[2] = 130;
2381 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2382 transportLayerAddress.buf[3] = 82;
2383 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2384 transportLayerAddress.bits_unused = 0;
2386 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2387 = 4 * sizeof(uint8_t);
2388 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2389 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2390 gTPTunnel->gTP_TEID.size);
2391 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2394 DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
2397 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2398 gTP_TEID.buf[0] = 0;
2399 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2400 gTP_TEID.buf[1] = 0;
2401 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2402 gTP_TEID.buf[2] = 0;
2403 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2404 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
2407 }/*End of BuildULTnlInfo*/
2409 /*******************************************************************
2411 * @brief Builds DRBS to be setup
2415 * Function : BuildDRBSetup
2417 * Functionality: Constructs the DRB's for UESetReq
2419 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2421 * @return ROK - success
2424 * ****************************************************************/
2425 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2427 uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
2428 uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
2429 DRBs_ToBeSetup_Item_t *drbSetItem;
2431 drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
2432 drbSet->list.count = drbCnt;
2433 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2434 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2435 if(drbSet->list.array == NULLP)
2437 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup");
2440 for(idx=0; idx<drbCnt; idx++)
2442 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2443 if(drbSet->list.array[idx] == NULLP)
2445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
2449 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2450 drbSet->list.array[idx]->criticality = Criticality_ignore;
2451 drbSet->list.array[idx]->value.present = \
2452 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2453 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2455 drbSetItem->dRBID = idx + 1;
2457 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2458 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2459 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2461 DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
2464 drbSetItem->qoSInformation.choice.choice_extension->id = \
2465 ProtocolIE_ID_id_DRB_Information;
2466 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2468 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2469 QoSInformation_ExtIEs__value_PR_DRB_Information;
2470 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2471 choice_extension->value.choice.DRB_Information.dRB_QoS,\
2472 ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
2473 if(BuildQOSInforet != ROK)
2475 DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup");
2479 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2480 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0]);
2481 if(BuildSNSSAIret != ROK)
2483 DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
2486 /*Flows mapped to DRB List*/
2487 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2488 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
2489 ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
2490 if(BuildFlowsMapret != ROK)
2492 DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup");
2495 /*ULUPTNLInformation To Be Setup List*/
2496 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2497 if(BuildULTnlInforet != ROK)
2499 DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup");
2503 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2506 }/* End of BuildDRBSetup*/
2508 /*******************************************************************
2510 * @brief Deallocating memory of function BuildAndSendUESetReq
2514 * Function : FreeNrcgi
2516 * Functionality: Deallocating memory for function BuildNrcgi
2518 * @params[in] NRCGI_t *nrcgi
2522 *******************************************************************/
2523 void FreeNrcgi(NRCGI_t *nrcgi)
2525 if(nrcgi->pLMN_Identity.buf != NULLP)
2527 if(nrcgi->nRCellIdentity.buf != NULLP)
2529 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2531 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2534 /*******************************************************************
2536 * @brief Deallocating memory of function BuildAndSendUESetReq
2540 * Function : FreeSplCellList
2542 * Functionality: Deallocating memory for function BuildSplCellList
2544 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2549 * *****************************************************************/
2550 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2553 if(spCellLst->list.array != NULLP)
2555 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2557 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2559 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2561 if(spCellLst->list.array[cellidx]!=NULLP)
2563 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2566 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2569 /*******************************************************************
2571 * @brief Deallocating memory of function BuildAndSendUESetReq
2575 * Function : FreeSRBSetup
2577 * Functionality: Deallocating memory for function BuildSRBSetup
2579 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2584 * ******************************************************************/
2585 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2588 if(srbSet->list.array != NULLP)
2590 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2592 if(srbSet->list.array[srbidx]!=NULLP)
2594 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2597 CU_FREE(srbSet->list.array,srbSet->list.size);
2600 /*******************************************************************
2602 * @brief Deallocating memory of function BuildAndSendUESetReq
2606 * Function : FreeQOSInfo
2608 * Functionality: Deallocating memory for function BuildQOSInfo
2610 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2614 * ****************************************************************/
2615 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2617 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2618 uint8_t qosCntIdx = 0;
2620 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2622 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2624 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2626 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2627 sizeof(MaxDataBurstVolume_t));
2629 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2630 sizeof(AveragingWindow_t));
2632 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2633 sizeof(NonDynamic5QIDescriptor_t));
2635 if(drbQos->iE_Extensions)
2637 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
2638 if(qosIeExt->list.array != NULLP)
2640 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2642 if(qosIeExt->list.array[qosCntIdx])
2644 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2647 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2650 CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2653 /*******************************************************************
2655 * @brief Deallocating memory of function BuildAndSendUESetReq
2659 * Function : FreeULTnlInfo
2661 * Functionality: Deallocating memory for function BuildULTnlInfo
2663 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2668 * ****************************************************************/
2669 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2672 if(ulInfo->list.array != NULLP)
2674 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2676 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2678 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2680 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2681 transportLayerAddress.buf != NULLP)
2683 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2686 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2687 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2688 gTPTunnel->gTP_TEID.size);
2690 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2691 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2692 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2694 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2695 sizeof(GTPTunnel_t));
2698 if(ulInfo->list.array[ulidx]!=NULLP)
2700 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2703 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2706 /*******************************************************************
2708 * @brief Deallocating memory for BuildAndSendUESetReq
2712 * Function : FreeDRBSetup
2714 * Functionality: Deallocating memory for BuildDRBSetup
2716 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2720 * ****************************************************************/
2721 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2723 DRBs_ToBeSetup_Item_t *drbSetItem;
2724 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
2726 uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0;
2728 /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
2729 if(drbSet->list.array != NULLP)
2731 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2733 if(drbSet->list.array[drbidx] != NULLP)
2735 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2736 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2738 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2739 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2741 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2742 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2744 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2745 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2747 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2749 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2751 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2753 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2754 flows_Mapped_To_DRB_List.list.array != NULLP)
2756 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2757 flows_Mapped_To_DRB_List.list.count; flowidx++)
2759 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2760 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2762 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2763 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2764 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2766 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2767 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2768 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2770 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2771 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2772 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2774 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2775 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2777 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2778 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2779 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2780 sizeof(MaxDataBurstVolume_t));
2782 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2783 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2784 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2786 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2787 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2788 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2791 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2792 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2794 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2795 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2798 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2799 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2800 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2802 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2803 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2805 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2806 sizeof(OCTET_STRING_t));
2808 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2809 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2811 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2812 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2814 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2815 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2817 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2818 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2820 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2821 iE_Extensions != NULLP)
2823 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
2824 choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
2825 if(qosIeExt->list.array != NULLP)
2827 for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
2829 if(qosIeExt->list.array[qosCntIdx] != NULLP)
2831 CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
2834 CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
2836 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2837 iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
2840 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2842 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2845 CU_FREE(drbSet->list.array,drbSet->list.size);
2850 /*******************************************************************
2852 * @brief Free the UE Setup Request
2856 * Function : FreeUeContextSetupReq
2858 * Functionality: Deallocate the memory of BuildUESetReq
2860 * @params[in] F1AP_PDU_t *f1apMsg
2865 * ****************************************************************/
2866 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2869 UEContextSetupRequest_t *ueSetReq = NULLP;
2871 if(f1apMsg != NULLP)
2873 if(f1apMsg->choice.initiatingMessage != NULLP)
2875 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2876 if(ueSetReq->protocolIEs.list.array != NULLP)
2878 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2880 if(ueSetReq->protocolIEs.list.array[idx])
2882 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2884 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2886 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2888 case ProtocolIE_ID_id_SpCell_ID:
2889 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2891 case ProtocolIE_ID_id_ServCellIndex:
2893 case ProtocolIE_ID_id_SpCellULConfigured:
2895 case ProtocolIE_ID_id_CUtoDURRCInformation:
2896 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2898 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2899 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2901 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2902 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2904 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2905 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2907 case ProtocolIE_ID_id_RRCContainer:
2908 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2910 CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2911 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2915 DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2919 /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
2921 for(ieId=0; ieId<idx; ieId++)
2923 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2925 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2928 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2930 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2932 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2936 /**Filling cell group info **/
2937 /*******************************************************************
2939 * @brief Build Control resource set to add/modify list
2943 * Function : BuildControlRSetToAddModList
2945 * Functionality: Build Control resource set to add/modify list
2948 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2950 * @return ROK - success
2953 * ****************************************************************/
2954 uint8_t BuildControlRSetToAddModList
2956 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2961 uint8_t numBytes, bitsUnused;
2962 struct ControlResourceSet *controlRSet;
2963 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2964 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2967 controlRSetList->list.count = elementCnt;
2968 controlRSetList->list.size = \
2969 elementCnt * sizeof(struct ControlResourceSet *);
2971 controlRSetList->list.array = NULLP;
2972 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2973 if(!controlRSetList->list.array)
2975 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2979 for(idx = 0; idx < elementCnt; idx++)
2981 controlRSetList->list.array[idx] = NULLP;
2982 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2983 if(!controlRSetList->list.array[idx])
2985 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
2991 controlRSet = controlRSetList->list.array[idx];
2992 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2994 /* Values harcoded according to our design:
2997 * Bit string stored ff0000000000
3001 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3002 controlRSet->frequencyDomainResources.buf = NULLP;
3003 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3004 controlRSet->frequencyDomainResources.size);
3005 if(!controlRSet->frequencyDomainResources.buf)
3007 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3011 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3012 coreset0EndPrb = CORESET0_END_PRB;
3013 coreset1StartPrb = coreset0EndPrb + 6;
3014 coreset1NumPrb = CORESET1_NUM_PRB;
3015 /* calculate the PRBs */
3016 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3017 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3018 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3020 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3021 controlRSet->cce_REG_MappingType.present = \
3022 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3024 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3025 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3026 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3027 controlRSet->tci_PresentInDCI = NULLP;
3029 uint8_t tciStateIdx;
3031 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3032 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3033 if(!controlRset->tci_StatesPDCCH_ToAddList)
3035 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3040 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3041 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3042 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3043 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3044 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3046 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3050 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3052 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3053 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3055 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3062 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3064 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3065 if(!controlRset->tci_PresentInDCI)
3067 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3071 *(controlRset->tci_PresentInDCI);
3074 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3075 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3076 if(!controlRSet->pdcch_DMRS_ScramblingID)
3078 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3081 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3084 } /* End BuildControlRSetToAddModList */
3086 /*******************************************************************
3088 * @brief Build search space to add/modify list
3092 * Function : BuildSearchSpcToAddModList
3094 * Functionality: Build search space to add/modify list
3097 * @return ROK - success
3100 * ****************************************************************/
3101 uint8_t BuildSearchSpcToAddModList
3103 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3111 struct SearchSpace *searchSpc;
3114 searchSpcList->list.count = elementCnt;
3115 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3117 searchSpcList->list.array = NULLP;
3118 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3119 if(!searchSpcList->list.array)
3121 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3125 for(idx = 0; idx < elementCnt; idx++)
3127 searchSpcList->list.array[idx] = NULLP;
3128 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3129 if(!searchSpcList->list.array[idx])
3131 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3137 searchSpc = searchSpcList->list.array[idx];
3139 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3141 searchSpc->controlResourceSetId = NULLP;
3142 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3143 if(!searchSpc->controlResourceSetId)
3145 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3148 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3150 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3151 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3152 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3153 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3155 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3158 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3159 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3161 searchSpc->duration = NULLP;
3162 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3163 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3164 if(!searchSpc->monitoringSymbolsWithinSlot)
3166 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3170 /* Values taken from reference logs :
3173 * Bit string stores 8000
3178 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3179 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3180 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3181 searchSpc->monitoringSymbolsWithinSlot->size);
3182 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3184 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3189 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3190 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3191 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3192 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3194 searchSpc->nrofCandidates = NULLP;
3195 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3196 if(!searchSpc->nrofCandidates)
3198 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3202 searchSpc->nrofCandidates->aggregationLevel1 = \
3203 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3204 searchSpc->nrofCandidates->aggregationLevel2 = \
3205 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3206 searchSpc->nrofCandidates->aggregationLevel4 = \
3207 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3208 searchSpc->nrofCandidates->aggregationLevel8 = \
3209 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3210 searchSpc->nrofCandidates->aggregationLevel16 = \
3211 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3213 searchSpc->searchSpaceType = NULLP;
3214 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3215 if(!searchSpc->searchSpaceType)
3217 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3221 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3223 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3224 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3225 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3226 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3228 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3231 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3232 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3235 }/* End BuildSearchSpcToAddModList */
3237 /*******************************************************************
3239 * @brief Builds BWP DL dedicated PDCCH config
3243 * Function : BuildBWPDlDedPdcchCfg
3245 * Functionality: Builds BWP DL dedicated PDCCH config
3247 * @params[in] struct PDCCH_Config *pdcchCfg
3249 * @return ROK - success
3252 * ****************************************************************/
3253 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3255 pdcchCfg->controlResourceSetToAddModList = NULLP;
3256 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3257 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3258 if(!pdcchCfg->controlResourceSetToAddModList)
3260 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3264 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3269 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3271 pdcchCfg->searchSpacesToAddModList = NULLP;
3272 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3273 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3274 if(!pdcchCfg->searchSpacesToAddModList)
3276 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3280 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3285 pdcchCfg->searchSpacesToReleaseList = NULLP;
3286 pdcchCfg->downlinkPreemption = NULLP;
3287 pdcchCfg->tpc_PUSCH = NULLP;
3288 pdcchCfg->tpc_PUCCH = NULLP;
3289 pdcchCfg->tpc_SRS = NULLP;
3294 /*******************************************************************
3296 * @brief Builds DMRS DL PDSCH Mapping type A
3300 * Function : BuildDMRSDLPdschMapTypeA
3302 * Functionality: Builds DMRS DL PDSCH Mapping type A
3305 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3306 * @return ROK - success
3309 * ****************************************************************/
3310 uint8_t BuildDMRSDLPdschMapTypeA
3312 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3315 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3316 dmrsDlCfg->choice.setup = NULLP;
3317 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3318 if(!dmrsDlCfg->choice.setup)
3320 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3324 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3325 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3326 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3327 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3329 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3332 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3334 dmrsDlCfg->choice.setup->maxLength = NULLP;
3335 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3336 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3337 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3342 /*******************************************************************
3344 * @brief Builds TCI states to add/modify list
3348 * Function : BuildTCIStatesToAddModList
3350 * Functionality:Builds TCI states to add/modify list
3353 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3355 * @return ROK - success
3358 * ****************************************************************/
3359 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3364 /*******************************************************************
3366 * @brief Builds PDSCH time domain allocation list
3370 * Function : BuildPdschTimeDomAllocList
3372 * Functionality: Builds PDSCH time domain allocation list
3375 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3377 * @return ROK - success
3380 * ****************************************************************/
3381 uint8_t BuildPdschTimeDomAllocList
3383 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3388 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3390 timeDomAllocList->present = \
3391 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3393 timeDomAllocList->choice.setup = NULLP;
3394 CU_ALLOC(timeDomAllocList->choice.setup, \
3395 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3396 if(!timeDomAllocList->choice.setup)
3398 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3403 timeDomAllocList->choice.setup->list.count = elementCnt;
3404 timeDomAllocList->choice.setup->list.size = \
3405 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3407 timeDomAllocList->choice.setup->list.array = NULLP;
3408 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3409 timeDomAllocList->choice.setup->list.size);
3410 if(!timeDomAllocList->choice.setup->list.array)
3412 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3416 for(idx = 0; idx < elementCnt; idx++)
3418 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3419 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3420 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3421 if(!timeDomAllocList->choice.setup->list.array[idx])
3423 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3429 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3430 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3431 if(!timeDomAlloc->k0)
3433 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3436 *(timeDomAlloc->k0) = 0;
3437 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3438 timeDomAlloc->startSymbolAndLength = 66;
3441 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3442 CU_ALLOC(timeDomAlloc->k0, sizeof(long));
3443 if(!timeDomAlloc->k0)
3445 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3448 *(timeDomAlloc->k0) = 1;
3449 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3450 timeDomAlloc->startSymbolAndLength = 66;
3455 /*******************************************************************
3457 * @brief Builds PDSCH PRB Bundling type
3461 * Function : BuildPdschPrbBundlingType
3463 * Functionality: Builds PDSCH PRB Bundling type
3466 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3468 * @return ROK - success
3471 * ****************************************************************/
3472 uint8_t BuildPdschPrbBundlingType
3474 struct PDSCH_Config__prb_BundlingType *prbBndlType
3477 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3479 prbBndlType->choice.staticBundling = NULLP;
3480 CU_ALLOC(prbBndlType->choice.staticBundling, \
3481 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3482 if(!prbBndlType->choice.staticBundling)
3484 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3487 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3492 /*******************************************************************
3494 * @brief Builds BWP DL dedicated PDSCH config
3498 * Function : BuildBWPDlDedPdschCfg
3500 * Functionality: Builds BWP DL dedicated PDSCH config
3502 * @params[in] struct PDSCH_Config *pdschCfg
3504 * @return ROK - success
3507 * ****************************************************************/
3508 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3510 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3512 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3513 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3514 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3515 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3517 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3521 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3526 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3527 pdschCfg->tci_StatesToAddModList = NULLP;
3528 pdschCfg->tci_StatesToReleaseList = NULLP;
3529 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3531 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3532 if(!pdschCfg->tci_StatesToAddModList)
3534 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3537 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3543 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3545 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3546 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3547 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3548 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3550 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3553 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3557 pdschCfg->pdsch_AggregationFactor = NULLP;
3558 pdschCfg->rateMatchPatternToAddModList = NULLP;
3559 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3560 pdschCfg->rateMatchPatternGroup1 = NULLP;
3561 pdschCfg->rateMatchPatternGroup2 = NULLP;
3562 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3563 pdschCfg->mcs_Table = NULLP;
3565 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3566 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3567 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3569 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3572 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3574 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3579 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3580 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3581 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3582 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3583 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3584 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3585 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3590 /*******************************************************************
3592 * @brief Builds intitial DL BWP
3595 * Function : BuildInitialDlBWP
3597 * Functionality: Builds intitial DL BWP in spCellCfgDed
3599 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3601 * @return ROK - success
3604 * ****************************************************************/
3605 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3607 dlBwp->pdcch_Config = NULLP;
3608 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3609 if(!dlBwp->pdcch_Config)
3611 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3614 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3616 dlBwp->pdcch_Config->choice.setup = NULLP;
3617 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3618 if(!dlBwp->pdcch_Config->choice.setup)
3620 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3623 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3628 dlBwp->pdsch_Config = NULLP;
3629 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3630 if(!dlBwp->pdsch_Config)
3632 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3635 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3637 dlBwp->pdsch_Config->choice.setup = NULLP;
3638 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3639 if(!dlBwp->pdsch_Config->choice.setup)
3641 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
3645 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3650 dlBwp->sps_Config = NULLP;
3651 dlBwp->radioLinkMonitoringConfig = NULLP;
3655 /*******************************************************************
3657 * @brief Builds DMRS UL Pusch Mapping type A
3661 * Function : BuildDMRSULPuschMapTypeA
3663 * Functionality: Builds DMRS UL Pusch Mapping type A
3666 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3667 * @return ROK - success
3670 * ****************************************************************/
3671 uint8_t BuildDMRSULPuschMapTypeA
3673 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3676 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3677 dmrsUlCfg->choice.setup= NULLP;
3678 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3679 if(!dmrsUlCfg->choice.setup)
3681 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3685 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3686 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3687 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3688 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3690 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3693 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3695 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3696 dmrsUlCfg->choice.setup->maxLength = NULLP;
3697 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3698 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3699 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3700 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3702 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3706 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3707 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3709 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3711 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3714 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3716 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3717 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3721 /*******************************************************************
3723 * @brief Build PUSCH time domain allocation list
3727 * Function : BuildPuschTimeDomAllocList
3729 * Functionality: Build PUSCH time domain allocation list
3732 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3734 * @return ROK - success
3737 * ****************************************************************/
3738 uint8_t BuildPuschTimeDomAllocList
3740 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3745 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3747 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3748 timeDomAllocList->choice.setup = NULLP;
3749 CU_ALLOC(timeDomAllocList->choice.setup, \
3750 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3751 if(!timeDomAllocList->choice.setup)
3753 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3758 timeDomAllocList->choice.setup->list.count = elementCnt;
3759 timeDomAllocList->choice.setup->list.size = \
3760 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3761 timeDomAllocList->choice.setup->list.array = NULLP;
3762 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3763 timeDomAllocList->choice.setup->list.size);
3764 if(!timeDomAllocList->choice.setup->list.array)
3766 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3770 for(idx = 0; idx < elementCnt; idx++)
3772 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3773 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3774 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3775 if(!timeDomAllocList->choice.setup->list.array[idx])
3777 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3783 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3784 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3785 if(!timeDomAlloc->k2)
3787 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3790 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
3791 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3792 timeDomAlloc->startSymbolAndLength = 66;
3795 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3796 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3797 if(!timeDomAlloc->k2)
3799 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3802 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
3803 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3804 timeDomAlloc->startSymbolAndLength = 66;
3809 /*******************************************************************
3811 * @brief Builds BWP UL dedicated PUSCH Config
3815 * Function : BuildBWPUlDedPuschCfg
3818 * Builds BWP UL dedicated PUSCH Config
3820 * @params[in] : PUSCH_Config_t *puschCfg
3822 * @return ROK - success
3825 * ****************************************************************/
3826 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3828 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3829 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3830 if(!puschCfg->dataScramblingIdentityPUSCH)
3832 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3835 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3837 puschCfg->txConfig = NULLP;
3838 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3839 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3840 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3841 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3843 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3847 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3852 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3853 puschCfg->pusch_PowerControl = NULLP;
3854 puschCfg->frequencyHopping = NULLP;
3855 puschCfg->frequencyHoppingOffsetLists = NULLP;
3856 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3858 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3859 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3860 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3861 if(!puschCfg->pusch_TimeDomainAllocationList)
3863 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3867 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3872 puschCfg->pusch_AggregationFactor = NULLP;
3873 puschCfg->mcs_Table = NULLP;
3874 puschCfg->mcs_TableTransformPrecoder = NULLP;
3875 puschCfg->transformPrecoder = NULLP;
3876 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3877 if(!puschCfg->transformPrecoder)
3879 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3882 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3884 puschCfg->codebookSubset = NULLP;
3885 puschCfg->maxRank = NULLP;
3886 puschCfg->rbg_Size = NULLP;
3887 puschCfg->uci_OnPUSCH = NULLP;
3888 puschCfg->tp_pi2BPSK = NULLP;
3893 /*******************************************************************
3895 * @brief Builds BWP UL dedicated PUCCH Config
3899 * Function : BuildBWPUlDedPucchCfg
3902 * Builds BWP UL dedicated PUCCH Config
3904 * @params[in] : PUCCH_Config_t *pucchCfg
3906 * @return ROK - success
3909 * ****************************************************************/
3910 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
3912 uint8_t arrIdx, elementCnt;
3913 uint8_t rsrcIdx, rsrcSetIdx;
3914 PUCCH_ResourceSet_t *rsrcSet = NULLP;
3915 PUCCH_Resource_t *rsrc = NULLP;
3919 CU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
3920 pucchCfg->resourceSetToAddModList->list.count = elementCnt;
3921 pucchCfg->resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
3922 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
3923 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
3925 CU_ALLOC(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
3928 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
3929 rsrcSet->pucch_ResourceSetId = 1;
3931 rsrcSet->resourceList.list.count = elementCnt;
3932 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
3933 CU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
3934 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
3936 CU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
3939 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
3943 CU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
3944 pucchCfg->resourceToAddModList->list.count = elementCnt;
3945 pucchCfg->resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
3946 CU_ALLOC(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
3947 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
3949 CU_ALLOC(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
3952 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
3953 rsrc->pucch_ResourceId = 1;
3954 rsrc->startingPRB = 0;
3955 rsrc->format.present = PUCCH_Resource__format_PR_format1;
3956 CU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
3957 rsrc->format.choice.format1->initialCyclicShift = 0;
3958 rsrc->format.choice.format1->nrofSymbols = 4;
3959 rsrc->format.choice.format1->startingSymbolIndex = 0;
3960 rsrc->format.choice.format1->timeDomainOCC = 0;
3963 CU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
3964 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
3965 CU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
3966 CU_ALLOC(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
3967 *(pucchCfg->format1->choice.setup->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
3970 CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
3971 if(pucchCfg->dl_DataToUL_ACK == NULLP)
3973 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3978 pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
3979 pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
3980 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
3981 if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
3983 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3987 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
3989 CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
3990 if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
3992 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
3998 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
3999 *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
4004 /*******************************************************************
4006 * @brief Fills SRS resource to add/modify list
4010 * Function : BuildSrsRsrcAddModList
4012 * Functionality: Fills SRS resource to add/modify list
4015 * @return ROK - success
4018 * ****************************************************************/
4019 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4025 resourceList->list.count = elementCnt;
4026 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4027 resourceList->list.array = NULLP;
4028 CU_ALLOC(resourceList->list.array, resourceList->list.size);
4029 if(!resourceList->list.array)
4031 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4035 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4037 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4038 if(!resourceList->list.array[rsrcIdx])
4040 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4046 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4047 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4048 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4050 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4051 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4052 sizeof(struct SRS_Resource__transmissionComb__n2));
4053 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4055 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4058 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4059 = SRS_COMB_OFFSET_N2;
4060 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4061 = SRS_CYCLIC_SHIFT_N2;
4063 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = PUSCH_START_SYMBOL;
4064 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
4065 SRS_Resource__resourceMapping__nrofSymbols_n1;
4066 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4067 SRS_Resource__resourceMapping__repetitionFactor_n1;
4069 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4070 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4071 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4072 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4073 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4074 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4075 SRS_Resource__groupOrSequenceHopping_neither;
4077 /* Setting resource type to aperiodic for intergration purposes */
4078 resourceList->list.array[rsrcIdx]->resourceType.present = \
4079 SRS_Resource__resourceType_PR_aperiodic;
4080 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4081 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4082 sizeof(struct SRS_Resource__resourceType__aperiodic));
4083 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4085 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcAddModList");
4088 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4093 /*******************************************************************
4095 * @brief Build SRS resource set Add/mod list
4099 * Function : BuildSrsRsrcSetAddModList
4101 * Functionality: Build SRS resource set Add/mod list
4104 * @return ROK - success
4107 * ****************************************************************/
4108 uint8_t BuildSrsRsrcSetAddModList
4110 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4116 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4119 rsrcSetList->list.count = elementCnt;
4120 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4121 rsrcSetList->list.array = NULLP;
4122 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4123 if(!rsrcSetList->list.array)
4125 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4129 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4131 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4132 if(!rsrcSetList->list.array[rSetIdx])
4134 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4140 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4142 /* Fill Resource Id list in resource set */
4143 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4144 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4145 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4146 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4148 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4153 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4154 rsrcIdList->list.count = elementCnt;
4155 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4156 rsrcIdList->list.array = NULLP;
4157 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4158 if(!rsrcIdList->list.array)
4160 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4164 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4166 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4167 if(!rsrcIdList->list.array[rsrcIdx])
4169 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4175 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4177 /* Fill resource type */
4178 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4179 SRS_ResourceSet__resourceType_PR_aperiodic;
4181 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4182 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4183 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4184 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4186 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
4189 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4190 = APERIODIC_SRS_RESRC_TRIGGER;
4192 /* TODO : Fill values for below IEs as expected by Viavi */
4193 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4194 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4197 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4198 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4199 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4200 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4201 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4206 /*******************************************************************
4208 * @brief Builds BWP UL dedicated SRS Config
4212 * Function : BuildBWPUlDedSrsCfg
4214 * Functionality: Builds BWP UL dedicated SRS Config
4216 * @params[in] SRS Config
4217 * @return ROK - success
4220 * ****************************************************************/
4221 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4223 srsCfg->srs_ResourceSetToReleaseList = NULLP;
4224 srsCfg->srs_ResourceSetToAddModList = NULLP;
4225 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4226 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4227 if(!srsCfg->srs_ResourceSetToAddModList)
4229 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4232 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4237 srsCfg->srs_ResourceToReleaseList = NULLP;
4239 /* Resource to Add/Modify list */
4240 srsCfg->srs_ResourceToAddModList = NULLP;
4241 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4242 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4243 if(!srsCfg->srs_ResourceToAddModList)
4245 DU_LOG("\nERROR --> F1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
4249 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4254 srsCfg->tpc_Accumulation = NULLP;
4259 /*******************************************************************
4261 * @brief Builds inital UL BWP
4265 * Function : BuildInitialUlBWP
4267 * Functionality: Builds initial UL BWP
4269 * @params[in] BWP_UplinkDedicated_t *ulBwp
4270 * @return ROK - success
4273 * ****************************************************************/
4274 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4276 ulBwp->pucch_Config = NULLP;
4277 ulBwp->pucch_Config = NULLP;
4278 CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4279 if(!ulBwp->pucch_Config)
4281 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4285 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4286 ulBwp->pucch_Config->choice.setup = NULLP;
4287 CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4288 if(!ulBwp->pucch_Config->choice.setup)
4290 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4294 if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4299 /* Fill BWP UL dedicated PUSCH config */
4300 ulBwp->pusch_Config = NULLP;
4301 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4302 if(!ulBwp->pusch_Config)
4304 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4308 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4309 ulBwp->pusch_Config->choice.setup = NULLP;
4310 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4311 if(!ulBwp->pusch_Config->choice.setup)
4313 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4317 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4322 ulBwp->configuredGrantConfig = NULLP;
4324 /* Fill BPW UL dedicated SRS config */
4325 ulBwp->srs_Config = NULLP;
4326 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4327 if(!ulBwp->srs_Config)
4329 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4333 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4334 ulBwp->srs_Config->choice.setup = NULLP;
4335 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4336 if(!ulBwp->srs_Config->choice.setup)
4338 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
4342 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4347 ulBwp->beamFailureRecoveryConfig = NULLP;
4352 /*******************************************************************
4354 * @brief Builds Pusch Serving cell Config
4358 * Function : BuildPuschSrvCellCfg
4360 * Functionality: Builds Pusch Serving cell Config
4362 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4364 * @return ROK - success
4367 * ****************************************************************/
4368 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4370 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4371 puschCfg->choice.setup = NULLP;
4372 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4373 if(!puschCfg->choice.setup)
4375 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4379 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4380 puschCfg->choice.setup->rateMatching = NULLP;
4381 puschCfg->choice.setup->xOverhead = NULLP;
4382 puschCfg->choice.setup->ext1 = NULLP;
4383 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4384 if(!puschCfg->choice.setup->ext1)
4386 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4390 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4391 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4392 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4394 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4397 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4399 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4400 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4401 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4403 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4406 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4410 /*******************************************************************
4412 * @brief Builds UL config
4415 * Function : BuildUlCfg
4417 * Functionality: Builds UL config in spCellCfgDed
4419 * @params[in] UplinkConfig_t *ulCfg
4421 * @return ROK - success
4424 * ****************************************************************/
4425 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4427 ulCfg->initialUplinkBWP = NULLP;
4428 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4429 if(!ulCfg->initialUplinkBWP)
4431 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4435 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4440 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4441 ulCfg->uplinkBWP_ToAddModList = NULLP;
4442 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4443 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4444 if(!ulCfg->firstActiveUplinkBWP_Id)
4446 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4449 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4451 ulCfg->pusch_ServingCellConfig = NULLP;
4452 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4453 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4454 if(!ulCfg->pusch_ServingCellConfig)
4456 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
4460 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4465 ulCfg->carrierSwitching = NULLP;
4466 ulCfg->ext1 = NULLP;
4470 /*******************************************************************
4472 * @brief Builds PDSCH serving cell config
4475 * Function : BuildPdschSrvCellCfg
4477 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4479 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4481 * @return ROK - success
4484 * ****************************************************************/
4485 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4487 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4488 pdschCfg->choice.setup = NULLP;
4489 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4490 if(!pdschCfg->choice.setup)
4492 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4496 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4497 pdschCfg->choice.setup->xOverhead = NULLP;
4498 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4499 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4500 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4502 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4505 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4506 pdschCfg->choice.setup->pucch_Cell = NULLP;
4507 pdschCfg->choice.setup->ext1 = NULLP;
4512 /*******************************************************************
4514 * @brief Builds CSI Meas config
4517 * Function : BuildCsiMeasCfg
4519 * Functionality: Builds CSI Meas config in spCellCfgDed
4521 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4523 * @return ROK - success
4526 * ****************************************************************/
4527 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4533 /*******************************************************************
4535 * @brief Builds Spcell config dedicated
4538 * Function : BuildSpCellCfgDed
4540 * Functionality: Builds sp cell config dedicated in spCellCfg
4542 * @params[in] ServingCellConfig_t srvCellCfg
4544 * @return ROK - success
4547 * ****************************************************************/
4548 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4550 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4552 srvCellCfg->initialDownlinkBWP = NULLP;
4553 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4554 if(!srvCellCfg->initialDownlinkBWP)
4556 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4560 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4562 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
4565 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4566 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4568 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4569 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4570 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4572 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4575 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4577 srvCellCfg->bwp_InactivityTimer = NULLP;
4579 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4580 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4581 if(!srvCellCfg->defaultDownlinkBWP_Id)
4583 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4586 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4588 srvCellCfg->uplinkConfig = NULLP;
4589 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4590 if(!srvCellCfg->uplinkConfig)
4592 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4596 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4598 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
4601 srvCellCfg->supplementaryUplink = NULLP;
4602 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4604 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4605 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4606 if(!srvCellCfg->pdsch_ServingCellConfig)
4608 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4612 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4614 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
4618 srvCellCfg->csi_MeasConfig = NULLP;
4620 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4621 if(!srvCellCfg->csi_MeasConfig)
4623 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
4627 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4629 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4633 srvCellCfg->sCellDeactivationTimer = NULLP;
4634 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4635 srvCellCfg->tag_Id = TAG_ID;
4636 srvCellCfg->dummy = NULLP;
4637 srvCellCfg->pathlossReferenceLinking = NULLP;
4638 srvCellCfg->servingCellMO = NULLP;
4639 srvCellCfg->ext1 = NULLP;
4643 /*******************************************************************
4645 * @brief Builds Spcell config
4649 * Function : BuildSpCellCfg
4651 * Functionality: Builds sp cell config in DuToCuRrcContainer
4653 * @params[in] SpCellConfig_t spCellCfg
4655 * @return ROK - success
4658 * ****************************************************************/
4659 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4662 spCellCfg->servCellIndex = NULLP;
4663 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4664 if(!spCellCfg->servCellIndex)
4666 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4669 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4671 spCellCfg->reconfigurationWithSync = NULLP;
4672 spCellCfg->rlf_TimersAndConstants = NULLP;
4673 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4674 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4675 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4677 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4680 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4682 spCellCfg->spCellConfigDedicated = NULLP;
4683 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4684 if(!spCellCfg->spCellConfigDedicated)
4686 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
4689 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4691 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
4696 /*******************************************************************
4698 * @brief Builds Phy cell group config
4702 * Function : BuildPhyCellGrpCfg
4704 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4706 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4708 * @return ROK - success
4711 * ****************************************************************/
4712 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4714 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4715 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4717 phyCellGrpCfg->p_NR_FR1 = NULLP;
4718 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4719 if(!phyCellGrpCfg->p_NR_FR1)
4721 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4724 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4725 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4726 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4727 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4728 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4729 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4730 phyCellGrpCfg->cs_RNTI = NULLP;
4731 phyCellGrpCfg->ext1 = NULLP;
4732 phyCellGrpCfg->ext2 = NULLP;
4737 /*******************************************************************
4739 * @brief Builds tag config
4743 * Function : BuildTagConfig
4745 * Functionality: Builds tag config in MacCellGroupConfig
4747 * @params[in] TAG_Config *tag_Config
4749 * @return ROK - success
4752 * ****************************************************************/
4753 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4755 struct TAG_Config__tag_ToAddModList *tagList;
4756 uint8_t idx, elementCnt;
4758 tagConfig->tag_ToReleaseList = NULLP;
4759 tagConfig->tag_ToAddModList = NULLP;
4760 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4761 if(!tagConfig->tag_ToAddModList)
4763 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4767 elementCnt = 1; //ODU_VALUE_ONE;
4768 tagList = tagConfig->tag_ToAddModList;
4769 tagList->list.count = elementCnt;
4770 tagList->list.size = elementCnt * sizeof(struct TAG *);
4772 tagList->list.array = NULLP;
4773 CU_ALLOC(tagList->list.array, tagList->list.size);
4774 if(!tagList->list.array)
4776 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4780 for(idx=0; idx<tagList->list.count; idx++)
4782 tagList->list.array[idx] = NULLP;
4783 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4784 if(!tagList->list.array[idx])
4786 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
4792 tagList->list.array[idx]->tag_Id = TAG_ID;
4793 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4798 /*******************************************************************
4800 * @brief Builds PHR Config
4804 * Function : BuildPhrConfig
4806 * Functionality: Builds phrConfig in MacCellGroupConfig
4808 * @params[in] PHR Config *
4810 * @return ROK - success
4813 * ****************************************************************/
4814 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4817 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4818 phrConfig->choice.setup = NULLP;
4819 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4820 if(!phrConfig->choice.setup)
4822 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
4826 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4827 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4828 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4829 phrConfig->choice.setup->multiplePHR = false;
4830 phrConfig->choice.setup->dummy = false;
4831 phrConfig->choice.setup->phr_Type2OtherCell = false;
4832 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4837 /*******************************************************************
4839 * @brief Builds BSR Config
4843 * Function : BuildBsrConfig
4845 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4847 * @params[in] BSR_Config *bsrConfig
4849 * @return ROK - success
4852 * ****************************************************************/
4853 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4855 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4856 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4857 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4862 /*******************************************************************
4864 * @brief Builds scheduling request config
4868 * Function : BuildSchedulingReqConfig
4870 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4872 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4874 * @return ROK - success
4877 * ****************************************************************/
4878 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4880 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4881 uint8_t idx, elementCnt;
4883 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4884 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4885 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4886 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4888 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4892 elementCnt = 1; //ODU_VALUE_ONE;
4893 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4894 schReqList->list.count = elementCnt;
4895 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4897 schReqList->list.array = NULLP;
4898 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4899 if(!schReqList->list.array)
4901 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4905 for(idx=0;idx<schReqList->list.count; idx++)
4907 schReqList->list.array[idx] = NULLP;
4908 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4909 if(!schReqList->list.array[idx])
4911 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4917 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4919 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4920 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4921 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4923 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
4926 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4927 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4928 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4932 /*******************************************************************
4934 * @brief Builds Mac cell group config
4938 * Function : BuildMacCellGrpCfg
4940 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4942 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4944 * @return ROK - success
4947 * ****************************************************************/
4948 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4950 macCellGrpCfg->drx_Config = NULLP;
4951 macCellGrpCfg->schedulingRequestConfig = NULLP;
4952 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4953 if(!macCellGrpCfg->schedulingRequestConfig)
4955 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4959 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4961 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
4965 macCellGrpCfg->bsr_Config = NULLP;
4966 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4967 if(!macCellGrpCfg->bsr_Config)
4969 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4973 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4975 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
4979 macCellGrpCfg->tag_Config = NULLP;
4980 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4981 if(!macCellGrpCfg->tag_Config)
4983 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4987 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4989 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
4993 macCellGrpCfg->phr_Config = NULLP;
4994 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4995 if(!macCellGrpCfg->phr_Config)
4997 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5001 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5003 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
5007 macCellGrpCfg->skipUplinkTxDynamic = false;
5008 macCellGrpCfg->ext1 = NULLP;
5012 /*******************************************************************
5014 * @brief Frees memeory allocated for SearchSpcToAddModList
5018 * Function : FreeSearchSpcToAddModList
5020 * Functionality: Deallocating memory of SearchSpcToAddModList
5022 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5026 4221 * ****************************************************************/
5027 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5031 struct SearchSpace *searchSpc=NULLP;
5033 if(searchSpcList->list.array)
5035 if(searchSpcList->list.array[idx2])
5037 searchSpc = searchSpcList->list.array[idx2];
5038 if(searchSpc->controlResourceSetId)
5040 if(searchSpc->monitoringSlotPeriodicityAndOffset)
5042 if(searchSpc->monitoringSymbolsWithinSlot)
5044 if(searchSpc->monitoringSymbolsWithinSlot->buf)
5046 if(searchSpc->nrofCandidates)
5048 if(searchSpc->searchSpaceType)
5050 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5051 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5052 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
5053 SearchSpace__searchSpaceType));
5055 CU_FREE(searchSpc->nrofCandidates,
5056 sizeof(struct SearchSpace__nrofCandidates));
5058 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5059 searchSpc->monitoringSymbolsWithinSlot->size);
5061 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5062 sizeof(BIT_STRING_t));
5064 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5065 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5067 CU_FREE(searchSpc->controlResourceSetId,
5068 sizeof(ControlResourceSetId_t));
5071 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5073 CU_FREE(searchSpcList->list.array[idx1],
5074 sizeof(struct SearchSpace));
5076 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5079 /*******************************************************************
5081 * @brief Frees memory allocated for PdschTimeDomAllocList
5085 * Function : FreePdschTimeDomAllocList
5087 * Functionality: Deallocating memory of PdschTimeDomAllocList
5089 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5093 4221 * ****************************************************************/
5094 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5098 if(timeDomAllocList->choice.setup)
5100 if(timeDomAllocList->choice.setup->list.array)
5102 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5104 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5105 sizeof(struct PDSCH_TimeDomainResourceAllocation));
5107 CU_FREE(timeDomAllocList->choice.setup->list.array, \
5108 timeDomAllocList->choice.setup->list.size);
5110 CU_FREE(timeDomAllocList->choice.setup,\
5111 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5114 /*******************************************************************
5116 * @brief Frees memory allocated for PuschTimeDomAllocList
5120 * Function : FreePuschTimeDomAllocList
5122 * Functionality: Deallocating memory of PuschTimeDomAllocList
5124 * @params[in] PUSCH_Config_t *puschCfg
5128 ***********************************************************************/
5129 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5133 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5135 if(puschCfg->pusch_TimeDomainAllocationList)
5137 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5138 if(timeDomAllocList_t->choice.setup)
5140 if(timeDomAllocList_t->choice.setup->list.array)
5142 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5143 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5145 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5146 sizeof(PUSCH_TimeDomainResourceAllocation_t));
5148 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5149 timeDomAllocList_t->choice.setup->list.size);
5151 CU_FREE(timeDomAllocList_t->choice.setup, \
5152 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5154 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
5155 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5156 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5161 /*******************************************************************
5163 * @brief Frees memory allocated for Dedicated PUCCH config
5167 * Function : FreeBWPUlDedPucchCfg
5169 * Functionality: Deallocating memory of Dedicated PUCCH cfg
5171 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
5175 * ****************************************************************/
5176 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
5178 uint8_t arrIdx, rsrcIdx, rsrcSetIdx;
5179 PUCCH_Config_t *pucchCfg = NULLP;
5180 PUCCH_ResourceSet_t *rsrcSet = NULLP;
5181 PUCCH_Resource_t *rsrc = NULLP;
5185 if(ulBwpPucchCfg->choice.setup)
5187 pucchCfg = ulBwpPucchCfg->choice.setup;
5189 //Free resource set list
5190 if(pucchCfg->resourceSetToAddModList)
5192 if(pucchCfg->resourceSetToAddModList->list.array)
5194 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
5196 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
5197 if(rsrcSet->resourceList.list.array)
5199 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
5201 CU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5203 CU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
5205 CU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
5207 CU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
5209 CU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5212 //Free resource list
5213 if(pucchCfg->resourceToAddModList)
5215 if(pucchCfg->resourceToAddModList->list.array)
5217 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
5219 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
5220 CU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
5221 CU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
5223 CU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
5225 CU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5229 if(pucchCfg->format1)
5231 if(pucchCfg->format1->choice.setup)
5233 CU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
5234 CU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5236 CU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5240 if(pucchCfg->dl_DataToUL_ACK)
5242 if(pucchCfg->dl_DataToUL_ACK->list.array)
5244 for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
5246 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
5248 CU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5250 CU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5253 CU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
5255 CU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5259 /*******************************************************************
5261 * @brief Frees memory allocated for InitialUlBWP
5265 * Function : FreeInitialUlBWP
5267 * Functionality: Deallocating memory of InitialUlBWP
5269 * @params[in] BWP_UplinkDedicated_t *ulBwp
5273 * ****************************************************************/
5274 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5276 uint8_t rSetIdx, rsrcIdx;
5277 SRS_Config_t *srsCfg = NULLP;
5278 PUSCH_Config_t *puschCfg = NULLP;
5279 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5280 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5281 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5282 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5284 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
5286 if(ulBwp->pusch_Config)
5288 if(ulBwp->pusch_Config->choice.setup)
5290 puschCfg=ulBwp->pusch_Config->choice.setup;
5291 if(puschCfg->dataScramblingIdentityPUSCH)
5293 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5295 FreePuschTimeDomAllocList(puschCfg);
5296 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5297 if(dmrsUlCfg->choice.setup)
5299 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5301 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5303 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5305 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5306 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5308 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5311 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5313 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5314 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5316 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5318 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5320 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5322 /* Free SRS-Config */
5323 if(ulBwp->srs_Config)
5325 if(ulBwp->srs_Config->choice.setup)
5327 srsCfg = ulBwp->srs_Config->choice.setup;
5329 /* Free Resource Set to add/mod list */
5330 if(srsCfg->srs_ResourceSetToAddModList)
5332 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5333 if(rsrcSetList->list.array)
5337 /* Free SRS resource Id list in this SRS resource set */
5338 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5340 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5342 if(rsrcIdList->list.array)
5344 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5346 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5348 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5350 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5351 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5354 /* Free resource type info for this SRS resource set */
5355 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5356 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5358 /* Free memory for each resource set */
5359 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5361 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5363 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
5365 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5366 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5369 /* Free resource to add/modd list */
5370 if(srsCfg->srs_ResourceToAddModList)
5372 resourceList = srsCfg->srs_ResourceToAddModList;
5373 if(resourceList->list.array)
5376 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5377 sizeof(struct SRS_Resource__transmissionComb__n2));
5378 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5379 sizeof(struct SRS_Resource__resourceType__aperiodic));
5381 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5383 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5385 CU_FREE(resourceList->list.array, resourceList->list.size);
5387 CU_FREE(srsCfg->srs_ResourceToAddModList, \
5388 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5391 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5393 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5397 /*******************************************************************
5399 * @brief Frees memory allocated for initialUplinkBWP
5403 * Function : FreeinitialUplinkBWP
5405 * Functionality: Deallocating memory of initialUplinkBWP
5407 * @params[in] UplinkConfig_t *ulCfg
5412 * ****************************************************************/
5413 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5415 BWP_UplinkDedicated_t *ulBwp=NULLP;
5416 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5418 if(ulCfg->initialUplinkBWP)
5420 ulBwp=ulCfg->initialUplinkBWP;
5421 if(ulCfg->firstActiveUplinkBWP_Id)
5423 if(ulCfg->pusch_ServingCellConfig)
5425 puschCfg=ulCfg->pusch_ServingCellConfig;
5426 if(puschCfg->choice.setup)
5428 if(puschCfg->choice.setup->ext1)
5430 CU_FREE(puschCfg->choice.setup->ext1->\
5431 processingType2Enabled,sizeof(BOOLEAN_t));
5432 CU_FREE(puschCfg->choice.setup->ext1->\
5433 maxMIMO_Layers,sizeof(long));
5434 CU_FREE(puschCfg->choice.setup->ext1, \
5435 sizeof(struct PUSCH_ServingCellConfig__ext1));
5437 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5439 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5441 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5443 FreeInitialUlBWP(ulBwp);
5444 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5447 /*******************************************************************
5449 * @brief Frees emmory allocated for BWPDlDedPdschCfg
5453 * Function : FreeBWPDlDedPdschCfg
5455 * Functionality: Deallocating memory of BWPDlDedPdschCfg
5457 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5462 * ****************************************************************/
5463 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5465 struct PDSCH_Config *pdschCfg=NULLP;
5466 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5467 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5468 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5470 if(dlBwp->pdsch_Config->choice.setup)
5472 pdschCfg=dlBwp->pdsch_Config->choice.setup;
5473 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5475 if(pdschCfg->pdsch_TimeDomainAllocationList)
5477 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5478 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5480 prbBndlType=&pdschCfg->prb_BundlingType;
5481 CU_FREE(prbBndlType->choice.staticBundling,\
5482 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5483 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5485 FreePdschTimeDomAllocList(timeDomAllocList);
5486 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5487 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5489 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5490 if(dmrsDlCfg->choice.setup)
5492 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5494 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5496 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5497 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5499 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5502 /*******************************************************************
5504 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5508 * Function : FreeBWPDlDedPdcchCfg
5510 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5512 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5517 * ****************************************************************/
5518 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5522 struct PDCCH_Config *pdcchCfg=NULLP;
5523 struct ControlResourceSet *controlRSet=NULLP;
5524 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5526 if(dlBwp->pdcch_Config->choice.setup)
5528 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5529 if(pdcchCfg->controlResourceSetToAddModList)
5531 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5532 if(controlRSetList->list.array)
5534 controlRSet = controlRSetList->list.array[idx2];
5537 if(controlRSet->frequencyDomainResources.buf)
5539 if(controlRSet->pdcch_DMRS_ScramblingID)
5541 if(pdcchCfg->searchSpacesToAddModList)
5543 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5544 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5545 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5547 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5549 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5550 controlRSet->frequencyDomainResources.size);
5553 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5555 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5557 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5559 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5560 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5562 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5565 /*******************************************************************
5567 * @brief Builds RLC Config
5571 * Function : BuildRlcConfig
5573 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5575 * @params[in] RLC_Config *rlcConfig
5577 * @return ROK - success
5580 * ****************************************************************/
5581 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5584 rlcConfig->present = RLC_Config_PR_am;
5586 rlcConfig->choice.am = NULLP;
5587 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5588 if(!rlcConfig->choice.am)
5590 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5595 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5596 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5597 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5599 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5602 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5603 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5604 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5605 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5606 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5609 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5610 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5611 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5613 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
5616 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5617 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5618 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5623 /*******************************************************************
5625 * @brief Builds MAC LC Config
5629 * Function : BuildMacLCConfig
5631 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5633 * @params[in] struct LogicalChannelConfig macLcConfig
5635 * @return ROK - success
5638 * ****************************************************************/
5639 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5642 macLcConfig->ul_SpecificParameters = NULLP;
5643 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5644 if(!macLcConfig->ul_SpecificParameters)
5646 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5650 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5651 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5652 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5653 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5654 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5655 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5656 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5658 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5659 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5660 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5662 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5665 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5667 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5668 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5669 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5671 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
5674 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5676 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5677 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5678 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5682 /*******************************************************************
5684 * @brief Builds RLC Bearer to Add/Mod list
5688 * Function :BuildRlcBearerToAddModList
5690 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5692 * @params[in] rlc_BearerToAddModList
5694 * @return ROK - success
5697 * ****************************************************************/
5698 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5700 uint8_t idx, elementCnt;
5703 rlcBearerList->list.count = elementCnt;
5704 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5706 rlcBearerList->list.array = NULLP;
5707 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5708 if(!rlcBearerList->list.array)
5710 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5714 for(idx=0; idx<rlcBearerList->list.count; idx++)
5716 rlcBearerList->list.array[idx] = NULLP;
5717 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5718 if(!rlcBearerList->list.array[idx])
5720 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5726 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5728 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5729 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5731 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5735 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5736 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5738 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5739 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5740 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5741 if(!rlcBearerList->list.array[idx]->rlc_Config)
5743 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5747 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5749 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
5753 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5754 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5755 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5757 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5761 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5763 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
5770 /*******************************************************************
5772 * @brief Free memory allocated for CellGroupConfig
5776 * Function : FreeMemCellGrpCfg
5778 * Functionality: Deallocating memory of CellGroupConfig
5780 * @params[in] pointer to CellGroupConfigRrc_t
5782 * @return ROK - success
5785 ******************************************************************/
5786 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5789 SpCellConfig_t *spCellCfg=NULLP;
5790 ServingCellConfig_t *srvCellCfg=NULLP;
5791 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5792 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5793 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5794 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5795 struct RLC_Config *rlcConfig=NULLP;
5796 struct LogicalChannelConfig *macLcConfig=NULLP;
5797 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5798 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5799 struct TAG_Config *tagConfig=NULLP;
5800 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5801 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5802 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5804 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5807 if(rlcBearerList->list.array)
5809 for(idx=0; idx<rlcBearerList->list.count; idx++)
5811 if(rlcBearerList->list.array[idx])
5813 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5814 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5817 if(rlcConfig->choice.am)
5819 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5820 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5821 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5823 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5825 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5828 if(macLcConfig->ul_SpecificParameters)
5830 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5831 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5832 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5834 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5836 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5839 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5841 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5844 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5847 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5848 if(schedulingRequestConfig)
5850 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5853 if(schReqList->list.array)
5855 for(idx=0;idx<schReqList->list.count; idx++)
5857 if(schReqList->list.array[idx])
5859 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5860 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5863 CU_FREE(schReqList->list.array, schReqList->list.size);
5865 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5866 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5867 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5869 if(macCellGrpCfg->bsr_Config)
5871 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5873 tagConfig = macCellGrpCfg->tag_Config;
5876 tagList = tagConfig->tag_ToAddModList;
5879 if(tagList->list.array)
5881 for(idx=0; idx<tagList->list.count; idx++)
5883 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5885 CU_FREE(tagList->list.array, tagList->list.size);
5887 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5889 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5892 phrConfig = macCellGrpCfg->phr_Config;
5895 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5896 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5899 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5902 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5905 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5906 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5909 spCellCfg = cellGrpCfg->spCellConfig;
5912 if(spCellCfg->servCellIndex)
5914 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5916 if(spCellCfg->spCellConfigDedicated)
5918 srvCellCfg = spCellCfg->spCellConfigDedicated;
5919 if(srvCellCfg->initialDownlinkBWP)
5921 dlBwp = srvCellCfg->initialDownlinkBWP;
5922 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5924 if(srvCellCfg->defaultDownlinkBWP_Id)
5926 if(srvCellCfg->uplinkConfig)
5928 if(srvCellCfg->pdsch_ServingCellConfig)
5930 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5931 if(pdschCfg->choice.setup)
5933 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5934 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5936 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5937 ServingCellConfig__pdsch_ServingCellConfig));
5939 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5940 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5942 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5944 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5946 if(dlBwp->pdcch_Config)
5948 if(dlBwp->pdsch_Config)
5950 FreeBWPDlDedPdschCfg(dlBwp);
5951 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5953 FreeBWPDlDedPdcchCfg(dlBwp);
5954 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5956 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5958 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5960 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5962 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5964 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5969 /*******************************************************************
5971 * @brief Fills CellGroupConfig
5975 * Function : fillCellGrpCfg
5977 * Functionality: Fills CellGroupConfig
5979 * @params[in] pointer to CellGroupConfigRrc_t
5981 * @return ROK - success
5984 ******************************************************************/
5986 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5988 uint8_t ret = RFAILED;
5989 CellGroupConfigRrc_t cellGrpCfg;
5990 asn_enc_rval_t encRetVal;
5994 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5996 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5997 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5998 if(!cellGrpCfg.rlc_BearerToAddModList)
6000 DU_LOG("\nERROR --> F1AP : Memory allocation failure in CellGrpConfig");
6003 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
6005 DU_LOG("\nERROR --> F1AP : fillCellGrpCfg failed");
6009 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
6010 cellGrpCfg.mac_CellGroupConfig = NULLP;
6011 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
6012 if(!cellGrpCfg.mac_CellGroupConfig)
6014 DU_LOG("\nERROR --> F1AP : Memory allocation failure in fillCellGrpCfg");
6017 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
6019 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
6023 cellGrpCfg.physicalCellGroupConfig = NULLP;
6024 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
6025 if(!cellGrpCfg.physicalCellGroupConfig)
6027 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6030 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
6032 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
6036 cellGrpCfg.spCellConfig = NULLP;
6037 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
6038 if(!cellGrpCfg.spCellConfig)
6040 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
6043 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
6045 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
6049 cellGrpCfg.sCellToAddModList = NULLP;
6050 cellGrpCfg.sCellToReleaseList = NULLP;
6051 cellGrpCfg.ext1 = NULLP;
6053 /* encode cellGrpCfg into duToCuRrcContainer */
6054 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
6055 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6057 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
6058 /* Encode results */
6059 if(encRetVal.encoded == ENCODE_FAIL)
6061 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
6062 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6067 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for DuToCuRrcContainer\n");
6068 for(int i=0; i< encBufSize; i++)
6070 DU_LOG("%x",encBuf[i]);
6074 cellGrp->size = encBufSize;
6075 CU_ALLOC(cellGrp->buf, cellGrp->size);
6078 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
6081 memcpy(cellGrp->buf, encBuf, cellGrp->size);
6085 FreeMemCellGrpCfg(&cellGrpCfg);
6089 /*******************************************************************
6091 * @brief Free UE Capability RAT container
6095 * Function : freeUeCapRatCont
6098 * Free UE Capability RAT conatiner
6101 * @return ROK - success
6104 * ****************************************************************/
6105 void freeUeCapRatCont(UE_NR_Capability_t *ueNrCap)
6108 FeatureSets_t *featureSets;
6110 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6112 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
6114 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
6115 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6117 CU_FREE(ueNrCap->rf_Parameters.supportedBandListNR.list.array, ueNrCap->rf_Parameters.supportedBandListNR.list.size);
6120 if(ueNrCap->featureSets)
6122 featureSets = ueNrCap->featureSets;
6123 if(featureSets->featureSetsDownlinkPerCC)
6125 if(featureSets->featureSetsDownlinkPerCC->list.array)
6127 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
6129 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6130 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, \
6131 sizeof(ModulationOrder_t));
6132 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6134 CU_FREE(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6136 CU_FREE(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6139 if(featureSets->featureSetsUplinkPerCC)
6141 if(featureSets->featureSetsUplinkPerCC->list.array)
6143 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
6145 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
6147 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6148 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL,\
6149 sizeof(ModulationOrder_t));
6150 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6153 CU_FREE(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6155 CU_FREE(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6157 CU_FREE(ueNrCap->featureSets, sizeof(struct FeatureSets));
6161 /*******************************************************************
6163 * @brief Free UE capability RAT container list
6167 * Function : freeUeCapRatContList
6169 * Functionality: Free UE capability RAT container list
6172 * @return ROK - success
6175 * ****************************************************************/
6176 void freeUeCapRatContList(UE_CapabilityRAT_ContainerListRRC_t *ueCapablityList)
6179 if(ueCapablityList->list.array)
6181 for(idx = 0; idx < ueCapablityList->list.count; idx++)
6183 if(ueCapablityList->list.array[idx])
6184 CU_FREE(ueCapablityList->list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6186 CU_FREE(ueCapablityList->list.array, ueCapablityList->list.size);
6190 /*******************************************************************
6192 * @brief Fill feature sets
6196 * Function : fillFeatureSets
6198 * Functionality: Fill feature sets
6201 * @return ROK - success
6204 * ****************************************************************/
6205 uint8_t fillFeatureSets(FeatureSets_t *featureSets)
6207 uint8_t idx, elementCnt;
6209 featureSets->featureSetsDownlink = NULLP;
6210 CU_ALLOC(featureSets->featureSetsDownlinkPerCC, sizeof(struct FeatureSets__featureSetsDownlinkPerCC));
6211 if(!featureSets->featureSetsDownlinkPerCC)
6213 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6218 featureSets->featureSetsDownlinkPerCC->list.count = elementCnt;
6219 featureSets->featureSetsDownlinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetDownlinkPerCC *);
6220 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array, featureSets->featureSetsDownlinkPerCC->list.size);
6221 if(!featureSets->featureSetsDownlinkPerCC->list.array)
6223 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6227 for(idx = 0; idx < elementCnt; idx++)
6229 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx], sizeof(struct FeatureSetDownlinkPerCC));
6230 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx])
6232 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6238 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedSubcarrierSpacingDL = SubcarrierSpacing_kHz15;
6239 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.present = SupportedBandwidth_PR_fr1;
6240 featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedBandwidthDL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6241 featureSets->featureSetsDownlinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6242 featureSets->featureSetsDownlinkPerCC->list.array[idx]->maxNumberMIMO_LayersPDSCH = NULLP;
6244 CU_ALLOC(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL, sizeof(ModulationOrder_t));
6245 if(!featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
6247 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6250 *(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL) = ModulationOrder_qam64;
6252 featureSets->featureSetsUplink = NULLP;
6253 CU_ALLOC(featureSets->featureSetsUplinkPerCC, sizeof(struct FeatureSets__featureSetsUplinkPerCC));
6254 if(!featureSets->featureSetsUplinkPerCC)
6256 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6261 featureSets->featureSetsUplinkPerCC->list.count = elementCnt;
6262 featureSets->featureSetsUplinkPerCC->list.size = elementCnt * sizeof(struct FeatureSetUplinkPerCC *);
6263 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array, featureSets->featureSetsUplinkPerCC->list.size);
6264 if(!featureSets->featureSetsUplinkPerCC->list.array)
6266 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6270 for(idx = 0; idx < elementCnt; idx++)
6272 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx], sizeof(struct FeatureSetUplinkPerCC));
6273 if(!featureSets->featureSetsUplinkPerCC->list.array[idx])
6275 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6281 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedSubcarrierSpacingUL = SubcarrierSpacing_kHz15;
6282 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.present = SupportedBandwidth_PR_fr1;
6283 featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedBandwidthUL.choice.fr1 = SupportedBandwidth__fr1_mhz20;
6284 featureSets->featureSetsUplinkPerCC->list.array[idx]->channelBW_90mhz = NULLP;
6285 featureSets->featureSetsUplinkPerCC->list.array[idx]->mimo_CB_PUSCH = NULLP;
6286 featureSets->featureSetsUplinkPerCC->list.array[idx]->maxNumberMIMO_LayersNonCB_PUSCH = NULLP;
6288 CU_ALLOC(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL, sizeof(ModulationOrder_t));
6289 if(!featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
6291 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillFeatureSets");
6294 *(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL) = ModulationOrder_qam16;
6299 /*******************************************************************
6301 * @brief Fill UE capability RAT container
6305 * Function : fillUeCapRatCont
6307 * Functionality: Fill UE capability RAT container
6309 * @params[in] UE Capability RAT container buffer
6310 * @return ROK - success
6313 * ****************************************************************/
6314 uint8_t fillUeCapRatCont(OCTET_STRING_t *ueCapRatContBuf)
6317 uint8_t idx, elementCnt;
6318 asn_enc_rval_t encRetVal;
6319 UE_NR_Capability_t ueNrCap;
6323 ueNrCap.accessStratumRelease = AccessStratumRelease_rel15;
6325 /* Filling PDCP parameters */
6326 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0000 = false;
6327 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0001 = false;
6328 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0002 = false;
6329 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0003 = false;
6330 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0004 = false;
6331 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0006 = false;
6332 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0101 = false;
6333 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0102 = false;
6334 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0103 = false;
6335 ueNrCap.pdcp_Parameters.supportedROHC_Profiles.profile0x0104 = false;
6336 ueNrCap.pdcp_Parameters.maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs2;
6337 ueNrCap.pdcp_Parameters.uplinkOnlyROHC_Profiles = NULLP;
6338 ueNrCap.pdcp_Parameters.continueROHC_Context = NULLP;
6339 ueNrCap.pdcp_Parameters.outOfOrderDelivery = NULLP;
6340 ueNrCap.pdcp_Parameters.shortSN = NULLP;
6341 ueNrCap.pdcp_Parameters.pdcp_DuplicationSRB = NULLP;
6342 ueNrCap.pdcp_Parameters.pdcp_DuplicationMCG_OrSCG_DRB = NULLP;
6344 ueNrCap.rlc_Parameters = NULLP;
6345 ueNrCap.mac_Parameters = NULLP;
6347 /* Filling PHY parameters */
6348 ueNrCap.phy_Parameters.phy_ParametersCommon = NULLP;
6349 ueNrCap.phy_Parameters.phy_ParametersXDD_Diff = NULLP;
6350 ueNrCap.phy_Parameters.phy_ParametersFRX_Diff = NULLP;
6351 ueNrCap.phy_Parameters.phy_ParametersFR1 = NULLP;
6352 ueNrCap.phy_Parameters.phy_ParametersFR2 = NULLP;
6354 /* Filling RF parameters */
6356 ueNrCap.rf_Parameters.supportedBandListNR.list.count = elementCnt;
6357 ueNrCap.rf_Parameters.supportedBandListNR.list.size = elementCnt * sizeof(struct BandNR *);
6358 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array, ueNrCap.rf_Parameters.supportedBandListNR.list.size);
6359 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array)
6361 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6366 for(idx = 0; idx < elementCnt; idx++)
6368 CU_ALLOC(ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx], sizeof(struct BandNR));
6369 if(!ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx])
6379 ueNrCap.rf_Parameters.supportedBandListNR.list.array[idx]->bandNR = 1;
6380 ueNrCap.rf_Parameters.supportedBandCombinationList = NULLP;
6381 ueNrCap.rf_Parameters.appliedFreqBandListFilter = NULLP;
6383 ueNrCap.measAndMobParameters = NULLP;
6384 ueNrCap.fdd_Add_UE_NR_Capabilities = NULLP;
6385 ueNrCap.tdd_Add_UE_NR_Capabilities = NULLP;
6386 ueNrCap.fr1_Add_UE_NR_Capabilities = NULLP;
6387 ueNrCap.fr2_Add_UE_NR_Capabilities = NULLP;
6388 ueNrCap.featureSets = NULLP;
6390 CU_ALLOC(ueNrCap.featureSets, sizeof(struct FeatureSets));
6391 if(!ueNrCap.featureSets)
6393 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapRatCont");
6398 if(fillFeatureSets(ueNrCap.featureSets) != ROK)
6400 DU_LOG("\nERROR --> fillDLFeatureSets() failed ");
6405 ueNrCap.featureSetCombinations = NULLP;
6406 ueNrCap.lateNonCriticalExtension = NULLP;
6407 ueNrCap.nonCriticalExtension = NULLP;
6409 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6410 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, &ueNrCap);
6411 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6413 encRetVal = aper_encode(&asn_DEF_UE_NR_Capability, 0, &ueNrCap, PrepFinalEncBuf, encBuf);
6415 /* Encode results */
6416 if(encRetVal.encoded == ENCODE_FAIL)
6418 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6419 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6424 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6425 for(int i=0; i< encBufSize; i++)
6427 DU_LOG("%x",encBuf[i]);
6431 ueCapRatContBuf->size = encBufSize;
6432 CU_ALLOC(ueCapRatContBuf->buf, ueCapRatContBuf->size);
6433 if(!ueCapRatContBuf->buf)
6435 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6438 memcpy(ueCapRatContBuf->buf, encBuf, ueCapRatContBuf->size);
6442 freeUeCapRatCont(&ueNrCap);
6446 /*******************************************************************
6448 * @brief Fill UE Capability RAT container list
6452 * Function : fillUeCapRatContList
6454 * Functionality: Fill UE Capability RAT container list
6457 * @params[in] UE capability RAT container list buffer
6458 * @return ROK - success
6461 * ****************************************************************/
6462 uint8_t fillUeCapRatContList(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf)
6464 uint8_t ret = RFAILED;
6465 uint8_t idx, elementCnt;
6466 asn_enc_rval_t encRetVal;
6467 UE_CapabilityRAT_ContainerListRRC_t ueCapablityList;
6472 ueCapablityList.list.count = elementCnt;
6473 ueCapablityList.list.size = elementCnt * sizeof(UE_CapabilityRAT_Container_t *);
6475 CU_ALLOC(ueCapablityList.list.array, ueCapablityList.list.size);
6476 if(!ueCapablityList.list.array)
6478 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6483 for(idx=0; idx<elementCnt; idx++)
6485 CU_ALLOC(ueCapablityList.list.array[idx], sizeof(UE_CapabilityRAT_Container_t));
6486 if(ueCapablityList.list.array[idx] == NULLP)
6488 DU_LOG("\nERROR --> Memory allocation failed in fillUeCapRatContList");
6494 ueCapablityList.list.array[idx]->rat_Type = RAT_Type_nr;
6495 ret = fillUeCapRatCont(&ueCapablityList.list.array[idx]->ue_CapabilityRAT_Container);
6497 /* encode UE Capability RAT Container List into duToCuRrcContainer */
6498 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, &ueCapablityList);
6499 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6501 encRetVal = aper_encode(&asn_DEF_UE_CapabilityRAT_ContainerListRRC, 0, \
6502 &ueCapablityList, PrepFinalEncBuf, encBuf);
6504 /* Encode results */
6505 if(encRetVal.encoded == ENCODE_FAIL)
6507 DU_LOG( "\nERROR --> F1AP : Could not encode UE Capability RAT Container (at %s)\n",\
6508 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6513 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Capability RAT Container\n");
6514 for(int i=0; i< encBufSize; i++)
6516 DU_LOG("%x",encBuf[i]);
6520 ueCapablityListBuf->size = encBufSize;
6521 CU_ALLOC(ueCapablityListBuf->buf, ueCapablityListBuf->size);
6522 if(!ueCapablityListBuf->buf)
6524 DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillUeCapabilityContainer");
6527 memcpy(ueCapablityListBuf->buf, encBuf, ueCapablityListBuf->size);
6531 freeUeCapRatContList(&ueCapablityList);
6535 /*******************************************************************
6537 * @brief Fills CuToDuContainer
6541 * Function : fillCuToDuContainer
6543 * Functionality: Fills CuToDuContainer
6545 * @params[in] pointer to CUtoDURRCInformation_t
6547 * @return ROK - success
6550 ******************************************************************/
6552 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
6554 uint8_t elementCnt = 0;
6556 uint8_t idx, idx2, rrcBufLen;
6558 CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6559 if(!rrcMsg->uE_CapabilityRAT_ContainerList)
6561 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6564 ret = fillUeCapRatContList(rrcMsg->uE_CapabilityRAT_ContainerList);
6566 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6567 if(rrcMsg->iE_Extensions)
6570 rrcMsg->iE_Extensions->list.count = elementCnt;
6571 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
6573 /* Initialize the CUtoDURRCInformation_ExtIEs */
6574 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6576 if(rrcMsg->iE_Extensions->list.array == NULLP)
6578 DU_LOG("\nERROR --> F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
6582 for(idx=0; idx<elementCnt; idx++)
6584 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
6585 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
6587 DU_LOG("\nERROR --> F1AP : Memory allocation for array elements failed");
6592 /* Filling CellGroupConfig_t IE */
6593 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
6594 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
6595 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
6596 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
6597 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
6602 /*******************************************************************
6604 * @brief Free CuToDuContainer
6608 * Function : FreeCuToDuInfo
6610 * Functionality: Free CuToDuContainer
6612 * @params[in] pointer to CUtoDURRCInformation_t
6614 * @return ROK - success
6617 ******************************************************************/
6619 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
6623 if(rrcMsg->uE_CapabilityRAT_ContainerList)
6625 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
6626 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList->buf, rrcMsg->uE_CapabilityRAT_ContainerList->size);
6627 CU_FREE(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
6629 if(rrcMsg->iE_Extensions)
6631 if(rrcMsg->iE_Extensions->list.array)
6633 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
6635 if(rrcMsg->iE_Extensions->list.array[idx])
6637 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
6639 case ProtocolIE_ID_id_CellGroupConfig:
6640 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
6642 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
6643 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
6648 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
6649 rrcMsg->iE_Extensions->list.array[idx]->id);
6655 for(idx2 = 0; idx2 < idx; idx2++)
6657 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
6659 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
6663 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
6666 /*******************************************************************
6668 * @brief Builds and sends the UE Setup Request
6672 * Function : BuildAndSendUeContextSetupReq
6674 * Functionality: Constructs the UE Setup Request and sends
6675 * it to the CU through SCTP.
6679 * @return ROK - success
6682 * ****************************************************************/
6683 uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer)
6686 uint8_t SplCellListret;
6687 uint8_t SrbSetupret;
6689 uint8_t idx, bufLen;
6691 F1AP_PDU_t *f1apMsg = NULLP;
6692 UEContextSetupRequest_t *ueSetReq = NULLP;
6693 asn_enc_rval_t encRetVal; /* Encoder return value */
6694 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6695 uint8_t ret= RFAILED;
6699 DU_LOG("\nINFO --> F1AP : Building UE Context Setup Request\n");
6701 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6702 if(f1apMsg == NULLP)
6704 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6708 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6709 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
6710 if(f1apMsg->choice.initiatingMessage == NULLP)
6712 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
6716 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextSetup;
6717 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6718 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextSetupRequest;
6720 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6723 ueSetReq->protocolIEs.list.count = elementCnt;
6724 ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6726 /* Initialize the UESetup members */
6727 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6729 if(ueSetReq->protocolIEs.list.array == NULLP)
6731 DU_LOG("\nERROR --> F1AP : Memory allocation for UE Context SetupRequest failed");
6735 for(idx1=0; idx1<elementCnt; idx1++)
6737 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6738 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6746 /*GNB CU UE F1AP ID*/
6747 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6748 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6749 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6750 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
6752 /*GNB DU UE F1AP ID*/
6754 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6755 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6756 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6757 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
6761 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCell_ID;
6762 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6763 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_NRCGI;
6764 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI, ueCb->cellCb->nrCellId);
6770 /*Served Cell Index*/
6772 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ServCellIndex;
6773 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6774 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_ServCellIndex;
6775 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = CELL_INDEX;
6777 /*CellULConfigured*/
6779 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SpCellULConfigured;
6780 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6781 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CellULConfigured;
6782 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = CellULConfigured_none;
6784 /*CUtoDURRCContainer*/
6786 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_CUtoDURRCInformation;
6787 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6788 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6789 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
6794 /*Special Cells to be SetupList*/
6796 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_List;
6797 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6798 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6799 SplCellListret = BuildSplCellList(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6800 if(SplCellListret != ROK)
6805 /*SRBs To Be Setup List*/
6807 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6808 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6809 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6810 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6811 if(SrbSetupret != ROK)
6816 /*DRBs to Be Setup List*/
6818 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6819 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6820 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6821 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6826 /* RRC Container for security mode */
6828 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
6829 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6830 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer;
6832 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
6834 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
6835 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
6836 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
6837 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
6839 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
6842 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
6843 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
6845 /* RRC delivery status request */
6847 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
6848 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6849 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
6850 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
6852 /* Bit Rate hardcoded as in reference logs */
6854 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
6855 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6856 ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_BitRate;
6858 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
6860 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
6861 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
6862 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
6863 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
6865 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
6868 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
6869 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
6871 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6873 /* Encode the F1SetupRequest type as APER */
6874 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6876 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6878 /* Encode results */
6879 if(encRetVal.encoded == ENCODE_FAIL)
6881 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6882 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6887 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for UE Context Setup Request\n");
6888 for(int i=0; i< encBufSize; i++)
6890 DU_LOG("%x",encBuf[i]);
6895 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
6897 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
6903 FreeUeContextSetupReq(f1apMsg);
6906 }/* End of BuildAndSendUeContextSetupReq*/
6908 /**********************************************************************
6909 * @brief Function to extractTeId received in UE context setup Response
6913 * Function : extractTeId
6916 * - Function to extract TeId
6919 * @return ROK - success
6922 **********************************************************************/
6923 uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
6927 GTPTunnel_t *gtpDl = NULLP;
6929 for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
6931 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
6933 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
6935 gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
6936 if(gtpDl->gTP_TEID.size > 0)
6938 teIdStringToInt(gtpDl->gTP_TEID.buf, &teId);
6941 DU_LOG("\nERROR --> EGTP: No TeId received");
6949 /****************************************************************
6950 * @brief Function to add Drb tunnels
6954 * Function : addDrbTunnels
6957 * - Function to add Drb tunnels
6960 * @return ROK - success
6963 * ****************************************************************/
6964 uint8_t addDrbTunnels(uint8_t teId)
6969 if(teId > MAX_TEID || teId < MIN_TEID)
6971 DU_LOG("\nERROR --> EGTP : TEID(%x) OUT Of Range",teId);
6973 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
6974 tnlEvt.action = EGTP_TNL_MGMT_ADD;
6975 tnlEvt.lclTeid = teId;
6976 tnlEvt.remTeid = teId;
6977 ret = cuEgtpTnlMgmtReq(tnlEvt);
6980 DU_LOG("\nERROR --> EGTP : Tunnel management request failed for teId %x", teId);
6985 /****************************************************************
6986 * @brief Function to process Drb Setup List
6990 * Function : procDrbSetupList
6993 * - Function to process DRB Setup List
6996 * @return ROK - success
6999 * ****************************************************************/
7000 uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
7004 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
7006 if(drbSetupList != NULLP)
7008 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
7010 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
7011 if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
7013 /* extracting teId */
7014 teId = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
7017 if(addDrbTunnels(teId)== ROK)
7019 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
7030 /****************************************************************
7031 * @brief Function to process Ue Context Setup Response
7035 * Function : procUeContextSetupResponse
7038 * - Function to process Ue Context Setup Response
7041 * @return ROK - success
7044 * ****************************************************************/
7045 uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
7047 uint8_t duIdx=0, idx, duUeF1apId;
7050 UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
7052 SEARCH_DU_DB(duIdx, duId, duDb);
7053 ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
7055 for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
7057 switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
7059 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7061 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7062 ueCb = &duDb->ueCb[duUeF1apId-1];
7065 case ProtocolIE_ID_id_DRBs_Setup_List:
7067 /* Adding Tunnels for successful DRB */
7068 procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
7074 ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
7078 /****************************************************************
7079 * @brief Function to process Ul Rrc Msg received from DU
7083 * Function : procUlRrcMsg
7086 * - Function to process Ul Rrc Msg received from DU
7089 * @return ROK - success
7092 * ****************************************************************/
7094 uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
7096 uint8_t idx, ret, srbId, rrcMsgType, duIdx=0;
7097 uint8_t cuUeF1apId, duUeF1apId;
7098 uint8_t *rrcContainer = NULLP;
7099 uint16_t rrcContLen;
7102 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
7105 SEARCH_DU_DB(duIdx, duId, duDb);
7106 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
7108 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
7110 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
7112 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7114 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
7117 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7119 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
7122 case ProtocolIE_ID_id_SRBID:
7123 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
7126 case ProtocolIE_ID_id_RRCContainer:
7128 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
7129 CU_ALLOC(rrcContainer, rrcContLen);
7132 DU_LOG("\nERROR --> F1AP : Failed to allocated memory in procUlRrcMsg");
7135 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen);
7140 DU_LOG("\nERROR --> F1AP : Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
7147 ueCb = &duDb->ueCb[duUeF1apId-1];
7148 ueCb->f1apMsgDb.dlRrcMsgCount++;
7149 rrcMsgType = setDlRRCMsgType(ueCb);
7150 if(rrcMsgType == REGISTRATION_ACCEPT)
7152 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept");
7153 ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
7155 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
7157 DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req");
7158 ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer);
7160 if(rrcMsgType == SECURITY_MODE_COMPLETE)
7162 /* To trigger the DL RRC Msg for RRC Reconfig */
7163 ueCb->f1apMsgDb.dlRrcMsgCount++;
7164 rrcMsgType = setDlRRCMsgType(ueCb);
7165 if(rrcMsgType == RRC_RECONFIG)
7167 DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig");
7168 BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType);
7171 if(rrcMsgType == RRC_RECONFIG_COMPLETE)
7173 ueCb->state = UE_ACTIVE;
7174 ueCb->f1apMsgDb.dlRrcMsgCount++;
7175 rrcMsgType = setDlRRCMsgType(ueCb);
7176 if(rrcMsgType == UE_CONTEXT_MOD_REQ)
7178 DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request");
7179 BuildAndSendUeContextModificationReq(duId, ueCb, MODIFY_UE);
7186 /****************************************************************
7187 * @brief Build And Send F1ResetAck
7191 * Function : FreeF1ResetAck
7194 * - Build And Send F1ResetRSP
7197 * @return ROK - success
7200 * ****************************************************************/
7201 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7204 ResetAcknowledge_t *f1ResetAck;
7208 if(f1apMsg->choice.successfulOutcome)
7210 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7212 if(f1ResetAck->protocolIEs.list.array)
7214 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7216 if(f1ResetAck->protocolIEs.list.array[idx])
7218 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7221 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7223 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7225 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7229 /****************************************************************
7230 * @brief Build And Send F1ResetAck
7234 * Function : BuildAndSendF1ResetAck
7237 * - Build And Send F1ResetRSP
7240 * @return ROK - success
7243 * ****************************************************************/
7245 uint8_t BuildAndSendF1ResetAck()
7248 uint8_t elementCnt = 0;
7249 uint8_t ret = RFAILED;
7250 F1AP_PDU_t *f1apMsg = NULL;
7251 ResetAcknowledge_t *f1ResetAck = NULLP;
7252 asn_enc_rval_t encRetVal;
7253 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
7256 /* Allocate the memory for F1ResetRequest_t */
7257 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7258 if(f1apMsg == NULLP)
7260 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7264 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7266 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7267 if(f1apMsg->choice.successfulOutcome == NULLP)
7269 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7273 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
7274 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7275 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7276 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7280 f1ResetAck->protocolIEs.list.count = elementCnt;
7281 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7283 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7284 if(f1ResetAck->protocolIEs.list.array == NULLP)
7286 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
7290 for(idx=0; idx<elementCnt; idx++)
7292 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7293 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7300 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7301 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7302 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7303 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7305 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7307 /* Encode the F1SetupRequest type as UPER */
7308 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7310 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7312 /* Check encode results */
7313 if(encRetVal.encoded == ENCODE_FAIL)
7315 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
7316 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7321 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for F1ResetAck \n");
7322 for(int i=0; i< encBufSize; i++)
7324 DU_LOG("%x",encBuf[i]);
7329 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
7330 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, DU_ID) != ROK)
7332 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Response failed");
7340 FreeF1ResetAck(f1apMsg);
7344 void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
7348 if(ulInfo->list.array)
7350 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
7352 if(ulInfo->list.array[arrIdx])
7354 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
7356 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
7358 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
7360 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7361 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7362 gTPTunnel->gTP_TEID.size);
7364 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7365 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7366 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7368 CU_FREE(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7369 sizeof(GTPTunnel_t));
7371 CU_FREE(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7374 CU_FREE(ulInfo->list.array,ulInfo->list.size);
7378 /*******************************************************************
7380 * @brief Deletes the EGTP tunnel
7384 * Function : deleteEgtpTunnel
7386 * Functionality: Deletes the EGTP tunnel
7388 * @params[in] uint8_t *buf
7390 * @return ROK - success
7393 * ****************************************************************/
7394 uint8_t deleteEgtpTunnel(uint8_t *buf)
7399 teIdStringToInt(buf, &teId);
7400 if(teId > MAX_TEID || teId < MIN_TEID)
7402 DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId);
7405 memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
7406 tnlEvt.action = EGTP_TNL_MGMT_DEL;
7407 tnlEvt.lclTeid = teId;
7408 tnlEvt.remTeid = teId;
7409 if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
7411 DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId);
7416 /*******************************************************************
7418 * @brief Builds the Uplink Tunnel Info
7422 * Function : BuildUlTnlInfoforSetupMod
7424 * Functionality: Constructs the UL TnlInfo For DRB list
7426 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
7428 * @return ROK - success
7431 * ****************************************************************/
7432 uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
7438 ulInfo->list.count = ulCnt;
7439 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
7440 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
7441 if(ulInfo->list.array == NULLP)
7443 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7446 for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
7448 CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
7449 if(ulInfo->list.array[arrIdx] == NULLP)
7451 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7457 ulInfo->list.array[arrIdx]->uLUPTNLInformation.present = \
7458 UPTransportLayerInformation_PR_gTPTunnel;
7461 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel,\
7462 sizeof(GTPTunnel_t));
7463 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
7465 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7468 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7469 transportLayerAddress.size = 4*sizeof(uint8_t);
7470 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7471 transportLayerAddress.buf,ulInfo->list.array[arrIdx]->\
7472 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
7473 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7474 transportLayerAddress.buf == NULLP)
7476 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7480 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7481 transportLayerAddress.buf[0] = 192;
7482 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7483 transportLayerAddress.buf[1] = 168;
7484 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7485 transportLayerAddress.buf[2] = 130;
7486 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7487 transportLayerAddress.buf[3] = 82;
7488 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7489 transportLayerAddress.bits_unused = 0;
7492 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
7493 = 4 * sizeof(uint8_t);
7494 CU_ALLOC(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7495 gTP_TEID.buf,ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.\
7496 gTPTunnel->gTP_TEID.size);
7497 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
7500 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
7503 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7504 gTP_TEID.buf[0] = 0;
7505 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7506 gTP_TEID.buf[1] = 0;
7507 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7508 gTP_TEID.buf[2] = 0;
7509 if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
7511 /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
7512 * fetched based on the Drb Id */
7514 /*For For UE Id=1, DRB=2 is modified. For UE Id = 2, DRB=5 is modified and so on.*/
7515 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3]=\
7516 (MAX_NUM_DRB_ADDED_PER_UE *(ueId - 1)) + drbId;
7520 ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
7521 gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
7524 }/*End of BuildULTnlInfo*/
7526 /*******************************************************************
7528 * @brief freeing the DRB item
7532 * Function : FreeDrbItem
7534 * Functionality: freeing the DRB item
7536 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7538 * @return ROK - success
7541 * ****************************************************************/
7543 void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
7546 SNSSAI_t *snssai =NULLP;
7547 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
7549 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7550 switch(drbItem->qoSInformation.present)
7552 case QoSInformation_PR_NOTHING:
7554 case QoSInformation_PR_eUTRANQoS:
7556 if(drbItem->qoSInformation.choice.eUTRANQoS)
7558 CU_FREE(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7562 case QoSInformation_PR_choice_extension:
7564 if(drbItem->qoSInformation.choice.choice_extension)
7566 FreeQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
7568 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
7571 CU_FREE(snssai->sST.buf,snssai->sST.size);
7577 CU_FREE(snssai->sD->buf,snssai->sD->size);
7579 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
7582 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
7583 if(flowMap->list.array)
7585 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
7587 if(flowMap->list.array[arrIdx] )
7589 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
7590 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
7593 CU_FREE(flowMap->list.array,flowMap->list.size);
7596 CU_FREE(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7602 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
7603 if(drbItem->uLConfiguration)
7605 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
7609 /*******************************************************************
7611 * @brief filling the DRB setup Mod item
7615 * Function : FillDrbItemToSetupMod
7617 * Functionality: filling the DRB setup Mod item
7620 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
7622 * @return ROK - success
7625 * ****************************************************************/
7627 uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
7632 drbItem->dRBID = arrIdx + DRB_ID_TO_ADD_MOD;
7635 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
7637 switch(drbItem->qoSInformation.present)
7639 case QoSInformation_PR_NOTHING:
7643 case QoSInformation_PR_eUTRANQoS:
7646 CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7647 if(drbItem->qoSInformation.choice.eUTRANQoS)
7649 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7652 drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
7653 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7654 PriorityLevel_no_priority;
7656 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7657 Pre_emptionCapability_may_trigger_pre_emption;
7659 drbItem->qoSInformation.choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7660 Pre_emptionVulnerability_pre_emptable;
7664 case QoSInformation_PR_choice_extension:
7666 CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7667 if(drbItem->qoSInformation.choice.choice_extension == NULLP)
7669 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7673 drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7674 drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
7675 drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7676 ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7677 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
7680 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7685 ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
7686 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[1]);
7689 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7693 /*Flows mapped to DRB List*/
7694 ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
7695 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7696 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7699 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7705 /*ULUPTNLInformation To Be Setup List*/
7706 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
7707 ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
7710 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7715 drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
7719 /*******************************************************************
7721 * @brief Builds the DRB to be Setup Mod ItemIes
7725 * Function : FillDrbItemList
7727 * Functionality: Constructs the DRB to be Setup Mod Item Ies
7729 * @params[in] struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe
7731 * @return ROK - success
7734 * ****************************************************************/
7736 uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
7738 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
7739 drbItemIe->criticality = Criticality_reject;
7740 drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
7742 if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
7744 DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed");
7749 /*******************************************************************
7751 * @brief free the DRB to be Setup Mod list
7755 * Function : FreeDrbToBeSetupModList
7757 * Functionality: free the DRB to be Setup Mod list
7759 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7761 * @return ROK - success
7764 * ****************************************************************/
7765 void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
7768 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
7770 if(drbSet->list.array)
7772 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
7774 if(drbSet->list.array[arrIdx] != NULLP)
7778 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
7779 FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
7781 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7784 CU_FREE(drbSet->list.array, drbSet->list.size);
7789 /*******************************************************************
7791 * @brief Builds the DRB to be Setup Mod list
7795 * Function : BuildDrbToBeSetupList
7797 * Functionality: Constructs the DRB to be Setup Mod list
7799 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
7801 * @return ROK - success
7804 * ****************************************************************/
7806 uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
7812 drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
7813 drbSet->list.count = drbCnt;
7814 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
7815 CU_ALLOC(drbSet->list.array, drbSet->list.size);
7816 if(drbSet->list.array == NULLP)
7818 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
7822 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
7824 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
7825 if(drbSet->list.array[arrIdx] == NULLP)
7827 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
7831 ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
7834 DU_LOG("\nERROR --> F1AP : FillDrbItemList failed");
7841 /*******************************************************************
7843 * @brief Filling the DRB to be modified item
7847 * Function : FillDrbToBeModItem
7849 * Functionality: filling the DRB to be modified item
7851 * @params[in] DRBs_ToBeModified_Item_t *drbItem
7853 * @return ROK - success
7856 * ****************************************************************/
7858 uint8_t FillDrbToBeModItem(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
7863 drbItem->dRBID = DRB2 + arrIdx;
7866 drbItem->qoSInformation = NULLP;
7867 CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
7868 if(drbItem->qoSInformation != NULLP)
7870 drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
7872 switch(drbItem->qoSInformation->present)
7874 case QoSInformation_PR_NOTHING:
7878 case QoSInformation_PR_eUTRANQoS:
7881 CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
7882 if(drbItem->qoSInformation->choice.eUTRANQoS)
7884 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem");
7887 drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
7888 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
7889 PriorityLevel_no_priority;
7891 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
7892 Pre_emptionCapability_may_trigger_pre_emption;
7894 drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
7895 Pre_emptionVulnerability_pre_emptable;
7899 case QoSInformation_PR_choice_extension:
7901 CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
7902 if(drbItem->qoSInformation->choice.choice_extension == NULLP)
7904 DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod");
7908 drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
7909 drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
7910 drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
7911 ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
7912 ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
7915 DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed");
7920 ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
7921 choice_extension->value.choice.DRB_Information.sNSSAI, cuCb.snssaiList[0]);
7924 DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed");
7928 /*Flows mapped to DRB List*/
7929 ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
7930 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
7931 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7934 DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed");
7941 /*ULUPTNLInformation To Be Setup List*/
7942 ret = BuildUlTnlInfoforSetupMod(ueId, drbItem->dRBID, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
7943 ProtocolIE_ID_id_DRBs_ToBeModified_Item);
7946 DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed");
7952 /*******************************************************************
7954 * @brief Builds the DRB to be modified Item IE
7958 * Function : FillDrbToBeModItemList
7960 * Functionality: Constructs the DRB to be modified Mod Item Ies
7962 * @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
7964 * @return ROK - success
7967 * ****************************************************************/
7969 uint8_t FillDrbToBeModItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
7971 drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
7972 drbItemIe->criticality = Criticality_reject;
7973 drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
7974 if(FillDrbToBeModItem(ueId, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
7976 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed");
7983 /*******************************************************************
7985 * @brief Builds the DRB to be modified list
7989 * Function : BuildDrbToBeModList
7991 * Functionality: Constructs the DRB to be modified list
7993 * @params[in] DRBs_ToBeModified_List_t *drbSet
7995 * @return ROK - success
7998 * ****************************************************************/
8000 uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
8006 drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
8007 drbSet->list.count = drbCnt;
8008 drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
8009 CU_ALLOC(drbSet->list.array, drbSet->list.size);
8010 if(drbSet->list.array == NULLP)
8012 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
8015 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
8017 CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8018 if(drbSet->list.array[arrIdx] == NULLP)
8020 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList");
8024 ret = FillDrbToBeModItemList(ueId, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
8027 DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed");
8034 /*******************************************************************
8036 * @brief freeing the DRB item
8040 * Function : FreeModifiedDrbItem
8042 * Functionality: freeing the DRB 2 item
8044 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
8046 * @return ROK - success
8049 * ****************************************************************/
8051 void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
8054 SNSSAI_t *snssai =NULLP;
8055 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
8057 if(drbItem->qoSInformation != NULLP)
8059 switch(drbItem->qoSInformation->present)
8061 case QoSInformation_PR_NOTHING:
8063 case QoSInformation_PR_eUTRANQoS:
8065 if(drbItem->qoSInformation->choice.eUTRANQoS)
8067 CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
8071 case QoSInformation_PR_choice_extension:
8073 if(drbItem->qoSInformation->choice.choice_extension)
8075 FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
8077 snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
8080 CU_FREE(snssai->sST.buf,snssai->sST.size);
8086 CU_FREE(snssai->sD->buf,snssai->sD->size);
8088 CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
8091 flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
8092 if(flowMap->list.array)
8094 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
8096 if(flowMap->list.array[arrIdx] )
8098 FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
8099 CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
8102 CU_FREE(flowMap->list.array,flowMap->list.size);
8105 CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
8111 FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
8112 if(drbItem->uLConfiguration)
8114 CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
8118 /*******************************************************************
8120 * @brief free the DRB to be modfified list
8124 * Function : FreeDrbToBeModifiedList
8126 * Functionality: free the DRB to be Setup Mod list
8128 * @params[in] FreeDrbToBeModifiedList_t *drbSet
8130 * @return ROK - success
8133 * ****************************************************************/
8134 void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
8137 struct DRBs_ToBeModified_ItemIEs *drbItemIe;
8139 if(drbSet->list.array)
8141 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
8143 if(drbSet->list.array[arrIdx] != NULLP)
8145 drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
8146 FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
8147 CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
8150 CU_FREE(drbSet->list.array, drbSet->list.size);
8155 /*******************************************************************
8157 * @brief free the UeContextModification Request
8161 * Function : FreeUeContextModicationRequest
8163 * Functionality : deallocation of memory allocated in UeContextModiification
8166 * @params[in] F1AP_PDU_t *f1apMsg
8170 * ****************************************************************/
8171 void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
8173 uint8_t arrIdx =0 , ieId=0;
8174 UEContextModificationRequest_t *UeContextModifyReq = NULLP;
8178 if(f1apMsg->choice.initiatingMessage)
8180 UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8181 if(UeContextModifyReq->protocolIEs.list.array)
8183 for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
8185 if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
8187 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
8190 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8192 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8194 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
8196 FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8197 choice.DRBs_ToBeSetupMod_List);
8200 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
8202 FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
8203 choice.DRBs_ToBeSetupMod_List);
8208 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
8211 CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
8213 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8215 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8219 /*******************************************************************
8221 * @brief Builds the Ue Context Modification Req
8225 * Function : BuildAndSendUeContextModificationReq
8227 * Functionality: Constructs the Ue Context Modification Req
8231 * @return ROK - success
8234 * ****************************************************************/
8235 uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxtModAction action)
8238 uint8_t elementCnt = 0;
8239 uint8_t ret = RFAILED;
8240 CuUeCb *ueCb = (CuUeCb *)cuUeCb;
8241 F1AP_PDU_t *f1apMsg = NULLP;
8242 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
8244 asn_enc_rval_t encRetVal;
8245 DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n");
8249 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8250 if(f1apMsg == NULLP)
8252 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8256 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8258 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8259 if(f1apMsg->choice.initiatingMessage == NULLP)
8261 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
8264 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
8265 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8266 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
8268 ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
8270 if(action == MODIFY_UE)
8272 else if(action == QUERY_CONFIG)
8274 ueContextModifyReq->protocolIEs.list.count = elementCnt;
8275 ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
8277 /* Initialize the UE context modification members */
8278 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
8279 if(ueContextModifyReq->protocolIEs.list.array == NULLP)
8281 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8285 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8287 CU_ALLOC(ueContextModifyReq->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationRequest_t));
8288 if(ueContextModifyReq->protocolIEs.list.array[ieIdx] == NULLP)
8290 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
8296 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8297 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8298 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8299 UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
8300 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
8303 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8304 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8305 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
8306 UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
8307 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
8309 if(action == MODIFY_UE)
8311 /* DRB to be setup list */
8313 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
8314 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8315 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8316 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
8317 ret = BuildDrbToBeSetupList(ueCb->gnbCuUeF1apId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8318 value.choice.DRBs_ToBeSetupMod_List));
8320 /* DRB to be modified list */
8322 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
8323 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8324 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
8325 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
8326 ret = BuildDrbToBeModifiedList(ueCb->gnbCuUeF1apId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
8327 value.choice.DRBs_ToBeModified_List));
8329 /* TODO: DRB to be release list */
8336 else if(action == QUERY_CONFIG)
8339 ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_GNB_DUConfigurationQuery;
8340 ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8341 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
8342 UEContextModificationRequestIEs__value_PR_GNB_DUConfigurationQuery;
8343 ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DUConfigurationQuery = GNB_DUConfigurationQuery_true;
8346 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8348 /* Encode the F1SetupRequest type as APER */
8349 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8351 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
8353 /* Encode results */
8354 if(encRetVal.encoded == ENCODE_FAIL)
8356 DU_LOG("\nERROR --> F1AP : Could not encode ueContextModifyReq structure (at %s)\n",\
8357 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8362 DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
8363 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8365 DU_LOG("%x",encBuf[ieIdx]);
8369 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
8370 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
8372 DU_LOG("\nERROR --> F1AP : Sending Ue context modification request failed");
8380 FreeUeContextModicationRequest(f1apMsg);
8384 /*****************************************************************i
8386 * @brief Free memory allocated for UE Context Release Command
8390 * Function : FreeUeContextReleaseCommand
8393 * - Free memory allocated for UE Context Release Command
8395 * @params[in] F1AP_PDU_t *f1apMsg
8398 * *************************************************************/
8399 void FreeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
8402 UEContextReleaseCommand_t *ueReleaseCommand = NULLP;
8406 if(f1apMsg->choice.initiatingMessage)
8408 ueReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8409 if(ueReleaseCommand->protocolIEs.list.array)
8411 for(ieIdx=0 ; ieIdx<ueReleaseCommand->protocolIEs.list.count; ieIdx++)
8413 CU_FREE(ueReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8415 CU_FREE(ueReleaseCommand->protocolIEs.list.array, ueReleaseCommand->protocolIEs.list.size);
8417 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8419 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8422 /*******************************************************************
8424 * @brief Builds the Ue Context Release Command
8428 * Function : BuildAndSendUeContextReleaseCommand
8430 * Functionality: Constructs the Ue Context Release Command
8434 * @return ROK - success
8437 * ****************************************************************/
8438 uint8_t BuildAndSendUeContextReleaseCommand(uint32_t duId, uint8_t cuUeF1apId, uint8_t duUeF1apId)
8440 bool memAllocFailed = false;
8441 uint8_t ieIdx = 0,elementCnt = 0, ret = RFAILED, bufLen=0;
8442 F1AP_PDU_t *f1apMsg = NULLP;
8443 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
8445 asn_enc_rval_t encRetVal;
8446 DU_LOG("\nINFO --> F1AP : Building Ue context release command\n");
8450 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8451 if(f1apMsg == NULLP)
8453 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU");
8457 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8459 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8460 if(f1apMsg->choice.initiatingMessage == NULLP)
8462 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation for F1AP-PDU failed ");
8465 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextRelease;
8466 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8467 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;
8469 ueContextReleaseCommand =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
8472 ueContextReleaseCommand->protocolIEs.list.count = elementCnt;
8473 ueContextReleaseCommand->protocolIEs.list.size = elementCnt*sizeof(UEContextReleaseCommand_t*);
8475 /* Initialize the UE context modification members */
8476 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array, ueContextReleaseCommand->protocolIEs.list.size);
8477 if(ueContextReleaseCommand->protocolIEs.list.array == NULLP)
8479 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand():Memory allocation failed");
8483 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
8485 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseCommand_t));
8486 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx] == NULLP)
8488 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseCommand(): Memory allocation failed ");
8489 memAllocFailed = true;
8494 if(memAllocFailed == true)
8499 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8500 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8501 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8502 UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
8503 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =cuUeF1apId;
8506 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8507 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
8508 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8509 UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
8510 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =duUeF1apId;
8513 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cause;
8514 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8515 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present=\
8516 UEContextReleaseCommandIEs__value_PR_Cause;
8517 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8518 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.Cause.choice.radioNetwork=\
8519 CauseRadioNetwork_normal_release;
8521 /* RRC Container for RRC release */
8523 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
8524 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
8525 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.present = \
8526 UEContextReleaseCommandIEs__value_PR_RRCContainer;
8527 char secModeBuf[7]={ 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00};
8529 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = bufLen;
8530 CU_ALLOC(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
8531 ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
8532 if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
8534 DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
8537 memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
8538 memcpy(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
8540 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8542 /* Encode the UE Context Release Command type as APER */
8543 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8545 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8548 /* Encode results */
8549 if(encRetVal.encoded == ENCODE_FAIL)
8551 DU_LOG("\nERROR --> F1AP : Could not encode Release Command structure (at %s)\n",\
8552 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8557 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Ue Context Release Command\n");
8558 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
8560 DU_LOG("%x",encBuf[ieIdx]);
8564 /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
8565 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
8567 DU_LOG("\nERROR --> F1AP : Sending Ue context Release Command failed");
8575 FreeUeContextReleaseCommand(f1apMsg);
8578 /*******************************************************************
8580 * @brief process Ue context release request
8584 * Function : procUeContextReleaseReq
8587 * - process Ue context release request
8589 * @params[in] F1AP_PDU_t *f1apMsg
8590 * @return ROK - success
8593 * ****************************************************************/
8594 uint8_t procUeContextReleaseReq(uint32_t duId, F1AP_PDU_t *f1apMsg)
8596 uint8_t ieIdx=0, duUeF1apId=0,cuUeF1apId=0;
8598 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
8599 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
8601 for(ieIdx=0; ieIdx < ueReleaseReq->protocolIEs.list.count; ieIdx++)
8603 switch(ueReleaseReq->protocolIEs.list.array[ieIdx]->id)
8605 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8607 cuUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
8610 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8612 duUeF1apId = ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
8620 if(BuildAndSendUeContextReleaseCommand(duId, cuUeF1apId, duUeF1apId) != ROK)
8622 DU_LOG("\nERROR --> F1AP : procUeContextReleaseReq(): Failed to build Ue Context Release Command ");
8627 /*******************************************************************
8629 * @brief processing of Gnb-DU config update
8633 * Function : procGnbDuUpdate
8636 * - processing of Gnb-DU config update
8638 * @params[in] F1AP_PDU_t *f1apMsg
8639 * @return ROK - success
8642 * ****************************************************************/
8643 uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg)
8645 bool cellToBeDelete = false;
8646 uint8_t ieIdx = 0, ueIdx = 0, duIdx = 0, cellIdx=0;
8650 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
8652 duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
8653 for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
8655 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
8657 case ProtocolIE_ID_id_TransactionID:
8659 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
8661 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
8663 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \
8664 (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
8665 Served_Cells_To_Delete_List.list.array[0];
8666 nrCellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\
8667 deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused;
8668 cellToBeDelete = true;
8671 case ProtocolIE_ID_id_gNB_DU_ID:
8675 if(BuildAndSendDUUpdateAck(duId) != ROK)
8677 DU_LOG("ERROR --> F1AP : Failed to build and send DUUpdateAck");
8681 /* We don't require F1 Reset message in Cell Up and Broadcast Procedure flow, So that's why
8682 * commented this trigger for now */
8684 if(cellToBeDelete == false)
8686 DU_LOG("\nINFO --> F1AP : Sending F1 reset request");
8687 if(BuildAndSendF1ResetReq() != ROK)
8689 DU_LOG("ERROR --> F1AP : Failed to build and send F1 reset request");
8694 if(cellToBeDelete == true)
8696 SEARCH_DU_DB(duIdx, duId, duDb);
8697 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
8698 for(ueIdx = 0; ueIdx < cellCb->numUe; ueIdx++)
8700 CU_FREE(cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.buf, cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.size);
8701 memset(cellCb->ueCb[ueIdx], 0, sizeof(CuUeCb));
8708 /*******************************************************************
8710 * @brief storing slice list in CU database
8714 * Function : buildSliceList
8717 * - storing slice list in CU database
8719 * @params[in] SliceSupportList_t *sliceSupportList
8720 * @return ROK - success
8723 * ****************************************************************/
8724 uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
8726 uint8_t sliceListIdx = 0;
8728 if(sliceSupportList)
8730 if(sliceSupportList->list.array)
8732 cuCb.numSnssaiSupported = sliceSupportList->list.count;
8733 for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
8735 if(sliceSupportList->list.array[sliceListIdx])
8737 CU_ALLOC(cuCb.snssaiList[sliceListIdx], sizeof(Snssai));
8738 if(cuCb.snssaiList[sliceListIdx] == NULLP)
8740 DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed");
8743 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
8745 memcpy(&cuCb.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
8746 sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
8748 if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
8750 memcpy(&cuCb.snssaiList[sliceListIdx]->sd,\
8751 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
8752 sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
8761 /****************************************************************
8762 * @brief Function to process Drb Setup Mod List
8766 * Function : procDrbSetupModList
8769 * - Function to process DRB Setup Mod List
8772 * @return ROK - success
8775 * ****************************************************************/
8776 uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
8780 struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
8782 if(drbSetupList != NULLP)
8784 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
8786 drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
8787 if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
8789 /* extracting teId */
8790 teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
8793 if(addDrbTunnels(teId)== ROK)
8795 DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId);
8806 /*******************************************************************
8808 * @brief processing of GNB_DU_Served_Cells Plmn list information
8812 * Function : procServedCellPlmnList
8815 * - processing of GNB_DU_Served_Cells Plmn list information for storing
8818 * @params[in] F1AP_PDU_t *f1apMsg
8819 * @return ROK - success
8822 * ****************************************************************/
8823 uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
8825 uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
8826 ProtocolExtensionContainer_4624P3_t **ieExtend;
8828 if(srvPlmn->list.array)
8830 for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
8832 if(srvPlmn->list.array[srvPlmnIdx])
8834 ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
8837 if((*ieExtend)->list.array)
8839 for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
8841 if((*ieExtend)->list.array[ieExtensionsLstIdx])
8843 switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
8845 case ProtocolIE_ID_id_TAISliceSupportList:
8847 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
8848 extensionValue.choice.SliceSupportList) != ROK)
8850 DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
8865 /****************************************************************
8866 * @brief Function to process Ue Context Modification Response
8870 * Function : procUeContextModificationResponse
8873 * - Function to process Ue Context Modification Response
8876 * @return ROK - success
8879 * ****************************************************************/
8880 uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
8882 uint8_t idx=0, duIdx=0, duUeF1apId;
8885 UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
8887 SEARCH_DU_DB(duIdx, duId, duDb);
8888 ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
8890 for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
8892 switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
8894 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8896 duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8897 ueCb = &duDb->ueCb[duUeF1apId-1];
8898 if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
8900 /* TODO : Next procedure i.e. UE context setup request to
8901 * target DU should be triggerred here */
8906 case ProtocolIE_ID_id_DRBs_SetupMod_List:
8908 /* Adding Tunnels for successful DRB */
8909 procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
8919 /*******************************************************************
8921 * @brief processing of F1 setup request
8925 * Function : procF1SetupReq
8928 * - processing of F1 setup request
8930 * @params[in] F1AP_PDU_t *f1apMsg
8931 * @return ROK - success
8934 * ****************************************************************/
8935 void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg)
8937 uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0;
8938 uint32_t duId = 0, nrCellId = 0;
8940 CuCellCb *cellCb = NULLP;
8941 BIT_STRING_t nrcellIdentity;
8942 F1SetupRequest_t *f1SetupReq = NULLP;
8943 GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP;
8944 GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
8946 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
8947 for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
8949 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
8951 case ProtocolIE_ID_id_gNB_DU_ID:
8953 duId = f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0];
8954 SEARCH_DU_DB(duIdx, duId, duDb);
8957 duDb = &cuCb.duInfo[cuCb.numDu];
8958 memset(duDb, 0, sizeof(DuDb));
8967 case ProtocolIE_ID_id_gNB_DU_Name:
8969 strcpy((char *)duDb->duName, (char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf);
8972 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
8974 duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
8975 if(duServedCell->list.array)
8977 for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
8979 if(duServedCell->list.array[plmnidx])
8981 switch(duServedCell->list.array[plmnidx]->id)
8983 case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
8985 srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
8986 ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
8987 memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t));
8989 nrCellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused;
8990 SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
8993 cellCb = &duDb->cellCb[duDb->numCells];
8994 memset(cellCb, 0, sizeof(CuCellCb));
8995 cellCb->nrCellId = nrCellId;
9008 BuildAndSendF1SetupRsp(duId, &nrcellIdentity);
9012 DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
9016 /*******************************************************************
9018 * @brief Handles received F1AP message and sends back response
9022 * Function : F1APMsgHdlr
9025 * - Decodes received F1AP control message
9026 * - Prepares response message, encodes and sends to SCTP
9029 * @return ROK - success
9032 * ****************************************************************/
9033 void F1APMsgHdlr(uint32_t *duId, Buffer *mBuf)
9039 F1AP_PDU_t *f1apMsg = NULLP;
9040 asn_dec_rval_t rval; /* Decoder return value */
9041 F1AP_PDU_t f1apasnmsg ;
9043 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
9044 ODU_PRINT_MSG(mBuf, 0,0);
9046 /* Copy mBuf into char array to decode it */
9047 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
9048 CU_ALLOC(recvBuf, (Size)recvBufLen);
9050 if(recvBuf == NULLP)
9052 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
9055 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
9057 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
9061 DU_LOG("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
9062 for(i=0; i< recvBufLen; i++)
9064 DU_LOG("%x",recvBuf[i]);
9067 /* Decoding flat buffer into F1AP messsage */
9068 f1apMsg = &f1apasnmsg;
9069 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
9071 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
9072 CU_FREE(recvBuf, (Size)recvBufLen);
9074 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9076 DU_LOG("\nERROR --> F1AP : ASN decode failed");
9080 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9082 switch(f1apMsg->present)
9084 case F1AP_PDU_PR_initiatingMessage:
9086 switch(f1apMsg->choice.initiatingMessage->value.present)
9088 case InitiatingMessage__value_PR_Reset:
9090 DU_LOG("\nINFO --> F1AP : F1 reset request received ");
9091 BuildAndSendF1ResetAck();
9095 case InitiatingMessage__value_PR_F1SetupRequest:
9097 DU_LOG("\nINFO --> F1AP : F1 setup request received");
9098 procF1SetupReq(duId, f1apMsg);
9102 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
9104 DU_LOG("\nINFO --> F1AP : GNB-DU config update received");
9105 procGnbDuUpdate(*duId, f1apMsg);
9108 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
9110 DU_LOG("\nINFO --> F1AP : Received InitialULRRCMessageTransfer");
9111 procInitULRRCMsg(*duId, f1apMsg);
9114 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
9116 DU_LOG("\nINFO --> F1AP : Received ULRRCMessageTransfer");
9117 procUlRrcMsg(*duId, f1apMsg);
9121 case InitiatingMessage__value_PR_RRCDeliveryReport:
9123 DU_LOG("\nINFO --> F1AP : Received RRC delivery report");
9126 case InitiatingMessage__value_PR_UEContextReleaseRequest:
9128 DU_LOG("\nINFO --> F1AP : Received UE Context Release Request");
9129 procUeContextReleaseReq(*duId, f1apMsg);
9134 DU_LOG("\nERROR --> F1AP : Invalid type of intiating message [%d]",\
9135 f1apMsg->choice.initiatingMessage->value.present);
9138 }/* End of switch(initiatingMessage) */
9142 case F1AP_PDU_PR_successfulOutcome:
9144 switch(f1apMsg->choice.successfulOutcome->value.present)
9146 case SuccessfulOutcome__value_PR_ResetAcknowledge:
9148 DU_LOG("\nINFO --> F1Reset Acknowledgement is received successfully ");
9151 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
9153 DU_LOG("\nINFO --> F1AP : UE ContextSetupResponse received");
9154 procUeContextSetupResponse(*duId, f1apMsg);
9157 case SuccessfulOutcome__value_PR_UEContextModificationResponse:
9159 DU_LOG("\nINFO --> F1AP : UE Context Modification Response received");
9160 procUeContextModificationResponse(*duId, f1apMsg);
9163 case SuccessfulOutcome__value_PR_UEContextReleaseComplete:
9165 DU_LOG("\nINFO --> F1AP : UE Context release complete received");
9170 DU_LOG("\nERROR --> F1AP : Invalid type of successful outcome message [%d]",\
9171 f1apMsg->choice.successfulOutcome->value.present);
9174 }/* End of switch(successfulOutcome) */
9179 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
9182 }/* End of switch(f1apMsg->present) */
9184 } /* End of F1APMsgHdlr */
9186 /**********************************************************************
9188 **********************************************************************/