1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
30 #include "ProtocolExtensionContainer.h"
31 #include "CellGroupConfigRrc.h"
32 #include "MAC-CellGroupConfig.h"
33 #include "SchedulingRequestConfig.h"
34 #include "SchedulingRequestToAddMod.h"
35 #include "BSR-Config.h"
36 #include "TAG-Config.h"
38 #include "PHR-Config.h"
39 #include "RLC-Config.h"
40 #include "UL-AM-RLC.h"
41 #include "DL-AM-RLC.h"
42 #include "LogicalChannelConfig.h"
43 #include "RLC-BearerConfig.h"
44 #include "PhysicalCellGroupConfig.h"
45 #include "SpCellConfig.h"
46 #include "ServingCellConfig.h"
47 #include "ControlResourceSet.h"
48 #include "SearchSpace.h"
49 #include "PDCCH-Config.h"
50 #include "PDSCH-TimeDomainResourceAllocation.h"
51 #include "PDSCH-TimeDomainResourceAllocationList.h"
52 #include "DMRS-DownlinkConfig.h"
53 #include "PDSCH-Config.h"
54 #include "BWP-DownlinkDedicated.h"
55 #include "PUSCH-TimeDomainResourceAllocation.h"
56 #include "PUSCH-TimeDomainResourceAllocationList.h"
57 #include "DMRS-UplinkConfig.h"
58 #include "PUSCH-Config.h"
59 #include "SRS-ResourceId.h"
60 #include "SRS-Resource.h"
61 #include "SRS-ResourceSet.h"
62 #include "SRS-Config.h"
63 #include "BWP-UplinkDedicated.h"
64 #include "PUSCH-ServingCellConfig.h"
65 #include "UplinkConfig.h"
66 #include "PDSCH-ServingCellConfig.h"
68 /* MACRO for CUtoDURRCInformation */
70 #define FREQ_DOM_RSRC_SIZE 6
71 #define CORESET0_END_PRB 48
72 #define CORESET1_NUM_PRB 24
73 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
74 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
75 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
76 #define PDCCH_SRCH_SPC_TWO_ID 2
78 #define SCRAMBLING_ID NR_PCI
79 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
80 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
81 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
82 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
83 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
84 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
85 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
86 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
87 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
89 /* MACRO Ddefine for PDSCH Configuration */
91 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
92 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
93 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
94 #define PDSCH_NUM_HARQ_PROC 5
95 #define PDSCH_MAPPING_TYPE_A 0
96 #define PDSCH_MAPPING_TYPE_B 1
98 /* MACRO Define for PUSCH Configuration */
101 #define PUSCH_MSG3_DELTA_PREAMBLE 0
102 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
103 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
104 #define PUSCH_MAX_MIMO_LAYERS 1
105 #define PUSCH_PROCESS_TYPE2_ENABLED false
106 #define PUSCH_MAPPING_TYPE_A 0
107 #define PUSCH_MAPPING_TYPE_B 1
109 /* MACRO defines for SRC config */
110 #define SRS_RSRC_ID 1
111 #define SRS_RSET_ID 1
112 #define SRS_COMB_OFFSET_N2 0
113 #define SRS_CYCLIC_SHIFT_N2 0
114 #define SRS_FREQ_DOM_POS 0
115 #define SRS_FREQ_DOM_SHIFT 0
120 #define APERIODIC_SRS_RESRC_TRIGGER 1
122 /* Macro definitions for DUtoCuRrcContainer */
123 #define CELL_GRP_ID 1
125 #define SR_PROHIBIT_TMR 5
126 #define SR_TRANS_MAX 2
127 #define PERIODIC_BSR_TMR 2
128 #define RETX_BSR_TMR 5
129 #define SR_DELAY_TMR 6
131 #define TIME_ALIGNMENT_TMR 7
132 #define PHR_PERIODIC_TMR 7
133 #define PHR_PROHIBHIT_TMR 0
134 #define PHR_PWR_FACTOR_CHANGE 3
135 #define PHR_MODE_OTHER_CG 0
138 #define SN_FIELD_LEN 0
139 #define T_POLL_RETRANSMIT 8
142 #define MAX_RETX_THRESHOLD 5
143 #define T_REASSEMBLY 8
144 #define T_STATUS_PROHIBHIT 7
145 #define MAC_LC_PRIORITY 1
146 #define PRIORTISIED_BIT_RATE 15
147 #define BUCKET_SIZE_DURATION 5
150 #define PDSCH_HARQ_ACK_CODEBOOK 1
151 #define SERV_CELL_IDX 0
152 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
153 #define ACTIVE_DL_BWP_ID 0
154 #define ACTIVE_UL_BWP_ID 0
155 #define SCRAMBLING_ID NR_PCI
156 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
157 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
159 /*******************************************************************
161 * @brief Sends F1 msg over SCTP
165 * Function : SendF1APMsg
167 * Functionality: Sends F1 msg over SCTP
169 * @params[in] Region region
171 * @return ROK - success
174 * ****************************************************************/
175 S16 SendF1APMsg(Region region, Pool pool)
177 Buffer *mBuf = NULLP;
179 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
181 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
183 ODU_PRINT_MSG(mBuf, 0,0);
185 if(sctpSend(mBuf) != ROK)
187 DU_LOG("\nF1AP : SCTP Send failed");
188 ODU_PUT_MSG_BUF(mBuf);
194 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
195 ODU_PUT_MSG_BUF(mBuf);
198 ODU_PUT_MSG_BUF(mBuf);
202 DU_LOG("\nF1AP : Failed to allocate memory");
209 /*******************************************************************
211 * @brief Builds NRCell ID
215 * Function : BuildNrCellId
217 * Functionality: Building the NR Cell ID
219 * @params[in] BIT_STRING_t *nrcell
220 * @return ROK - success
223 * ****************************************************************/
225 S16 BuildNrCellId(BIT_STRING_t *nrcell)
227 memset(nrcell->buf, 0, nrcell->size);
229 nrcell->bits_unused = 4;
230 nrcell->size = 5 * sizeof(uint8_t);
234 /********************************************************************
236 * @brief Builds and sends the F1SetupResponse
240 * Function : BuildAndSendF1SetupRsp
242 * Functionality: Constructs the F1SetupResponse message and sends
243 * it back to the DU through SCTP.
245 * @params[in] void **buf,Buffer to which encoded pattern is written into
246 * @params[in] int *size,size of buffer
248 * @return ROK - success
251 * ****************************************************************/
252 S16 BuildAndSendF1SetupRsp()
255 uint8_t elementCnt,cellCnt;
256 F1AP_PDU_t *f1apMsg = NULL;
257 F1SetupResponse_t *f1SetupRsp;
258 GNB_CU_Name_t *cuName;
259 Cells_to_be_Activated_List_t *cellToActivate;
260 RRC_Version_t *rrcVer;
261 asn_enc_rval_t encRetVal;
262 DU_LOG("\nF1AP : Building F1 Setup Response\n");
264 /* Allocate the memory for F1SetupRequest_t */
265 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
268 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
271 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
273 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
274 if(f1apMsg->choice.successfulOutcome == NULLP)
276 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
277 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
281 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
282 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
283 f1apMsg->choice.successfulOutcome->value.present = \
284 SuccessfulOutcome__value_PR_F1SetupResponse;
285 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
288 f1SetupRsp->protocolIEs.list.count = elementCnt;
289 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
291 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
292 elementCnt * sizeof(F1SetupResponseIEs_t *));
293 if(f1SetupRsp->protocolIEs.list.array == NULLP)
295 DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed");
296 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
297 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
301 for(idx=0; idx<elementCnt; idx++)
303 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
304 sizeof(F1SetupResponseIEs_t));
305 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
307 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
308 elementCnt * sizeof(F1SetupResponseIEs_t *));
309 CU_FREE(f1apMsg->choice.successfulOutcome, \
310 sizeof(SuccessfulOutcome_t));
311 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
318 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
319 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
320 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
321 F1SetupResponseIEs__value_PR_TransactionID;
322 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
327 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
328 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
329 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
330 F1SetupResponseIEs__value_PR_GNB_CU_Name;
331 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
332 cuName->size = sizeof(cuCfgParams.cuName);
334 CU_ALLOC(cuName->buf, sizeof(cuName->size));
335 if(cuName->buf == NULLP)
337 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
339 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
340 sizeof(F1SetupResponseIEs_t));
342 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
343 elementCnt * sizeof(F1SetupResponseIEs_t *));
344 CU_FREE(f1apMsg->choice.successfulOutcome,\
345 sizeof(SuccessfulOutcome_t));
346 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
349 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
351 /*Cells to be activated list*/
353 f1SetupRsp->protocolIEs.list.array[idx]->id = \
354 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
355 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
356 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
357 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
358 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
359 Cells_to_be_Activated_List;
361 cellToActivate->list.count = cellCnt;
362 cellToActivate->list.size = \
363 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
364 CU_ALLOC(cellToActivate->list.array,\
365 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
366 if(cellToActivate->list.array == NULLP)
368 CU_FREE(cuName->buf, sizeof(cuName->size));
369 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
371 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
372 sizeof(F1SetupResponseIEs_t));
374 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
375 elementCnt * sizeof(F1SetupResponseIEs_t *));
376 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
377 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
380 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
382 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
383 if(cellToActivate->list.array[ieIdx] == NULLP)
385 CU_FREE(cellToActivate->list.array,\
386 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
387 CU_FREE(cuName->buf, sizeof(cuName->size));
388 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
390 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
391 sizeof(F1SetupResponseIEs_t));
393 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
394 elementCnt * sizeof(F1SetupResponseIEs_t *));
395 CU_FREE(f1apMsg->choice.successfulOutcome, \
396 sizeof(SuccessfulOutcome_t));
397 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
401 cellToActivate->list.array[0]->id = \
402 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
403 cellToActivate->list.array[0]->criticality = Criticality_ignore;
404 cellToActivate->list.array[0]->value.present = \
405 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
406 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
407 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
408 CU_ALLOC(cellToActivate->list.array[0]->\
409 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
411 if(cellToActivate->list.array[0]->value.choice.\
412 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
415 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
417 CU_FREE(cellToActivate->list.array[ieIdx],\
418 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
421 CU_FREE(cellToActivate->list.array,\
422 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
423 CU_FREE(cuName->buf, sizeof(cuName->size));
424 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
426 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
427 sizeof(F1SetupResponseIEs_t));
429 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
430 elementCnt * sizeof(F1SetupResponseIEs_t *));
431 CU_FREE(f1apMsg->choice.successfulOutcome, \
432 sizeof(SuccessfulOutcome_t));
433 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
436 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
437 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
438 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
439 nRCGI.nRCellIdentity.size = 5;
440 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
441 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
443 if(cellToActivate->list.array[0]->value.choice.\
444 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
446 CU_FREE(cellToActivate->list.array[0]->\
447 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
449 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
451 CU_FREE(cellToActivate->list.array[ieIdx],\
452 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
455 CU_FREE(cellToActivate->list.array,\
456 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
457 CU_FREE(cuName->buf, sizeof(cuName->size));
458 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
460 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
461 sizeof(F1SetupResponseIEs_t));
463 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
464 elementCnt * sizeof(F1SetupResponseIEs_t *));
465 CU_FREE(f1apMsg->choice.successfulOutcome, \
466 sizeof(SuccessfulOutcome_t));
467 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
470 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
473 f1SetupRsp->protocolIEs.list.array[idx]->id = \
474 ProtocolIE_ID_id_GNB_CU_RRC_Version;
475 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
476 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
477 F1SetupResponseIEs__value_PR_RRC_Version;
478 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
479 rrcVer->latest_RRC_Version.size = RRC_SIZE;
481 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
482 if(rrcVer->latest_RRC_Version.buf == NULLP)
484 CU_FREE(cuName->buf, sizeof(cuName->size));
485 for(ieIdx=0; ieIdx<elementCnt; idx++)
487 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
488 sizeof(F1SetupResponseIEs_t));
490 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
491 elementCnt * sizeof(F1SetupResponseIEs_t *));
492 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
493 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
497 /* Need to check RRC Version */
498 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
499 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
500 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
501 if(rrcVer->iE_Extensions == NULLP)
503 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
504 CU_FREE(cuName->buf, sizeof(cuName->size));
505 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
507 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
508 sizeof(F1SetupResponseIEs_t));
510 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
511 elementCnt * sizeof(F1SetupResponseIEs_t *));
512 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
513 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
516 rrcVer->iE_Extensions->list.count = 1;
517 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
518 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
519 sizeof(struct RRC_Version_ExtIEs *));
520 if(rrcVer->iE_Extensions->list.array == NULLP)
522 CU_FREE(rrcVer->iE_Extensions,\
523 sizeof(ProtocolExtensionContainer_4624P81_t));
524 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
525 CU_FREE(cuName->buf, sizeof(cuName->size));
526 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
528 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
529 sizeof(F1SetupResponseIEs_t));
531 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
532 elementCnt * sizeof(F1SetupResponseIEs_t *));
533 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
534 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
537 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
538 sizeof(struct RRC_Version_ExtIEs));
539 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
541 CU_FREE(rrcVer->iE_Extensions->list.array,\
542 sizeof(struct RRC_Version_ExtIEs *));
543 CU_FREE(rrcVer->iE_Extensions,\
544 sizeof(ProtocolExtensionContainer_4624P81_t));
545 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
546 CU_FREE(cuName->buf, sizeof(cuName->size));
547 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
549 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
550 sizeof(F1SetupResponseIEs_t));
552 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
553 elementCnt * sizeof(F1SetupResponseIEs_t *));
554 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
555 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
558 rrcVer->iE_Extensions->list.array[0]->id = \
559 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
560 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
561 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
562 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
563 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
564 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
565 CU_ALLOC(rrcVer->iE_Extensions->list.\
566 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
568 if(rrcVer->iE_Extensions->list.\
569 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
571 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
572 sizeof(struct RRC_Version_ExtIEs));
573 CU_FREE(rrcVer->iE_Extensions->list.array,\
574 sizeof(struct RRC_Version_ExtIEs *));
575 CU_FREE(rrcVer->iE_Extensions,\
576 sizeof(ProtocolExtensionContainer_4624P81_t));
577 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
578 CU_FREE(cuName->buf, sizeof(cuName->size));
579 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
581 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
582 sizeof(F1SetupResponseIEs_t));
584 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
585 elementCnt * sizeof(F1SetupResponseIEs_t *));
586 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
587 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
590 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
591 Latest_RRC_Version_Enhanced.buf[0] = 0;
592 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
593 Latest_RRC_Version_Enhanced.buf[1] = 5;
594 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
595 Latest_RRC_Version_Enhanced.buf[2] = 15;
597 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
599 /* Encode the F1SetupRequest type as UPER */
600 memset(encBuf, 0, ENC_BUF_MAX_LEN);
602 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
605 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
606 CU_FREE(cuName->buf, sizeof(cuName->size));
607 for(idx=0; idx<elementCnt; idx++)
609 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
611 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
612 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
613 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
615 /* Check encode results */
616 if(encRetVal.encoded == ENCODE_FAIL)
618 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
619 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
624 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
625 for(int i=0; i< encBufSize; i++)
627 printf("%x",encBuf[i]);
632 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
634 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
639 }/* End of BuildAndSendF1SetupRsp */
641 /*******************************************************************
643 * @brief Builds and sends the DUUpdateAcknowledge
647 * Function : BuildAndSendDUUpdateAck
649 * Functionality: Constructs the DU Update Acknowledge message and sends
650 * it to the DU through SCTP.
652 * @params[in] void **buf,Buffer to which encoded pattern is written into
653 * @params[in] int *size,size of buffer
655 * @return ROK - success
658 * ****************************************************************/
660 S16 BuildAndSendDUUpdateAck()
664 F1AP_PDU_t *f1apMsg = NULL;
665 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
666 asn_enc_rval_t enRetVal; /* Encoder return value */
668 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
670 /* Allocate the memory for F1SetupRequest_t */
671 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
674 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
678 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
680 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
681 if(f1apMsg->choice.successfulOutcome == NULLP)
683 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
684 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
688 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
689 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
690 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
691 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
694 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
695 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
697 /* Initialize the F1Setup members */
698 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
699 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
701 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
702 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
703 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
707 for(idx=0; idx<elementCnt; idx++)
709 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
710 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
712 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
713 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
714 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
721 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
722 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
723 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
724 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
726 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
728 /* Encode the F1SetupRequest type as UPER */
729 memset(encBuf, 0, ENC_BUF_MAX_LEN);
731 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
734 for(idx=0; idx<elementCnt; idx++)
736 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
738 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
739 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
740 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
742 /* Checking encode results */
743 if(enRetVal.encoded == ENCODE_FAIL)
745 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
750 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
751 for(int i=0; i< encBufSize; i++)
753 printf("%x",encBuf[i]);
758 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
760 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
766 }/* End of BuildAndSendDUUpdateAck*/
767 /*******************************************************************
769 * @brief deallocating the memory of F1reset msg
773 * Function : FreeF1ResetReq
776 * - freeing memory of F1reset request msg
782 * ****************************************************************/
783 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
786 Reset_t *f1ResetMsg = NULLP;
790 if(f1apMsg->choice.initiatingMessage)
792 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
793 if(f1ResetMsg->protocolIEs.list.array)
795 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
797 if(f1ResetMsg->protocolIEs.list.array[idx])
799 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
802 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
804 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
806 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
809 /*******************************************************************
811 * @brief build ansld ans send f1reset msg
815 * Function : BuildAndSendF1ResetReq
817 * Functionality: build and send f1reset msg
819 * @return ROK - success
822 * ****************************************************************/
823 uint8_t BuildAndSendF1ResetReq()
825 uint8_t elementCnt=0;
827 uint8_t ret= RFAILED;
828 Reset_t *f1ResetMsg = NULLP;
829 F1AP_PDU_t *f1apMsg = NULLP;
830 asn_enc_rval_t encRetVal;
831 DU_LOG("\nF1AP : Building F1 Reset request \n");
834 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
837 DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
840 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
841 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
842 if(f1apMsg->choice.initiatingMessage == NULLP)
844 DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed");
847 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
848 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
849 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
851 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
854 f1ResetMsg->protocolIEs.list.count = elementCnt;
855 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
857 /* Initialize the F1Reset members */
858 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
859 if(f1ResetMsg->protocolIEs.list.array == NULLP)
861 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq");
864 for(idx=0; idx<elementCnt; idx++)
866 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
867 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
869 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
876 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
877 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
878 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
879 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
883 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
884 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
885 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
886 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
887 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
891 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
892 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
893 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
894 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
895 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
897 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
899 /* Encode the F1SetupRequest type as APER */
900 memset(encBuf, 0, ENC_BUF_MAX_LEN);
902 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
906 if(encRetVal.encoded == ENCODE_FAIL)
908 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
909 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
914 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
915 for(idx=0; idx< encBufSize; idx++)
917 printf("%x",encBuf[idx]);
921 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
923 DU_LOG("\nF1AP : Sending F1 Reset request failed");
931 FreeF1ResetReq(f1apMsg);
935 /*******************************************************************
937 * @brief Fills Radio Bearer Config
941 * Function : fillSrbCfg
943 * Functionality: Fills Radio Bearer Config
945 * @params[in] SRB_ToAddModList *
947 * @return ROK - success
950 * ****************************************************************/
951 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
955 if(bearerCfg != NULLP)
958 bearerCfg->list.count = elementCnt;
959 bearerCfg->list.size =\
960 elementCnt * sizeof(SRB_ToAddMod_t *);
961 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
962 if(bearerCfg->list.array != NULLP)
964 for(idx = 0; idx < elementCnt; idx++)
966 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
967 if(bearerCfg->list.array[idx] == NULLP)
969 for(ieId = 0; ieId < idx; ieId++)
971 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
973 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
983 bearerCfg->list.array[idx]->srb_Identity = srbId;
988 /*******************************************************************
990 * @brief Fills Master CellGroup Info
994 * Function : fillMasterCellGroup
996 * Functionality: Fills Master Cell Group IE
998 * @params[in] RRCSetup_IEs_t *
1000 * @return ROK - success
1003 * ****************************************************************/
1005 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1008 masterCellGroup->buf = NULLP;
1009 if(f1apMsgDb.duToCuContainer.buf)
1011 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1012 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1013 if(masterCellGroup->buf != NULLP)
1015 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1016 masterCellGroup->size);
1030 /*******************************************************************
1032 * @brief Fills RRC setup IE
1036 * Function : fillRRCSetupIE
1038 * Functionality: Fills RRC Setup IE
1040 * @params[in] RRCSetup_IEs_t *
1042 * @return ROK - success
1045 * ****************************************************************/
1047 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1052 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1053 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1055 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1059 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1063 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1069 /*******************************************************************
1071 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1075 * Function : fillDlCcchRrcMsg
1077 * Functionality: Fills DL DCCCH Message required for
1078 * DLRRCMessageTransfer
1080 * @params[in] RRCContainer_t *rrcContainer
1082 * @return ROK - success
1085 * ****************************************************************/
1087 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1091 DL_CCCH_Message_t dl_CCCH_Msg;
1092 asn_enc_rval_t encRetVal;
1094 if(rrcContainer != NULLP)
1096 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1098 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1099 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1101 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1102 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1103 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1105 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1106 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1107 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1108 /* Fill RRC Setup IE */
1109 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1110 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1111 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1112 criticalExtensions.choice.rrcSetup != NULLP)
1114 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1115 criticalExtensions.choice.rrcSetup);
1119 /* encode DL-CCCH message into RRC Container */
1120 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1121 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1123 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1124 /* Encode results */
1125 if(encRetVal.encoded == ENCODE_FAIL)
1127 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1128 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1133 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1134 for(int i = 0; i< encBufSize; i++)
1136 printf("%x",encBuf[i]);
1138 rrcContainer->size = encBufSize;
1139 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1140 if(rrcContainer->buf != NULLP)
1142 memset(rrcContainer->buf, 0, encBufSize);
1143 for(idx2 = 0; idx2 < encBufSize; idx2++)
1145 rrcContainer->buf[idx2] = encBuf[idx2];
1157 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1163 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1169 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1175 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1180 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1182 uint8_t idx, ied, elementCnt;
1185 qosFlow->list.count = elementCnt;
1186 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1187 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1188 if(qosFlow->list.array != NULLP)
1190 for(idx = 0; idx < elementCnt; idx++)
1192 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1193 if(qosFlow->list.array[idx] == NULLP)
1195 for(ied = 0; ied < idx; ied++)
1197 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1199 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1205 *qosFlow->list.array[idx] = 9;
1209 /*******************************************************************
1211 * @brief Fills CN Assoc for Drb to Add/Mod List
1215 * Function : fillCnAssoc
1217 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1219 * @params[in] struct DRB_ToAddMod__cnAssociation *
1221 * @return ROK - success
1224 * ****************************************************************/
1226 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1230 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1231 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1233 cnAssoc->choice.eps_BearerIdentity = 5;
1235 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1237 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1238 if(cnAssoc->choice.sdap_Config)
1240 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1241 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1242 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1243 cnAssoc->choice.sdap_Config->defaultDRB = true;
1244 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1245 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1246 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1247 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1248 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1250 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1254 DU_LOG("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1255 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1261 DU_LOG("\nF1AP: Mem alloc failed at fillCnAssoc()");
1268 /*******************************************************************
1270 * @brief Fills Radio Bearer Config for Drb
1274 * Function : fillDrbCfg
1276 * Functionality: Fills Radio Bearer Config for Drb
1278 * @params[in] drbId, DRB_ToAddModList *
1280 * @return ROK - success
1283 * ****************************************************************/
1284 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1286 uint8_t idx, ied, ret, elementCnt;
1292 drbCfg->list.count = elementCnt;
1293 drbCfg->list.size =\
1294 elementCnt * sizeof(DRB_ToAddMod_t *);
1295 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1296 if(drbCfg->list.array != NULLP)
1298 for(idx = 0; idx < elementCnt; idx++)
1300 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1301 if(drbCfg->list.array[idx] == NULLP)
1303 for(ied = 0; ied < idx; ied++)
1305 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1307 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1317 /* CN ASSOCIATION */
1318 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1319 if(drbCfg->list.array[idx]->cnAssociation)
1321 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1324 drbCfg->list.array[idx]->drb_Identity = drbId;
1329 /*******************************************************************
1331 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1335 * Function : fillRrcReconfigIE
1337 * Functionality: Fills RRC Reconfig Message required for
1338 * DLRRCMessageTransfer
1340 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1342 * @return ROK - success
1345 * ****************************************************************/
1347 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1350 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1351 if(rrcReconfigMsg->radioBearerConfig)
1353 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1354 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1356 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1361 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1362 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1364 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1367 DU_LOG("\n F1AP: Failed to fill DrbCfg at fillRrcReconfigIE()");
1368 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1369 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1375 DU_LOG("\n F1AP: memory Alloc failed at fillRrcReconfigIE()");
1376 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1382 /*******************************************************************
1384 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1388 * Function : fillDlDcchRrcMsg
1390 * Functionality: Fills DL DCCH Message required for
1391 * DLRRCMessageTransfer
1393 * @params[in] RRCContainer_t *rrcContainer
1395 * @return ROK - success
1398 * ****************************************************************/
1400 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1404 DL_DCCH_Message_t dl_DCCH_Msg;
1405 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1406 asn_enc_rval_t encRetVal;
1408 if(rrcContainer != NULLP)
1410 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1412 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1413 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1415 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1416 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1417 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1419 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1420 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1421 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1422 /* Fill RRC Reconfig IE */
1423 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1424 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1425 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1426 criticalExtensions.choice.rrcReconfiguration != NULLP)
1428 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1429 criticalExtensions.choice.rrcReconfiguration);
1433 /* encode DL-DCCH message into RRC Container */
1434 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1437 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1438 /* Encode results */
1439 if(encRetVal.encoded == ENCODE_FAIL)
1441 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1442 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1447 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1448 for(int i = 0; i< encBufSize; i++)
1450 printf("%x",encBuf[i]);
1452 rrcContainer->size = encBufSize;
1453 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1454 if(rrcContainer->buf != NULLP)
1456 memset(rrcContainer->buf, 0, encBufSize);
1457 for(idx2 = 0; idx2 < encBufSize; idx2++)
1459 rrcContainer->buf[idx2] = encBuf[idx2];
1466 DU_LOG("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1471 DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1477 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1483 DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1489 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1495 /*******************************************************************
1497 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1501 * Function : BuildDLRRCContainer
1503 * Functionality: Builds RRC Container IE required for
1504 * DLRRCMessageTransfer
1508 * @return ROK - success
1511 * ****************************************************************/
1513 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1515 uint8_t ret, bufLen;
1518 if(rrcMsgType == RRC_SETUP)
1520 ret = fillDlCcchRrcMsg(rrcContainer);
1522 DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1524 else if(rrcMsgType == REGISTRATION_ACCEPT)
1526 /*Hardcoded RRC Container from reference logs*/
1527 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1529 rrcContainer->size = bufLen;
1530 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1531 if(rrcContainer->buf != NULLP)
1533 memset(rrcContainer->buf, 0, bufLen);
1534 memcpy(rrcContainer->buf, buf, bufLen);
1537 else if(rrcMsgType == RRC_RECONFIG)
1539 /*Hardcoded RRC Container from reference logs*/
1541 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1542 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1543 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1544 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1545 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1546 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1547 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1548 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1549 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1550 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1551 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1552 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1553 0x00, 0x00, 0x00, 0x00};
1555 rrcContainer->size = bufLen;
1556 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1557 if(rrcContainer->buf != NULLP)
1559 memset(rrcContainer->buf, 0, bufLen);
1560 memcpy(rrcContainer->buf, buf, bufLen);
1567 /*******************************************************************
1569 * @brief Builds and sends the DLRRCMessageTransfer
1573 * Function : BuildAndSendDLRRCMessageTransfer
1575 * Functionality: Constructs the DL RRC Message Transfer and sends
1576 * it to the CU through SCTP.
1580 * @return ROK - success
1583 * ****************************************************************/
1584 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1586 uint8_t elementCnt = 0;
1589 F1AP_PDU_t *f1apMsg = NULLP;
1590 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1591 asn_enc_rval_t encRetVal; /* Encoder return value */
1593 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1595 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1596 if(f1apMsg == NULLP)
1598 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1602 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1603 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1604 sizeof(InitiatingMessage_t));
1605 if(f1apMsg->choice.initiatingMessage == NULLP)
1607 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1608 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1612 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1613 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1614 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1615 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1618 dlRRCMsg->protocolIEs.list.count = elementCnt;
1619 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1621 /* Initialize the F1Setup members */
1622 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1623 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1625 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1626 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1627 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1631 for(idx=0; idx<elementCnt; idx++)
1633 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1634 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1636 for(ieId=0; ieId<idx; ieId++)
1638 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1639 sizeof(DLRRCMessageTransferIEs_t));
1641 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1642 dlRRCMsg->protocolIEs.list.size);
1643 CU_FREE(f1apMsg->choice.initiatingMessage,\
1644 sizeof(InitiatingMessage_t));
1645 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1650 /* GNB CU UE F1AP ID */
1652 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1653 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1654 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1655 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1656 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1658 /* GNB DU UE F1AP ID */
1660 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1661 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1662 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1663 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1664 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1665 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1669 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1670 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1671 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1672 DLRRCMessageTransferIEs__value_PR_SRBID;
1673 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1677 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1678 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1679 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1680 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1681 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1683 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1685 /* Encode the F1SetupRequest type as APER */
1686 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1688 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1690 /* Encode results */
1691 if(encRetVal.encoded == ENCODE_FAIL)
1693 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1694 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1699 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1700 for(int i=0; i< encBufSize; i++)
1702 printf("%x",encBuf[i]);
1707 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1709 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1714 }/* End of BuildAndSendDLRRCMessageTransfer */
1716 /*******************************************************************
1718 * @brief Function to set the Dl RRC Msg Type
1722 * Function : setDlRRCMsgType
1724 * Functionality: Constructs the UE Setup Response and sends
1725 * it to the DU through SCTP.
1729 * @return ROK - success
1732 * ****************************************************************/
1734 uint8_t setDlRRCMsgType()
1736 uint8_t rrcMsgType = 0;
1737 switch(f1apMsgDb.dlRrcMsgCount)
1740 rrcMsgType = RRC_SETUP;
1742 case REGISTRATION_ACCEPT:
1743 rrcMsgType = REGISTRATION_ACCEPT;
1745 case UE_CONTEXT_SETUP_REQ:
1746 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1748 case SECURITY_MODE_COMPLETE:
1749 rrcMsgType = SECURITY_MODE_COMPLETE;
1752 rrcMsgType = RRC_RECONFIG;
1760 /*******************************************************************
1762 * @brief Function to build Initial UL RRC Message
1766 * Function : procInitULRRCMsg
1768 * Functionality: Function to build Initial UL RRC Message
1772 * @return ROK - success
1775 * ****************************************************************/
1777 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1779 uint8_t idx, rrcMsgType;
1781 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1782 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1784 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1786 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1788 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1790 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1792 case ProtocolIE_ID_id_NRCGI:
1794 case ProtocolIE_ID_id_C_RNTI:
1796 case ProtocolIE_ID_id_RRCContainer:
1798 case ProtocolIE_ID_id_DUtoCURRCContainer:
1800 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1801 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1802 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1804 DU_LOG("\n Received Du to Cu RRC Container ");
1805 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1806 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1807 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1808 f1apMsgDb.duToCuContainer.size);
1809 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1811 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1812 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1813 .duToCuContainer.size);
1818 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1824 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1830 f1apMsgDb.dlRrcMsgCount++;
1831 rrcMsgType = setDlRRCMsgType();
1832 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1837 /*******************************************************************
1839 * @brief Builds Nrcgi
1843 * Function : BuildNrcgi
1845 * Functionality: Building the PLMN ID and NR Cell id
1847 * @params[in] NRCGI_t *nrcgi
1848 * @return ROK - success
1851 * ****************************************************************/
1852 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1855 uint8_t unused_bits = 4;
1856 uint8_t byteSize = 5;
1858 /* Allocate Buffer Memory */
1859 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1860 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1861 if(nrcgi->pLMN_Identity.buf == NULLP)
1865 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1871 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1872 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1873 if(nrcgi->nRCellIdentity.buf == NULLP)
1878 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1884 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1885 nrcgi->nRCellIdentity.buf[0] |= val;
1886 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1890 /*******************************************************************
1892 * @brief Builds Special cell list for UE Setup Request
1896 * Function : BuildSplCellList
1898 * Functionality: Constructs the Special Cell list for UESetReq
1900 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1902 * @return ROK - success
1905 * ****************************************************************/
1906 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1912 spCellLst->list.count = cellCnt;
1913 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1914 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1915 if(spCellLst->list.array == NULLP)
1919 for(idx=0; idx<cellCnt; idx++)
1921 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1922 if(spCellLst->list.array[idx] == NULLP)
1928 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1929 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1930 spCellLst->list.array[idx]->value.present =\
1931 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1932 /* Special Cell ID -NRCGI */
1933 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1938 /*Special Cell Index*/
1939 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1941 }/* End of BuildSplCellList*/
1943 /*******************************************************************
1945 * @brief Builds SRBS to be setup
1949 * Function : BuildSRBSetup
1951 * Functionality: Constructs the SRB's for UESetReq
1953 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1955 * @return ROK - success
1958 * ****************************************************************/
1959 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1964 srbSet->list.count = srbCnt;
1965 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1966 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1967 if(srbSet->list.array == NULLP)
1971 for(idx=0; idx<srbCnt; idx++)
1973 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1974 if(srbSet->list.array[idx] == NULLP)
1980 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1981 srbSet->list.array[idx]->criticality = Criticality_ignore;
1982 srbSet->list.array[idx]->value.present = \
1983 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1984 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1986 }/* End of BuildSRBSetup*/
1988 /*******************************************************************
1990 * @brief Builds QOS Info for DRB Setum Item
1994 * Function : BuildQOSInfo
1996 * Functionality: Constructs the QOS Info for DRB Setup Item
1998 * @params[in] QoSInformation_t *qosinfo
2000 * @return ROK - success
2003 * ****************************************************************/
2004 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2006 /* NonDynamic5QIDescriptor */
2007 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2008 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2009 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2014 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2016 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2017 sizeof(AveragingWindow_t));
2018 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2023 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2024 /*MaxDataBurstVolume*/
2025 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2026 sizeof(MaxDataBurstVolume_t));
2027 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2032 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2034 /*nRGRAN Allocation Retention Priority*/
2035 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2036 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2037 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2039 /* TO DO: GBR_QoSFlowInformation */
2041 }/*End of BuildQOSInfo*/
2043 /*******************************************************************
2045 * @brief Builds SNSSAI
2049 * Function : BuildSNSSAI
2051 * Functionality: Constructs the SNSSAI For DRB list
2053 * @params[in] SNSSAI_t *snssai
2055 * @return ROK - success
2058 * ****************************************************************/
2059 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2063 snssai->sST.size = sizeof(uint8_t);
2064 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2065 if(snssai->sST.buf == NULLP)
2069 snssai->sST.buf[0] = 3;
2071 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2072 if(snssai->sD == NULLP)
2076 snssai->sD->size = 3*sizeof(uint8_t);
2077 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2078 if(snssai->sD->buf == NULLP)
2082 snssai->sD->buf[0] = 3;
2083 snssai->sD->buf[1] = 6;
2084 snssai->sD->buf[2] = 9;
2086 }/*End of BuildSNSSAI*/
2088 /*******************************************************************
2090 * @brief Builds the flow map.
2094 * Function : BuildFlowsMap
2096 * Functionality: Constructs the flowmap For DRB list
2098 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2100 * @return ROK - success
2103 * ****************************************************************/
2104 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2110 flowMap->list.count = flowCnt;
2111 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2112 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2113 if(flowMap->list.array == NULLP)
2117 for(idx=0; idx<flowCnt; idx++)
2119 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2120 if(flowMap->list.array[idx] == NULLP)
2126 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2127 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2133 }/*End of BuildFlowsMap*/
2135 /*******************************************************************
2137 * @brief Builds the Uplink Tunnel Info
2141 * Function : BuildULTnlInfo
2143 * Functionality: Constructs the UL TnlInfo For DRB list
2145 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2147 * @return ROK - success
2150 * ****************************************************************/
2151 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2156 ulInfo->list.count = ulCnt;
2157 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2158 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2159 if(ulInfo->list.array == NULLP)
2163 for(idx=0; idx<ulCnt; idx++)
2165 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2166 if(ulInfo->list.array[idx] == NULLP)
2172 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2173 UPTransportLayerInformation_PR_gTPTunnel;
2175 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2176 sizeof(GTPTunnel_t));
2177 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2181 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2182 transportLayerAddress.size = 4*sizeof(uint8_t);
2183 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2184 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2185 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2186 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2187 transportLayerAddress.buf == NULLP)
2191 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2192 transportLayerAddress.buf[0] = 4;
2193 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2194 transportLayerAddress.buf[1] = 4;
2195 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2196 transportLayerAddress.buf[2] = 4;
2197 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2198 transportLayerAddress.buf[3] = 5;
2199 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2200 transportLayerAddress.bits_unused = 0;
2202 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2203 = 4 * sizeof(uint8_t);
2204 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2205 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2206 gTPTunnel->gTP_TEID.size);
2207 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2212 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2213 gTP_TEID.buf[0] = 11;
2214 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2215 gTP_TEID.buf[1] = 0;
2216 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2217 gTP_TEID.buf[2] = 0;
2218 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2219 gTP_TEID.buf[3] = 1;
2222 }/*End of BuildULTnlInfo*/
2224 /*******************************************************************
2226 * @brief Builds DRBS to be setup
2230 * Function : BuildDRBSetup
2232 * Functionality: Constructs the DRB's for UESetReq
2234 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2236 * @return ROK - success
2239 * ****************************************************************/
2240 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2242 uint8_t BuildQOSInforet;
2243 uint8_t BuildSNSSAIret;
2244 uint8_t BuildFlowsMapret;
2245 uint8_t BuildULTnlInforet;
2248 DRBs_ToBeSetup_Item_t *drbSetItem;
2250 drbSet->list.count = drbCnt;
2251 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2252 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2253 if(drbSet->list.array == NULLP)
2257 for(idx=0; idx<drbCnt; idx++)
2259 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2260 if(drbSet->list.array[idx] == NULLP)
2266 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2267 drbSet->list.array[idx]->criticality = Criticality_ignore;
2268 drbSet->list.array[idx]->value.present = \
2269 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2270 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2272 drbSetItem->dRBID = 1;
2274 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2275 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2276 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2280 drbSetItem->qoSInformation.choice.choice_extension->id = \
2281 ProtocolIE_ID_id_DRB_Information;
2282 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2284 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2285 QoSInformation_ExtIEs__value_PR_DRB_Information;
2286 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2287 choice_extension->value.choice.DRB_Information.dRB_QoS);
2288 if(BuildQOSInforet != ROK)
2293 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2294 choice_extension->value.choice.DRB_Information.sNSSAI);
2295 if(BuildSNSSAIret != ROK)
2299 /*Flows mapped to DRB List*/
2300 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2301 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2302 if(BuildFlowsMapret != ROK)
2306 /*ULUPTNLInformation To Be Setup List*/
2307 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2308 if(BuildULTnlInforet != ROK)
2313 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2315 /*UL Configuration*/
2316 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2317 if(drbSetItem->uLConfiguration == NULLP)
2321 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2323 }/* End of BuildDRBSetup*/
2325 /*******************************************************************
2327 * @brief Deallocating memory of function BuildAndSendUESetReq
2331 * Function : FreeNrcgi
2333 * Functionality: Deallocating memory for function BuildNrcgi
2335 * @params[in] NRCGI_t *nrcgi
2339 *******************************************************************/
2340 void FreeNrcgi(NRCGI_t *nrcgi)
2342 if(nrcgi->pLMN_Identity.buf != NULLP)
2344 if(nrcgi->nRCellIdentity.buf != NULLP)
2346 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2348 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2351 /*******************************************************************
2353 * @brief Deallocating memory of function BuildAndSendUESetReq
2357 * Function : FreeSplCellList
2359 * Functionality: Deallocating memory for function BuildSplCellList
2361 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2366 * *****************************************************************/
2367 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2370 if(spCellLst->list.array != NULLP)
2372 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2374 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2376 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2378 if(spCellLst->list.array[cellidx]!=NULLP)
2380 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2383 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2386 /*******************************************************************
2388 * @brief Deallocating memory of function BuildAndSendUESetReq
2392 * Function : FreeSRBSetup
2394 * Functionality: Deallocating memory for function BuildSRBSetup
2396 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2401 * ******************************************************************/
2402 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2405 if(srbSet->list.array != NULLP)
2407 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2409 if(srbSet->list.array[srbidx]!=NULLP)
2411 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2414 CU_FREE(srbSet->list.array,srbSet->list.size);
2417 /*******************************************************************
2419 * @brief Deallocating memory of function BuildAndSendUESetReq
2423 * Function : FreeQOSInfo
2425 * Functionality: Deallocating memory for function BuildQOSInfo
2427 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2431 * ****************************************************************/
2432 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2434 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2436 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2438 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2440 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2441 sizeof(MaxDataBurstVolume_t));
2443 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2444 sizeof(AveragingWindow_t));
2446 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2447 sizeof(NonDynamic5QIDescriptor_t));
2450 /*******************************************************************
2452 * @brief Deallocating memory of function BuildAndSendUESetReq
2456 * Function : FreeULTnlInfo
2458 * Functionality: Deallocating memory for function BuildULTnlInfo
2460 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2465 * ****************************************************************/
2466 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2469 if(ulInfo->list.array != NULLP)
2471 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2473 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2475 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2477 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2478 transportLayerAddress.buf != NULLP)
2480 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2483 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2484 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2485 gTPTunnel->gTP_TEID.size);
2487 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2488 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2489 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2491 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2492 sizeof(GTPTunnel_t));
2495 if(ulInfo->list.array[ulidx]!=NULLP)
2497 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2500 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2503 /*******************************************************************
2505 * @brief Deallocating memory for BuildAndSendUESetReq
2509 * Function : FreeDRBSetup
2511 * Functionality: Deallocating memory for BuildDRBSetup
2513 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2517 * ****************************************************************/
2518 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2520 DRBs_ToBeSetup_Item_t *drbSetItem;
2523 if(drbSet->list.array == NULLP)
2525 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2527 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2529 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2530 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2532 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2533 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2535 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2536 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2538 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2539 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2541 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2543 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2545 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2547 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2548 flows_Mapped_To_DRB_List.list.array != NULLP)
2550 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2551 flows_Mapped_To_DRB_List.list.count; flowidx++)
2553 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2554 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2556 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2557 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2558 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2560 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2561 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2562 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2564 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2565 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2566 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2568 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2569 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2571 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2572 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2573 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2574 sizeof(MaxDataBurstVolume_t));
2576 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2577 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2578 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2580 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2581 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2582 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2585 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2586 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2588 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2589 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2592 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2593 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2594 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2596 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2597 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2599 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2600 sizeof(OCTET_STRING_t));
2602 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2603 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2605 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2606 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2608 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2609 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2611 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2612 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2614 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2617 if(drbSet->list.array[drbidx]!=NULLP)
2619 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2622 CU_FREE(drbSet->list.array,drbSet->list.size);
2627 /*******************************************************************
2629 * @brief Free the UE Setup Request
2633 * Function : FreeUeContextSetupReq
2635 * Functionality: Deallocate the memory of BuildUESetReq
2637 * @params[in] F1AP_PDU_t *f1apMsg
2642 * ****************************************************************/
2643 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2646 UEContextSetupRequest_t *ueSetReq = NULLP;
2648 if(f1apMsg != NULLP)
2650 if(f1apMsg->choice.initiatingMessage != NULLP)
2652 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2653 if(ueSetReq->protocolIEs.list.array != NULLP)
2655 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2657 if(ueSetReq->protocolIEs.list.array[idx])
2659 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2661 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2663 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2665 case ProtocolIE_ID_id_SpCell_ID:
2666 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2668 case ProtocolIE_ID_id_ServCellIndex:
2670 case ProtocolIE_ID_id_SpCellULConfigured:
2672 case ProtocolIE_ID_id_CUtoDURRCInformation:
2673 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2675 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2676 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2678 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2679 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2681 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2682 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2684 case ProtocolIE_ID_id_RRCContainer:
2685 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2687 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2688 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2692 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2697 for(ieId=0; ieId<idx; ieId++)
2699 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2701 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2704 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2706 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2708 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2712 /**Filling cell group info **/
2713 /*******************************************************************
2715 * @brief Build Control resource set to add/modify list
2719 * Function : BuildControlRSetToAddModList
2721 * Functionality: Build Control resource set to add/modify list
2724 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2726 * @return ROK - success
2729 * ****************************************************************/
2730 uint8_t BuildControlRSetToAddModList
2732 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2737 uint8_t numBytes, bitsUnused;
2738 struct ControlResourceSet *controlRSet;
2739 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2740 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2743 controlRSetList->list.count = elementCnt;
2744 controlRSetList->list.size = \
2745 elementCnt * sizeof(struct ControlResourceSet *);
2747 controlRSetList->list.array = NULLP;
2748 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2749 if(!controlRSetList->list.array)
2751 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2755 for(idx = 0; idx < elementCnt; idx++)
2757 controlRSetList->list.array[idx] = NULLP;
2758 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2759 if(!controlRSetList->list.array[idx])
2761 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2767 controlRSet = controlRSetList->list.array[idx];
2768 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2770 /* Values harcoded according to our design:
2773 * Bit string stored ff0000000000
2777 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2778 controlRSet->frequencyDomainResources.buf = NULLP;
2779 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2780 controlRSet->frequencyDomainResources.size);
2781 if(!controlRSet->frequencyDomainResources.buf)
2783 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2787 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2788 coreset0EndPrb = CORESET0_END_PRB;
2789 coreset1StartPrb = coreset0EndPrb + 6;
2790 coreset1NumPrb = CORESET1_NUM_PRB;
2791 /* calculate the PRBs */
2792 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2793 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2794 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2796 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2797 controlRSet->cce_REG_MappingType.present = \
2798 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2800 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2801 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2802 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2803 controlRSet->tci_PresentInDCI = NULLP;
2805 uint8_t tciStateIdx;
2807 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2808 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2809 if(!controlRset->tci_StatesPDCCH_ToAddList)
2811 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2816 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2817 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2818 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2819 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2820 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2822 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2826 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2828 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2829 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2831 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2838 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2840 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2841 if(!controlRset->tci_PresentInDCI)
2843 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2847 *(controlRset->tci_PresentInDCI);
2850 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2851 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2852 if(!controlRSet->pdcch_DMRS_ScramblingID)
2854 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2857 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2860 } /* End BuildControlRSetToAddModList */
2862 /*******************************************************************
2864 * @brief Build search space to add/modify list
2868 * Function : BuildSearchSpcToAddModList
2870 * Functionality: Build search space to add/modify list
2873 * @return ROK - success
2876 * ****************************************************************/
2877 uint8_t BuildSearchSpcToAddModList
2879 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2887 struct SearchSpace *searchSpc;
2890 searchSpcList->list.count = elementCnt;
2891 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2893 searchSpcList->list.array = NULLP;
2894 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2895 if(!searchSpcList->list.array)
2897 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2901 for(idx = 0; idx < elementCnt; idx++)
2903 searchSpcList->list.array[idx] = NULLP;
2904 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2905 if(!searchSpcList->list.array[idx])
2907 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2913 searchSpc = searchSpcList->list.array[idx];
2915 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2917 searchSpc->controlResourceSetId = NULLP;
2918 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2919 if(!searchSpc->controlResourceSetId)
2921 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2924 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2926 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2927 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2928 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2929 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2931 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2934 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2935 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2937 searchSpc->duration = NULLP;
2938 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2939 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2940 if(!searchSpc->monitoringSymbolsWithinSlot)
2942 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2946 /* Values taken from reference logs :
2949 * Bit string stores 8000
2954 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2955 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2956 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2957 searchSpc->monitoringSymbolsWithinSlot->size);
2958 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2960 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2965 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2966 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2967 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2968 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2970 searchSpc->nrofCandidates = NULLP;
2971 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2972 if(!searchSpc->nrofCandidates)
2974 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2978 searchSpc->nrofCandidates->aggregationLevel1 = \
2979 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2980 searchSpc->nrofCandidates->aggregationLevel2 = \
2981 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2982 searchSpc->nrofCandidates->aggregationLevel4 = \
2983 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2984 searchSpc->nrofCandidates->aggregationLevel8 = \
2985 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2986 searchSpc->nrofCandidates->aggregationLevel16 = \
2987 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2989 searchSpc->searchSpaceType = NULLP;
2990 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2991 if(!searchSpc->searchSpaceType)
2993 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2997 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2999 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3000 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3001 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3002 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3004 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3007 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3008 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3011 }/* End BuildSearchSpcToAddModList */
3013 /*******************************************************************
3015 * @brief Builds BWP DL dedicated PDCCH config
3019 * Function : BuildBWPDlDedPdcchCfg
3021 * Functionality: Builds BWP DL dedicated PDCCH config
3023 * @params[in] struct PDCCH_Config *pdcchCfg
3025 * @return ROK - success
3028 * ****************************************************************/
3029 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3031 pdcchCfg->controlResourceSetToAddModList = NULLP;
3032 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3033 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3034 if(!pdcchCfg->controlResourceSetToAddModList)
3036 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3040 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3045 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3047 pdcchCfg->searchSpacesToAddModList = NULLP;
3048 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3049 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3050 if(!pdcchCfg->searchSpacesToAddModList)
3052 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3056 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3061 pdcchCfg->searchSpacesToReleaseList = NULLP;
3062 pdcchCfg->downlinkPreemption = NULLP;
3063 pdcchCfg->tpc_PUSCH = NULLP;
3064 pdcchCfg->tpc_PUCCH = NULLP;
3065 pdcchCfg->tpc_SRS = NULLP;
3070 /*******************************************************************
3072 * @brief Builds DMRS DL PDSCH Mapping type A
3076 * Function : BuildDMRSDLPdschMapTypeA
3078 * Functionality: Builds DMRS DL PDSCH Mapping type A
3081 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3082 * @return ROK - success
3085 * ****************************************************************/
3086 uint8_t BuildDMRSDLPdschMapTypeA
3088 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3091 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3092 dmrsDlCfg->choice.setup = NULLP;
3093 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3094 if(!dmrsDlCfg->choice.setup)
3096 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3100 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3101 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3102 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3103 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3105 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3108 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3110 dmrsDlCfg->choice.setup->maxLength = NULLP;
3111 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3112 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3113 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3118 /*******************************************************************
3120 * @brief Builds TCI states to add/modify list
3124 * Function : BuildTCIStatesToAddModList
3126 * Functionality:Builds TCI states to add/modify list
3129 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3131 * @return ROK - success
3134 * ****************************************************************/
3135 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3140 /*******************************************************************
3142 * @brief Builds PDSCH time domain allocation list
3146 * Function : BuildPdschTimeDomAllocList
3148 * Functionality: Builds PDSCH time domain allocation list
3151 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3153 * @return ROK - success
3156 * ****************************************************************/
3157 uint8_t BuildPdschTimeDomAllocList
3159 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3164 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3166 timeDomAllocList->present = \
3167 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3169 timeDomAllocList->choice.setup = NULLP;
3170 CU_ALLOC(timeDomAllocList->choice.setup, \
3171 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3172 if(!timeDomAllocList->choice.setup)
3174 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3179 timeDomAllocList->choice.setup->list.count = elementCnt;
3180 timeDomAllocList->choice.setup->list.size = \
3181 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3183 timeDomAllocList->choice.setup->list.array = NULLP;
3184 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3185 timeDomAllocList->choice.setup->list.size);
3186 if(!timeDomAllocList->choice.setup->list.array)
3188 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3192 for(idx = 0; idx < elementCnt; idx++)
3194 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3195 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3196 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3197 if(!timeDomAllocList->choice.setup->list.array[idx])
3199 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3205 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3207 timeDomAlloc->k0 = NULLP;
3208 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3209 timeDomAlloc->startSymbolAndLength = 53;
3214 /*******************************************************************
3216 * @brief Builds PDSCH PRB Bundling type
3220 * Function : BuildPdschPrbBundlingType
3222 * Functionality: Builds PDSCH PRB Bundling type
3225 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3227 * @return ROK - success
3230 * ****************************************************************/
3231 uint8_t BuildPdschPrbBundlingType
3233 struct PDSCH_Config__prb_BundlingType *prbBndlType
3236 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3238 prbBndlType->choice.staticBundling = NULLP;
3239 CU_ALLOC(prbBndlType->choice.staticBundling, \
3240 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3241 if(!prbBndlType->choice.staticBundling)
3243 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3246 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3251 /*******************************************************************
3253 * @brief Builds BWP DL dedicated PDSCH config
3257 * Function : BuildBWPDlDedPdschCfg
3259 * Functionality: Builds BWP DL dedicated PDSCH config
3261 * @params[in] struct PDSCH_Config *pdschCfg
3263 * @return ROK - success
3266 * ****************************************************************/
3267 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3269 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3271 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3272 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3273 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3274 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3276 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3280 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3285 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3286 pdschCfg->tci_StatesToAddModList = NULLP;
3287 pdschCfg->tci_StatesToReleaseList = NULLP;
3288 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3290 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3291 if(!pdschCfg->tci_StatesToAddModList)
3293 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3296 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3302 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3304 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3305 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3306 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3307 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3309 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3312 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3316 pdschCfg->pdsch_AggregationFactor = NULLP;
3317 pdschCfg->rateMatchPatternToAddModList = NULLP;
3318 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3319 pdschCfg->rateMatchPatternGroup1 = NULLP;
3320 pdschCfg->rateMatchPatternGroup2 = NULLP;
3321 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3322 pdschCfg->mcs_Table = NULLP;
3324 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3325 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3326 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3328 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3331 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3333 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3338 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3339 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3340 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3341 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3342 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3343 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3344 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3349 /*******************************************************************
3351 * @brief Builds intitial DL BWP
3354 * Function : BuildInitialDlBWP
3356 * Functionality: Builds intitial DL BWP in spCellCfgDed
3358 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3360 * @return ROK - success
3363 * ****************************************************************/
3364 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3366 dlBwp->pdcch_Config = NULLP;
3367 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3368 if(!dlBwp->pdcch_Config)
3370 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3373 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3375 dlBwp->pdcch_Config->choice.setup = NULLP;
3376 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3377 if(!dlBwp->pdcch_Config->choice.setup)
3379 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3382 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3387 dlBwp->pdsch_Config = NULLP;
3388 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3389 if(!dlBwp->pdsch_Config)
3391 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3394 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3396 dlBwp->pdsch_Config->choice.setup = NULLP;
3397 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3398 if(!dlBwp->pdsch_Config->choice.setup)
3400 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3404 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3409 dlBwp->sps_Config = NULLP;
3410 dlBwp->radioLinkMonitoringConfig = NULLP;
3414 /*******************************************************************
3416 * @brief Builds DMRS UL Pusch Mapping type A
3420 * Function : BuildDMRSULPuschMapTypeA
3422 * Functionality: Builds DMRS UL Pusch Mapping type A
3425 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3426 * @return ROK - success
3429 * ****************************************************************/
3430 uint8_t BuildDMRSULPuschMapTypeA
3432 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3435 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3436 dmrsUlCfg->choice.setup= NULLP;
3437 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3438 if(!dmrsUlCfg->choice.setup)
3440 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3444 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3445 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3446 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3447 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3449 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3452 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3454 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3455 dmrsUlCfg->choice.setup->maxLength = NULLP;
3456 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3457 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3458 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3459 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3461 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3465 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3466 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3468 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3470 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3473 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3475 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3476 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3480 /*******************************************************************
3482 * @brief Build PUSCH time domain allocation list
3486 * Function : BuildPuschTimeDomAllocList
3488 * Functionality: Build PUSCH time domain allocation list
3491 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3493 * @return ROK - success
3496 * ****************************************************************/
3497 uint8_t BuildPuschTimeDomAllocList
3499 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3504 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3506 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3507 timeDomAllocList->choice.setup = NULLP;
3508 CU_ALLOC(timeDomAllocList->choice.setup, \
3509 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3510 if(!timeDomAllocList->choice.setup)
3512 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3517 timeDomAllocList->choice.setup->list.count = elementCnt;
3518 timeDomAllocList->choice.setup->list.size = \
3519 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3520 timeDomAllocList->choice.setup->list.array = NULLP;
3521 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3522 timeDomAllocList->choice.setup->list.size);
3523 if(!timeDomAllocList->choice.setup->list.array)
3525 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3529 for(idx = 0; idx < elementCnt; idx++)
3531 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3532 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3533 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3534 if(!timeDomAllocList->choice.setup->list.array[idx])
3536 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3542 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3543 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3544 if(!timeDomAlloc->k2)
3546 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3549 *(timeDomAlloc->k2) = PUSCH_K2;
3550 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3551 timeDomAlloc->startSymbolAndLength = 27;
3555 /*******************************************************************
3557 * @brief Builds BWP UL dedicated PUSCH Config
3561 * Function : BuildBWPUlDedPuschCfg
3564 * Builds BWP UL dedicated PUSCH Config
3566 * @params[in] : PUSCH_Config_t *puschCfg
3568 * @return ROK - success
3571 * ****************************************************************/
3572 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3574 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3575 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3576 if(!puschCfg->dataScramblingIdentityPUSCH)
3578 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3581 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3583 puschCfg->txConfig = NULLP;
3584 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3585 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3586 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3587 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3589 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3593 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3598 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3599 puschCfg->pusch_PowerControl = NULLP;
3600 puschCfg->frequencyHopping = NULLP;
3601 puschCfg->frequencyHoppingOffsetLists = NULLP;
3602 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3604 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3605 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3606 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3607 if(!puschCfg->pusch_TimeDomainAllocationList)
3609 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3613 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3618 puschCfg->pusch_AggregationFactor = NULLP;
3619 puschCfg->mcs_Table = NULLP;
3620 puschCfg->mcs_TableTransformPrecoder = NULLP;
3621 puschCfg->transformPrecoder = NULLP;
3622 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3623 if(!puschCfg->transformPrecoder)
3625 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3628 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3630 puschCfg->codebookSubset = NULLP;
3631 puschCfg->maxRank = NULLP;
3632 puschCfg->rbg_Size = NULLP;
3633 puschCfg->uci_OnPUSCH = NULLP;
3634 puschCfg->tp_pi2BPSK = NULLP;
3639 /*******************************************************************
3641 * @brief Fills SRS resource to add/modify list
3645 * Function : BuildSrsRsrcAddModList
3647 * Functionality: Fills SRS resource to add/modify list
3650 * @return ROK - success
3653 * ****************************************************************/
3654 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3660 resourceList->list.count = elementCnt;
3661 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3662 resourceList->list.array = NULLP;
3663 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3664 if(!resourceList->list.array)
3666 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3670 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3672 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3673 if(!resourceList->list.array[rsrcIdx])
3675 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3681 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3682 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3683 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3685 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3686 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3687 sizeof(struct SRS_Resource__transmissionComb__n2));
3688 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3690 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3693 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3694 = SRS_COMB_OFFSET_N2;
3695 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3696 = SRS_CYCLIC_SHIFT_N2;
3698 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3700 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3701 SRS_Resource__resourceMapping__nrofSymbols_n1;
3702 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3703 SRS_Resource__resourceMapping__repetitionFactor_n1;
3705 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3706 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3707 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3708 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3709 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3710 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3711 SRS_Resource__groupOrSequenceHopping_neither;
3713 /* Setting resource type to aperiodic for intergration purposes */
3714 resourceList->list.array[rsrcIdx]->resourceType.present = \
3715 SRS_Resource__resourceType_PR_aperiodic;
3716 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3717 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3718 sizeof(struct SRS_Resource__resourceType__aperiodic));
3719 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3721 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3724 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3729 /*******************************************************************
3731 * @brief Build SRS resource set Add/mod list
3735 * Function : BuildSrsRsrcSetAddModList
3737 * Functionality: Build SRS resource set Add/mod list
3740 * @return ROK - success
3743 * ****************************************************************/
3744 uint8_t BuildSrsRsrcSetAddModList
3746 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3752 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3755 rsrcSetList->list.count = elementCnt;
3756 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3757 rsrcSetList->list.array = NULLP;
3758 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3759 if(!rsrcSetList->list.array)
3761 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3765 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3767 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3768 if(!rsrcSetList->list.array[rSetIdx])
3770 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3776 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3778 /* Fill Resource Id list in resource set */
3779 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3780 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3781 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3782 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3784 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3789 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3790 rsrcIdList->list.count = elementCnt;
3791 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3792 rsrcIdList->list.array = NULLP;
3793 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3794 if(!rsrcIdList->list.array)
3796 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3800 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3802 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3803 if(!rsrcIdList->list.array[rsrcIdx])
3805 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3811 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3813 /* Fill resource type */
3814 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3815 SRS_ResourceSet__resourceType_PR_aperiodic;
3817 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3818 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3819 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3820 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3822 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3825 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3826 = APERIODIC_SRS_RESRC_TRIGGER;
3828 /* TODO : Fill values for below IEs as expected by Viavi */
3829 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3830 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3833 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3834 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3835 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3836 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3837 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3842 /*******************************************************************
3844 * @brief Builds BWP UL dedicated SRS Config
3848 * Function : BuildBWPUlDedSrsCfg
3850 * Functionality: Builds BWP UL dedicated SRS Config
3852 * @params[in] SRS Config
3853 * @return ROK - success
3856 * ****************************************************************/
3857 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3859 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3860 srsCfg->srs_ResourceSetToAddModList = NULLP;
3861 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3862 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3863 if(!srsCfg->srs_ResourceSetToAddModList)
3865 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3868 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3873 srsCfg->srs_ResourceToReleaseList = NULLP;
3875 /* Resource to Add/Modify list */
3876 srsCfg->srs_ResourceToAddModList = NULLP;
3877 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3878 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3879 if(!srsCfg->srs_ResourceToAddModList)
3881 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3885 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3890 srsCfg->tpc_Accumulation = NULLP;
3895 /*******************************************************************
3897 * @brief Builds inital UL BWP
3901 * Function : BuildInitialUlBWP
3903 * Functionality: Builds initial UL BWP
3905 * @params[in] BWP_UplinkDedicated_t *ulBwp
3906 * @return ROK - success
3909 * ****************************************************************/
3910 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3912 ulBwp->pucch_Config = NULLP;
3914 /* Fill BWP UL dedicated PUSCH config */
3915 ulBwp->pusch_Config = NULLP;
3916 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3917 if(!ulBwp->pusch_Config)
3919 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3923 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3924 ulBwp->pusch_Config->choice.setup = NULLP;
3925 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3926 if(!ulBwp->pusch_Config->choice.setup)
3928 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3932 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3937 ulBwp->configuredGrantConfig = NULLP;
3939 /* Fill BPW UL dedicated SRS config */
3940 ulBwp->srs_Config = NULLP;
3941 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3942 if(!ulBwp->srs_Config)
3944 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3948 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3949 ulBwp->srs_Config->choice.setup = NULLP;
3950 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3951 if(!ulBwp->srs_Config->choice.setup)
3953 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3957 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3962 ulBwp->beamFailureRecoveryConfig = NULLP;
3967 /*******************************************************************
3969 * @brief Builds Pusch Serving cell Config
3973 * Function : BuildPuschSrvCellCfg
3975 * Functionality: Builds Pusch Serving cell Config
3977 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3979 * @return ROK - success
3982 * ****************************************************************/
3983 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3985 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3986 puschCfg->choice.setup = NULLP;
3987 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3988 if(!puschCfg->choice.setup)
3990 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3994 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3995 puschCfg->choice.setup->rateMatching = NULLP;
3996 puschCfg->choice.setup->xOverhead = NULLP;
3997 puschCfg->choice.setup->ext1 = NULLP;
3998 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3999 if(!puschCfg->choice.setup->ext1)
4001 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4005 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4006 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4007 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4009 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4012 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4014 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4015 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4016 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4018 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4021 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4025 /*******************************************************************
4027 * @brief Builds UL config
4030 * Function : BuildUlCfg
4032 * Functionality: Builds UL config in spCellCfgDed
4034 * @params[in] UplinkConfig_t *ulCfg
4036 * @return ROK - success
4039 * ****************************************************************/
4040 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4042 ulCfg->initialUplinkBWP = NULLP;
4043 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4044 if(!ulCfg->initialUplinkBWP)
4046 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4050 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4055 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4056 ulCfg->uplinkBWP_ToAddModList = NULLP;
4057 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4058 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4059 if(!ulCfg->firstActiveUplinkBWP_Id)
4061 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4064 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4066 ulCfg->pusch_ServingCellConfig = NULLP;
4067 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4068 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4069 if(!ulCfg->pusch_ServingCellConfig)
4071 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4075 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4080 ulCfg->carrierSwitching = NULLP;
4081 ulCfg->ext1 = NULLP;
4085 /*******************************************************************
4087 * @brief Builds PDSCH serving cell config
4090 * Function : BuildPdschSrvCellCfg
4092 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4094 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4096 * @return ROK - success
4099 * ****************************************************************/
4100 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4102 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4103 pdschCfg->choice.setup = NULLP;
4104 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4105 if(!pdschCfg->choice.setup)
4107 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4111 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4112 pdschCfg->choice.setup->xOverhead = NULLP;
4113 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4114 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4115 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4117 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4120 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4121 pdschCfg->choice.setup->pucch_Cell = NULLP;
4122 pdschCfg->choice.setup->ext1 = NULLP;
4127 /*******************************************************************
4129 * @brief Builds CSI Meas config
4132 * Function : BuildCsiMeasCfg
4134 * Functionality: Builds CSI Meas config in spCellCfgDed
4136 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4138 * @return ROK - success
4141 * ****************************************************************/
4142 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4148 /*******************************************************************
4150 * @brief Builds Spcell config dedicated
4153 * Function : BuildSpCellCfgDed
4155 * Functionality: Builds sp cell config dedicated in spCellCfg
4157 * @params[in] ServingCellConfig_t srvCellCfg
4159 * @return ROK - success
4162 * ****************************************************************/
4163 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4165 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4167 srvCellCfg->initialDownlinkBWP = NULLP;
4168 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4169 if(!srvCellCfg->initialDownlinkBWP)
4171 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4175 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4177 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4180 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4181 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4183 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4184 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4185 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4187 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4190 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4192 srvCellCfg->bwp_InactivityTimer = NULLP;
4194 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4195 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4196 if(!srvCellCfg->defaultDownlinkBWP_Id)
4198 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4201 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4203 srvCellCfg->uplinkConfig = NULLP;
4204 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4205 if(!srvCellCfg->uplinkConfig)
4207 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4211 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4213 DU_LOG("\nF1AP : BuildUlCfg failed");
4216 srvCellCfg->supplementaryUplink = NULLP;
4217 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4219 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4220 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4221 if(!srvCellCfg->pdsch_ServingCellConfig)
4223 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4227 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4229 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4233 srvCellCfg->csi_MeasConfig = NULLP;
4235 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4236 if(!srvCellCfg->csi_MeasConfig)
4238 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4242 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4244 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4248 srvCellCfg->sCellDeactivationTimer = NULLP;
4249 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4250 srvCellCfg->tag_Id = TAG_ID;
4251 srvCellCfg->dummy = NULLP;
4252 srvCellCfg->pathlossReferenceLinking = NULLP;
4253 srvCellCfg->servingCellMO = NULLP;
4254 srvCellCfg->ext1 = NULLP;
4258 /*******************************************************************
4260 * @brief Builds Spcell config
4264 * Function : BuildSpCellCfg
4266 * Functionality: Builds sp cell config in DuToCuRrcContainer
4268 * @params[in] SpCellConfig_t spCellCfg
4270 * @return ROK - success
4273 * ****************************************************************/
4274 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4277 spCellCfg->servCellIndex = NULLP;
4278 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4279 if(!spCellCfg->servCellIndex)
4281 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4284 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4286 spCellCfg->reconfigurationWithSync = NULLP;
4287 spCellCfg->rlf_TimersAndConstants = NULLP;
4288 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4289 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4290 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4292 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4295 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4297 spCellCfg->spCellConfigDedicated = NULLP;
4298 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4299 if(!spCellCfg->spCellConfigDedicated)
4301 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4304 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4306 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4311 /*******************************************************************
4313 * @brief Builds Phy cell group config
4317 * Function : BuildPhyCellGrpCfg
4319 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4321 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4323 * @return ROK - success
4326 * ****************************************************************/
4327 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4329 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4330 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4332 phyCellGrpCfg->p_NR_FR1 = NULLP;
4333 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4334 if(!phyCellGrpCfg->p_NR_FR1)
4336 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4339 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4340 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4341 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4342 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4343 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4344 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4345 phyCellGrpCfg->cs_RNTI = NULLP;
4346 phyCellGrpCfg->ext1 = NULLP;
4347 phyCellGrpCfg->ext2 = NULLP;
4352 /*******************************************************************
4354 * @brief Builds tag config
4358 * Function : BuildTagConfig
4360 * Functionality: Builds tag config in MacCellGroupConfig
4362 * @params[in] TAG_Config *tag_Config
4364 * @return ROK - success
4367 * ****************************************************************/
4368 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4370 struct TAG_Config__tag_ToAddModList *tagList;
4371 uint8_t idx, elementCnt;
4373 tagConfig->tag_ToReleaseList = NULLP;
4374 tagConfig->tag_ToAddModList = NULLP;
4375 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4376 if(!tagConfig->tag_ToAddModList)
4378 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4382 elementCnt = 1; //ODU_VALUE_ONE;
4383 tagList = tagConfig->tag_ToAddModList;
4384 tagList->list.count = elementCnt;
4385 tagList->list.size = elementCnt * sizeof(struct TAG *);
4387 tagList->list.array = NULLP;
4388 CU_ALLOC(tagList->list.array, tagList->list.size);
4389 if(!tagList->list.array)
4391 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4395 for(idx=0; idx<tagList->list.count; idx++)
4397 tagList->list.array[idx] = NULLP;
4398 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4399 if(!tagList->list.array[idx])
4401 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4407 tagList->list.array[idx]->tag_Id = TAG_ID;
4408 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4413 /*******************************************************************
4415 * @brief Builds PHR Config
4419 * Function : BuildPhrConfig
4421 * Functionality: Builds phrConfig in MacCellGroupConfig
4423 * @params[in] PHR Config *
4425 * @return ROK - success
4428 * ****************************************************************/
4429 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4432 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4433 phrConfig->choice.setup = NULLP;
4434 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4435 if(!phrConfig->choice.setup)
4437 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4441 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4442 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4443 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4444 phrConfig->choice.setup->multiplePHR = false;
4445 phrConfig->choice.setup->dummy = false;
4446 phrConfig->choice.setup->phr_Type2OtherCell = false;
4447 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4452 /*******************************************************************
4454 * @brief Builds BSR Config
4458 * Function : BuildBsrConfig
4460 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4462 * @params[in] BSR_Config *bsrConfig
4464 * @return ROK - success
4467 * ****************************************************************/
4468 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4470 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4471 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4472 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4477 /*******************************************************************
4479 * @brief Builds scheduling request config
4483 * Function : BuildSchedulingReqConfig
4485 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4487 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4489 * @return ROK - success
4492 * ****************************************************************/
4493 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4495 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4496 uint8_t idx, elementCnt;
4498 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4499 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4500 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4501 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4503 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4507 elementCnt = 1; //ODU_VALUE_ONE;
4508 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4509 schReqList->list.count = elementCnt;
4510 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4512 schReqList->list.array = NULLP;
4513 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4514 if(!schReqList->list.array)
4516 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4520 for(idx=0;idx<schReqList->list.count; idx++)
4522 schReqList->list.array[idx] = NULLP;
4523 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4524 if(!schReqList->list.array[idx])
4526 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4532 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4534 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4535 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4536 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4538 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4541 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4542 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4543 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4547 /*******************************************************************
4549 * @brief Builds Mac cell group config
4553 * Function : BuildMacCellGrpCfg
4555 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4557 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4559 * @return ROK - success
4562 * ****************************************************************/
4563 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4565 macCellGrpCfg->drx_Config = NULLP;
4566 macCellGrpCfg->schedulingRequestConfig = NULLP;
4567 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4568 if(!macCellGrpCfg->schedulingRequestConfig)
4570 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4574 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4576 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4580 macCellGrpCfg->bsr_Config = NULLP;
4581 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4582 if(!macCellGrpCfg->bsr_Config)
4584 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4588 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4590 DU_LOG("\nF1AP : BuildBsrConfig failed");
4594 macCellGrpCfg->tag_Config = NULLP;
4595 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4596 if(!macCellGrpCfg->tag_Config)
4598 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4602 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4604 DU_LOG("\nF1AP : BuildTagConfig failed");
4608 macCellGrpCfg->phr_Config = NULLP;
4609 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4610 if(!macCellGrpCfg->phr_Config)
4612 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4616 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4618 DU_LOG("\nF1AP : BuildPhrConfig failed");
4622 macCellGrpCfg->skipUplinkTxDynamic = false;
4623 macCellGrpCfg->ext1 = NULLP;
4627 /*******************************************************************
4629 * @brief Frees memeory allocated for SearchSpcToAddModList
4633 * Function : FreeSearchSpcToAddModList
4635 * Functionality: Deallocating memory of SearchSpcToAddModList
4637 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4641 4221 * ****************************************************************/
4642 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4646 struct SearchSpace *searchSpc=NULLP;
4648 if(searchSpcList->list.array)
4650 if(searchSpcList->list.array[idx2])
4652 searchSpc = searchSpcList->list.array[idx2];
4653 if(searchSpc->controlResourceSetId)
4655 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4657 if(searchSpc->monitoringSymbolsWithinSlot)
4659 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4661 if(searchSpc->nrofCandidates)
4663 if(searchSpc->searchSpaceType)
4665 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4666 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4667 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4668 SearchSpace__searchSpaceType));
4670 CU_FREE(searchSpc->nrofCandidates,
4671 sizeof(struct SearchSpace__nrofCandidates));
4673 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4674 searchSpc->monitoringSymbolsWithinSlot->size);
4676 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4677 sizeof(BIT_STRING_t));
4679 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4680 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4682 CU_FREE(searchSpc->controlResourceSetId,
4683 sizeof(ControlResourceSetId_t));
4686 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4688 CU_FREE(searchSpcList->list.array[idx1],
4689 sizeof(struct SearchSpace));
4691 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4694 /*******************************************************************
4696 * @brief Frees memory allocated for PdschTimeDomAllocList
4700 * Function : FreePdschTimeDomAllocList
4702 * Functionality: Deallocating memory of PdschTimeDomAllocList
4704 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4708 4221 * ****************************************************************/
4709 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4713 if(timeDomAllocList->choice.setup)
4715 if(timeDomAllocList->choice.setup->list.array)
4717 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4719 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4720 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4722 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4723 timeDomAllocList->choice.setup->list.size);
4725 CU_FREE(timeDomAllocList->choice.setup,\
4726 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4729 /*******************************************************************
4731 * @brief Frees memory allocated for PuschTimeDomAllocList
4735 * Function : FreePuschTimeDomAllocList
4737 * Functionality: Deallocating memory of PuschTimeDomAllocList
4739 * @params[in] PUSCH_Config_t *puschCfg
4743 ***********************************************************************/
4744 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4748 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4750 if(puschCfg->pusch_TimeDomainAllocationList)
4752 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4753 if(timeDomAllocList_t->choice.setup)
4755 if(timeDomAllocList_t->choice.setup->list.array)
4757 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4758 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4760 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4761 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4763 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4764 timeDomAllocList_t->choice.setup->list.size);
4766 CU_FREE(timeDomAllocList_t->choice.setup, \
4767 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4769 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4770 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4771 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4775 /*******************************************************************
4777 * @brief Frees memory allocated for InitialUlBWP
4781 * Function : FreeInitialUlBWP
4783 * Functionality: Deallocating memory of InitialUlBWP
4785 * @params[in] BWP_UplinkDedicated_t *ulBwp
4789 * ****************************************************************/
4790 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4792 uint8_t rSetIdx, rsrcIdx;
4793 SRS_Config_t *srsCfg = NULLP;
4794 PUSCH_Config_t *puschCfg = NULLP;
4795 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4796 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4797 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4798 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4800 if(ulBwp->pusch_Config)
4802 if(ulBwp->pusch_Config->choice.setup)
4804 puschCfg=ulBwp->pusch_Config->choice.setup;
4805 if(puschCfg->dataScramblingIdentityPUSCH)
4807 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4809 FreePuschTimeDomAllocList(puschCfg);
4810 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4811 if(dmrsUlCfg->choice.setup)
4813 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4815 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4817 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4819 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4820 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4822 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4825 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4827 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4828 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4830 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4832 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4834 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4836 /* Free SRS-Config */
4837 if(ulBwp->srs_Config)
4839 if(ulBwp->srs_Config->choice.setup)
4841 srsCfg = ulBwp->srs_Config->choice.setup;
4843 /* Free Resource Set to add/mod list */
4844 if(srsCfg->srs_ResourceSetToAddModList)
4846 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4847 if(rsrcSetList->list.array)
4851 /* Free SRS resource Id list in this SRS resource set */
4852 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4854 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4856 if(rsrcIdList->list.array)
4858 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4860 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4862 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4864 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4865 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4868 /* Free resource type info for this SRS resource set */
4869 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4870 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4872 /* Free memory for each resource set */
4873 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4875 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4877 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4879 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4880 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4883 /* Free resource to add/modd list */
4884 if(srsCfg->srs_ResourceToAddModList)
4886 resourceList = srsCfg->srs_ResourceToAddModList;
4887 if(resourceList->list.array)
4890 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4891 sizeof(struct SRS_Resource__transmissionComb__n2));
4892 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4893 sizeof(struct SRS_Resource__resourceType__aperiodic));
4895 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4897 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4899 CU_FREE(resourceList->list.array, resourceList->list.size);
4901 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4902 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4905 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4907 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4911 /*******************************************************************
4913 * @brief Frees memory allocated for initialUplinkBWP
4917 * Function : FreeinitialUplinkBWP
4919 * Functionality: Deallocating memory of initialUplinkBWP
4921 * @params[in] UplinkConfig_t *ulCfg
4926 * ****************************************************************/
4927 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4929 BWP_UplinkDedicated_t *ulBwp=NULLP;
4930 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4932 if(ulCfg->initialUplinkBWP)
4934 ulBwp=ulCfg->initialUplinkBWP;
4935 if(ulCfg->firstActiveUplinkBWP_Id)
4937 if(ulCfg->pusch_ServingCellConfig)
4939 puschCfg=ulCfg->pusch_ServingCellConfig;
4940 if(puschCfg->choice.setup)
4942 if(puschCfg->choice.setup->ext1)
4944 CU_FREE(puschCfg->choice.setup->ext1->\
4945 processingType2Enabled,sizeof(BOOLEAN_t));
4946 CU_FREE(puschCfg->choice.setup->ext1->\
4947 maxMIMO_Layers,sizeof(long));
4948 CU_FREE(puschCfg->choice.setup->ext1, \
4949 sizeof(struct PUSCH_ServingCellConfig__ext1));
4951 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4953 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4955 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4957 FreeInitialUlBWP(ulBwp);
4958 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4961 /*******************************************************************
4963 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4967 * Function : FreeBWPDlDedPdschCfg
4969 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4971 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4976 * ****************************************************************/
4977 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4979 struct PDSCH_Config *pdschCfg=NULLP;
4980 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4981 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4982 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4984 if(dlBwp->pdsch_Config->choice.setup)
4986 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4987 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4989 if(pdschCfg->pdsch_TimeDomainAllocationList)
4991 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4992 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4994 prbBndlType=&pdschCfg->prb_BundlingType;
4995 CU_FREE(prbBndlType->choice.staticBundling,\
4996 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4997 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4999 FreePdschTimeDomAllocList(timeDomAllocList);
5000 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5001 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5003 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5004 if(dmrsDlCfg->choice.setup)
5006 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5008 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5010 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5011 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5013 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5016 /*******************************************************************
5018 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5022 * Function : FreeBWPDlDedPdcchCfg
5024 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5026 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5031 * ****************************************************************/
5032 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5036 struct PDCCH_Config *pdcchCfg=NULLP;
5037 struct ControlResourceSet *controlRSet=NULLP;
5038 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5040 if(dlBwp->pdcch_Config->choice.setup)
5042 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5043 if(pdcchCfg->controlResourceSetToAddModList)
5045 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5046 if(controlRSetList->list.array)
5048 controlRSet = controlRSetList->list.array[idx2];
5051 if(controlRSet->frequencyDomainResources.buf)
5053 if(controlRSet->pdcch_DMRS_ScramblingID)
5055 if(pdcchCfg->searchSpacesToAddModList)
5057 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5058 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5059 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5061 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5063 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5064 controlRSet->frequencyDomainResources.size);
5067 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5069 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5071 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5073 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5074 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5076 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5079 /*******************************************************************
5081 * @brief Builds RLC Config
5085 * Function : BuildRlcConfig
5087 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5089 * @params[in] RLC_Config *rlcConfig
5091 * @return ROK - success
5094 * ****************************************************************/
5095 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5098 rlcConfig->present = RLC_Config_PR_am;
5100 rlcConfig->choice.am = NULLP;
5101 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5102 if(!rlcConfig->choice.am)
5104 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5109 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5110 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5111 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5113 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5116 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5117 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5118 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5119 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5120 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5123 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5124 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5125 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5127 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5130 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5131 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5132 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5137 /*******************************************************************
5139 * @brief Builds MAC LC Config
5143 * Function : BuildMacLCConfig
5145 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5147 * @params[in] struct LogicalChannelConfig macLcConfig
5149 * @return ROK - success
5152 * ****************************************************************/
5153 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5156 macLcConfig->ul_SpecificParameters = NULLP;
5157 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5158 if(!macLcConfig->ul_SpecificParameters)
5160 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5164 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5165 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5166 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5167 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5168 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5169 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5170 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5172 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5173 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5174 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5176 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5179 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5181 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5182 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5183 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5185 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5188 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5190 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5191 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5192 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5196 /*******************************************************************
5198 * @brief Builds RLC Bearer to Add/Mod list
5202 * Function :BuildRlcBearerToAddModList
5204 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5206 * @params[in] rlc_BearerToAddModList
5208 * @return ROK - success
5211 * ****************************************************************/
5212 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5214 uint8_t idx, elementCnt;
5217 rlcBearerList->list.count = elementCnt;
5218 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5220 rlcBearerList->list.array = NULLP;
5221 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5222 if(!rlcBearerList->list.array)
5224 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5228 for(idx=0; idx<rlcBearerList->list.count; idx++)
5230 rlcBearerList->list.array[idx] = NULLP;
5231 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5232 if(!rlcBearerList->list.array[idx])
5234 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5240 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5242 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5243 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5245 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5249 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5250 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5252 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5253 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5254 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5255 if(!rlcBearerList->list.array[idx]->rlc_Config)
5257 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5261 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5263 DU_LOG("\nF1AP : BuildRlcConfig failed");
5267 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5268 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5269 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5271 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5275 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5277 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5284 /*******************************************************************
5286 * @brief Free memory allocated for CellGroupConfig
5290 * Function : FreeMemCellGrpCfg
5292 * Functionality: Deallocating memory of CellGroupConfig
5294 * @params[in] pointer to CellGroupConfigRrc_t
5296 * @return ROK - success
5299 ******************************************************************/
5300 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5303 SpCellConfig_t *spCellCfg=NULLP;
5304 ServingCellConfig_t *srvCellCfg=NULLP;
5305 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5306 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5307 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5308 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5309 struct RLC_Config *rlcConfig=NULLP;
5310 struct LogicalChannelConfig *macLcConfig=NULLP;
5311 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5312 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5313 struct TAG_Config *tagConfig=NULLP;
5314 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5315 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5316 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5318 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5321 if(rlcBearerList->list.array)
5323 for(idx=0; idx<rlcBearerList->list.count; idx++)
5325 if(rlcBearerList->list.array[idx])
5327 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5328 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5331 if(rlcConfig->choice.am)
5333 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5334 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5335 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5337 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5339 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5342 if(macLcConfig->ul_SpecificParameters)
5344 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5345 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5346 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5348 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5350 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5353 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5355 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5358 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5361 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5362 if(schedulingRequestConfig)
5364 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5367 if(schReqList->list.array)
5369 for(idx=0;idx<schReqList->list.count; idx++)
5371 if(schReqList->list.array[idx])
5373 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5374 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5377 CU_FREE(schReqList->list.array, schReqList->list.size);
5379 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5380 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5381 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5383 if(macCellGrpCfg->bsr_Config)
5385 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5387 tagConfig = macCellGrpCfg->tag_Config;
5390 tagList = tagConfig->tag_ToAddModList;
5393 if(tagList->list.array)
5395 for(idx=0; idx<tagList->list.count; idx++)
5397 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5399 CU_FREE(tagList->list.array, tagList->list.size);
5401 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5403 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5406 phrConfig = macCellGrpCfg->phr_Config;
5409 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5410 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5413 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5416 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5419 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5420 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5423 spCellCfg = cellGrpCfg->spCellConfig;
5426 if(spCellCfg->servCellIndex)
5428 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5430 if(spCellCfg->spCellConfigDedicated)
5432 srvCellCfg = spCellCfg->spCellConfigDedicated;
5433 if(srvCellCfg->initialDownlinkBWP)
5435 dlBwp = srvCellCfg->initialDownlinkBWP;
5436 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5438 if(srvCellCfg->defaultDownlinkBWP_Id)
5440 if(srvCellCfg->uplinkConfig)
5442 if(srvCellCfg->pdsch_ServingCellConfig)
5444 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5445 if(pdschCfg->choice.setup)
5447 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5448 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5450 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5451 ServingCellConfig__pdsch_ServingCellConfig));
5453 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5454 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5456 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5458 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5460 if(dlBwp->pdcch_Config)
5462 if(dlBwp->pdsch_Config)
5464 FreeBWPDlDedPdschCfg(dlBwp);
5465 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5467 FreeBWPDlDedPdcchCfg(dlBwp);
5468 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5470 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5472 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5474 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5476 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5478 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5483 /*******************************************************************
5485 * @brief Fills CellGroupConfig
5489 * Function : fillCellGrpCfg
5491 * Functionality: Fills CellGroupConfig
5493 * @params[in] pointer to CellGroupConfigRrc_t
5495 * @return ROK - success
5498 ******************************************************************/
5500 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5502 uint8_t ret = RFAILED;
5503 CellGroupConfigRrc_t cellGrpCfg;
5504 asn_enc_rval_t encRetVal;
5508 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5510 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5511 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5512 if(!cellGrpCfg.rlc_BearerToAddModList)
5514 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5517 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5519 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5523 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5524 cellGrpCfg.mac_CellGroupConfig = NULLP;
5525 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5526 if(!cellGrpCfg.mac_CellGroupConfig)
5528 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5531 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5533 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5538 cellGrpCfg.physicalCellGroupConfig = NULLP;
5539 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5540 if(!cellGrpCfg.physicalCellGroupConfig)
5542 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5545 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5547 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5551 cellGrpCfg.spCellConfig = NULLP;
5552 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5553 if(!cellGrpCfg.spCellConfig)
5555 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5558 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5560 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5564 cellGrpCfg.sCellToAddModList = NULLP;
5565 cellGrpCfg.sCellToReleaseList = NULLP;
5566 cellGrpCfg.ext1 = NULLP;
5568 /* encode cellGrpCfg into duToCuRrcContainer */
5569 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5570 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5572 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5573 /* Encode results */
5574 if(encRetVal.encoded == ENCODE_FAIL)
5576 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5577 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5582 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5583 for(int i=0; i< encBufSize; i++)
5585 printf("%x",encBuf[i]);
5589 cellGrp->size = encBufSize;
5590 CU_ALLOC(cellGrp->buf, cellGrp->size);
5593 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5596 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5600 FreeMemCellGrpCfg(&cellGrpCfg);
5604 /*******************************************************************
5606 * @brief Fills CuToDuContainer
5610 * Function : fillCuToDuContainer
5612 * Functionality: Fills CuToDuContainer
5614 * @params[in] pointer to CUtoDURRCInformation_t
5616 * @return ROK - success
5619 ******************************************************************/
5621 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
5623 uint8_t elementCnt = 0;
5625 uint8_t idx, idx2, rrcBufLen;
5628 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5629 if(rrcMsg->iE_Extensions)
5631 rrcMsg->iE_Extensions->list.count = elementCnt;
5632 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
5634 /* Initialize the CUtoDURRCInformation_ExtIEs */
5635 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5637 if(rrcMsg->iE_Extensions->list.array == NULLP)
5639 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
5643 for(idx=0; idx<elementCnt; idx++)
5645 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
5646 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
5652 /* Filling CellGroupConfig_t IE */
5653 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
5654 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
5655 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
5656 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
5657 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
5662 /*******************************************************************
5664 * @brief Free CuToDuContainer
5668 * Function : FreeCuToDuInfo
5670 * Functionality: Free CuToDuContainer
5672 * @params[in] pointer to CUtoDURRCInformation_t
5674 * @return ROK - success
5677 ******************************************************************/
5679 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
5683 if(rrcMsg->iE_Extensions)
5685 if(rrcMsg->iE_Extensions->list.array)
5687 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
5689 if(rrcMsg->iE_Extensions->list.array[idx])
5691 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
5693 case ProtocolIE_ID_id_CellGroupConfig:
5694 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
5696 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
5697 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
5702 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
5703 rrcMsg->iE_Extensions->list.array[idx]->id);
5709 for(idx2 = 0; idx2 < idx; idx2++)
5711 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
5713 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5717 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5720 /*******************************************************************
5722 * @brief Builds and sends the UE Setup Request
5726 * Function : BuildAndSendUeContextSetupReq
5728 * Functionality: Constructs the UE Setup Request and sends
5729 * it to the CU through SCTP.
5733 * @return ROK - success
5736 * ****************************************************************/
5737 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
5738 uint16_t rrcContLen, uint8_t *rrcContainer)
5741 uint8_t SplCellListret;
5742 uint8_t SrbSetupret;
5744 uint8_t idx, bufLen;
5746 F1AP_PDU_t *f1apMsg = NULLP;
5747 UEContextSetupRequest_t *ueSetReq = NULLP;
5748 asn_enc_rval_t encRetVal; /* Encoder return value */
5749 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5750 uint8_t ret= RFAILED;
5754 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
5756 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5757 if(f1apMsg == NULLP)
5759 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5763 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5764 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5765 if(f1apMsg->choice.initiatingMessage == NULLP)
5767 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5771 f1apMsg->choice.initiatingMessage->procedureCode = \
5772 ProcedureCode_id_UEContextSetup;
5773 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
5774 f1apMsg->choice.initiatingMessage->value.present = \
5775 InitiatingMessage__value_PR_UEContextSetupRequest;
5777 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5780 ueSetReq->protocolIEs.list.count = elementCnt;
5781 ueSetReq->protocolIEs.list.size = \
5782 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
5784 /* Initialize the UESetup members */
5785 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5787 if(ueSetReq->protocolIEs.list.array == NULLP)
5789 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
5793 for(idx1=0; idx1<elementCnt; idx1++)
5795 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
5796 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
5804 /*GNB CU UE F1AP ID*/
5805 ueSetReq->protocolIEs.list.array[idx]->id = \
5806 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
5807 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5808 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5809 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
5810 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
5812 /*GNB DU UE F1AP ID*/
5814 ueSetReq->protocolIEs.list.array[idx]->id = \
5815 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5816 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5817 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5818 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
5819 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
5823 ueSetReq->protocolIEs.list.array[idx]->id = \
5824 ProtocolIE_ID_id_SpCell_ID;
5825 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5826 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5827 UEContextSetupRequestIEs__value_PR_NRCGI;
5828 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5834 /*Served Cell Index*/
5836 ueSetReq->protocolIEs.list.array[idx]->id = \
5837 ProtocolIE_ID_id_ServCellIndex;
5838 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5839 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5840 UEContextSetupRequestIEs__value_PR_ServCellIndex;
5841 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
5844 /*CellULConfigured*/
5846 ueSetReq->protocolIEs.list.array[idx]->id = \
5847 ProtocolIE_ID_id_SpCellULConfigured;
5848 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5849 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5850 UEContextSetupRequestIEs__value_PR_CellULConfigured;
5851 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
5852 CellULConfigured_none;
5854 /*CUtoDURRCContainer*/
5856 ueSetReq->protocolIEs.list.array[idx]->id = \
5857 ProtocolIE_ID_id_CUtoDURRCInformation;
5858 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5859 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5860 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
5861 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
5866 /*Special Cells to be SetupList*/
5868 ueSetReq->protocolIEs.list.array[idx]->id = \
5869 ProtocolIE_ID_id_SCell_ToBeSetup_List;
5870 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5871 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5872 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
5873 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5874 if(SplCellListret != ROK)
5878 /*SRBs To Be Setup List*/
5880 ueSetReq->protocolIEs.list.array[idx]->id = \
5881 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
5882 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5883 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5884 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
5885 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5886 if(SrbSetupret != ROK)
5890 /*DRBs to Be Setup List*/
5892 ueSetReq->protocolIEs.list.array[idx]->id = \
5893 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
5894 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5895 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5896 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
5897 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5902 /* RRC Container for security mode */
5904 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
5905 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5906 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5907 UEContextSetupRequestIEs__value_PR_RRCContainer;
5908 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
5910 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
5911 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
5912 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
5913 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
5915 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
5918 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
5919 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
5921 /* RRC delivery status request */
5923 ueSetReq->protocolIEs.list.array[idx]->id = \
5924 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
5925 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5926 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5927 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
5928 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
5929 RRCDeliveryStatusRequest_true;
5931 /* Bit Rate hardcoded as in reference logs */
5933 ueSetReq->protocolIEs.list.array[idx]->id = \
5934 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
5935 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5936 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5937 UEContextSetupRequestIEs__value_PR_BitRate;
5938 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
5940 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
5941 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
5942 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
5943 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
5945 DU_LOG(" F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
5948 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
5949 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
5951 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5953 /* Encode the F1SetupRequest type as APER */
5954 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5956 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
5958 /* Encode results */
5959 if(encRetVal.encoded == ENCODE_FAIL)
5961 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
5962 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5967 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
5968 for(int i=0; i< encBufSize; i++)
5970 printf("%x",encBuf[i]);
5975 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
5977 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
5983 FreeUeContextSetupReq(f1apMsg);
5986 }/* End of BuildAndSendUeContextSetupReq*/
5988 /****************************************************************
5989 * @brief Function to process Ul Rrc Msg received from DU
5993 * Function : procUlRrcMsg
5996 * - Function to process Ul Rrc Msg received from DU
5999 * @return ROK - success
6002 * ****************************************************************/
6004 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6006 uint8_t idx, ret, srbId, rrcMsgType;
6007 uint8_t cuUeF1apId, duUeF1apId;
6008 uint8_t *rrcContainer = NULLP;
6009 uint16_t rrcContLen;
6010 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6013 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6015 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6017 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6019 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6021 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6024 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6026 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6029 case ProtocolIE_ID_id_SRBID:
6030 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6032 case ProtocolIE_ID_id_RRCContainer:
6034 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6035 CU_ALLOC(rrcContainer, rrcContLen)
6038 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
6041 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6047 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6053 f1apMsgDb.dlRrcMsgCount++;
6054 rrcMsgType = setDlRRCMsgType();
6055 if(rrcMsgType == REGISTRATION_ACCEPT)
6057 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Registration Accept");
6058 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6060 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6062 DU_LOG("\nF1AP: Sending Ue Context Setup Req");
6063 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6064 rrcContLen, rrcContainer);
6066 if(rrcMsgType == SECURITY_MODE_COMPLETE)
6068 /* To trigger the DL RRC Msg for RRC Reconfig */
6069 f1apMsgDb.dlRrcMsgCount++;
6070 rrcMsgType = setDlRRCMsgType();
6071 if(rrcMsgType == RRC_RECONFIG)
6073 DU_LOG("\nF1AP: Sending DL RRC MSG for RRC Reconfig");
6074 BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6081 /****************************************************************
6082 * @brief Build And Send F1ResetAck
6086 * Function : FreeF1ResetAck
6089 * - Build And Send F1ResetRSP
6092 * @return ROK - success
6095 * ****************************************************************/
6096 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6099 ResetAcknowledge_t *f1ResetAck;
6103 if(f1apMsg->choice.successfulOutcome)
6105 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6107 if(f1ResetAck->protocolIEs.list.array)
6109 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6111 if(f1ResetAck->protocolIEs.list.array[idx])
6113 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6116 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6118 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6120 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6124 /****************************************************************
6125 * @brief Build And Send F1ResetAck
6129 * Function : BuildAndSendF1ResetAck
6132 * - Build And Send F1ResetRSP
6135 * @return ROK - success
6138 * ****************************************************************/
6140 uint8_t BuildAndSendF1ResetAck()
6143 uint8_t elementCnt = 0;
6144 uint8_t ret = RFAILED;
6145 F1AP_PDU_t *f1apMsg = NULL;
6146 ResetAcknowledge_t *f1ResetAck = NULLP;
6147 asn_enc_rval_t encRetVal;
6148 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6151 /* Allocate the memory for F1ResetRequest_t */
6152 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6153 if(f1apMsg == NULLP)
6155 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6159 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6161 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6162 if(f1apMsg->choice.successfulOutcome == NULLP)
6164 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6168 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6169 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6170 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6171 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6175 f1ResetAck->protocolIEs.list.count = elementCnt;
6176 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6178 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6179 if(f1ResetAck->protocolIEs.list.array == NULLP)
6181 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6185 for(idx=0; idx<elementCnt; idx++)
6187 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6188 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6195 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6196 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6197 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6198 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6200 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6202 /* Encode the F1SetupRequest type as UPER */
6203 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6205 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6207 /* Check encode results */
6208 if(encRetVal.encoded == ENCODE_FAIL)
6210 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6211 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6216 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6217 for(int i=0; i< encBufSize; i++)
6219 printf("%x",encBuf[i]);
6223 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6225 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6233 FreeF1ResetAck(f1apMsg);
6237 /*******************************************************************
6239 * @brief Handles received F1AP message and sends back response
6243 * Function : F1APMsgHdlr
6246 * - Decodes received F1AP control message
6247 * - Prepares response message, encodes and sends to SCTP
6250 * @return ROK - success
6253 * ****************************************************************/
6254 void F1APMsgHdlr(Buffer *mBuf)
6260 F1AP_PDU_t *f1apMsg = NULLP;
6261 asn_dec_rval_t rval; /* Decoder return value */
6262 F1AP_PDU_t f1apasnmsg ;
6264 DU_LOG("\nF1AP : Received F1AP message buffer");
6265 ODU_PRINT_MSG(mBuf, 0,0);
6267 /* Copy mBuf into char array to decode it */
6268 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6269 CU_ALLOC(recvBuf, (Size)recvBufLen);
6271 if(recvBuf == NULLP)
6273 DU_LOG("\nF1AP : Memory allocation failed");
6276 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6278 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6282 printf("\nF1AP : Received flat buffer to be decoded : ");
6283 for(i=0; i< recvBufLen; i++)
6285 printf("%x",recvBuf[i]);
6288 /* Decoding flat buffer into F1AP messsage */
6289 f1apMsg = &f1apasnmsg;
6290 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6292 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6293 CU_FREE(recvBuf, (Size)recvBufLen);
6295 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6297 DU_LOG("\nF1AP : ASN decode failed");
6301 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6303 switch(f1apMsg->present)
6305 case F1AP_PDU_PR_initiatingMessage:
6307 switch(f1apMsg->choice.initiatingMessage->value.present)
6309 case InitiatingMessage__value_PR_Reset:
6311 DU_LOG("\nF1AP : F1 reset request received ");
6312 BuildAndSendF1ResetAck();
6316 case InitiatingMessage__value_PR_F1SetupRequest:
6318 DU_LOG("\nF1AP : F1 setup request received");
6319 BuildAndSendF1SetupRsp();
6323 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
6325 DU_LOG("\nF1AP : GNB-DU config update received");
6326 BuildAndSendDUUpdateAck();
6327 DU_LOG("\nF1AP : Sending F1 reset request");
6328 BuildAndSendF1ResetReq();
6331 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
6333 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
6334 procInitULRRCMsg(f1apMsg);
6337 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
6339 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
6340 procUlRrcMsg(f1apMsg);
6344 case InitiatingMessage__value_PR_RRCDeliveryReport:
6346 DU_LOG("\nF1AP : Received RRC delivery report");
6351 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
6354 }/* End of switch(initiatingMessage) */
6358 case F1AP_PDU_PR_successfulOutcome:
6360 switch(f1apMsg->choice.successfulOutcome->value.present)
6362 case SuccessfulOutcome__value_PR_ResetAcknowledge:
6364 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
6367 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
6369 DU_LOG("\nF1AP : UE ContextSetupResponse received");
6370 f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
6375 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
6376 f1apMsg->choice.successfulOutcome->value.present);
6379 }/* End of switch(successfulOutcome) */
6384 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6387 }/* End of switch(f1apMsg->present) */
6389 } /* End of F1APMsgHdlr */
6391 /**********************************************************************
6393 **********************************************************************/