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;
1749 rrcMsgType = RRC_RECONFIG;
1757 /*******************************************************************
1759 * @brief Function to build Initial UL RRC Message
1763 * Function : procInitULRRCMsg
1765 * Functionality: Function to build Initial UL RRC Message
1769 * @return ROK - success
1772 * ****************************************************************/
1774 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1776 uint8_t idx, rrcMsgType;
1778 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1779 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1781 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1783 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1785 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1787 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1789 case ProtocolIE_ID_id_NRCGI:
1791 case ProtocolIE_ID_id_C_RNTI:
1793 case ProtocolIE_ID_id_RRCContainer:
1795 case ProtocolIE_ID_id_DUtoCURRCContainer:
1797 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1798 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1799 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1801 DU_LOG("\n Received Du to Cu RRC Container ");
1802 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1803 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1804 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1805 f1apMsgDb.duToCuContainer.size);
1806 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1808 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1809 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1810 .duToCuContainer.size);
1815 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1821 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1827 f1apMsgDb.dlRrcMsgCount++;
1828 rrcMsgType = setDlRRCMsgType();
1829 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1834 /*******************************************************************
1836 * @brief Builds Nrcgi
1840 * Function : BuildNrcgi
1842 * Functionality: Building the PLMN ID and NR Cell id
1844 * @params[in] NRCGI_t *nrcgi
1845 * @return ROK - success
1848 * ****************************************************************/
1849 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1852 uint8_t unused_bits = 4;
1853 uint8_t byteSize = 5;
1855 /* Allocate Buffer Memory */
1856 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1857 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1858 if(nrcgi->pLMN_Identity.buf == NULLP)
1862 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1868 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1869 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1870 if(nrcgi->nRCellIdentity.buf == NULLP)
1875 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1881 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1882 nrcgi->nRCellIdentity.buf[0] |= val;
1883 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1887 /*******************************************************************
1889 * @brief Builds Special cell list for UE Setup Request
1893 * Function : BuildSplCellList
1895 * Functionality: Constructs the Special Cell list for UESetReq
1897 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1899 * @return ROK - success
1902 * ****************************************************************/
1903 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1909 spCellLst->list.count = cellCnt;
1910 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1911 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1912 if(spCellLst->list.array == NULLP)
1916 for(idx=0; idx<cellCnt; idx++)
1918 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1919 if(spCellLst->list.array[idx] == NULLP)
1925 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1926 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1927 spCellLst->list.array[idx]->value.present =\
1928 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1929 /* Special Cell ID -NRCGI */
1930 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1935 /*Special Cell Index*/
1936 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1938 }/* End of BuildSplCellList*/
1940 /*******************************************************************
1942 * @brief Builds SRBS to be setup
1946 * Function : BuildSRBSetup
1948 * Functionality: Constructs the SRB's for UESetReq
1950 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1952 * @return ROK - success
1955 * ****************************************************************/
1956 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1961 srbSet->list.count = srbCnt;
1962 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1963 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1964 if(srbSet->list.array == NULLP)
1968 for(idx=0; idx<srbCnt; idx++)
1970 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1971 if(srbSet->list.array[idx] == NULLP)
1977 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1978 srbSet->list.array[idx]->criticality = Criticality_ignore;
1979 srbSet->list.array[idx]->value.present = \
1980 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1981 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1983 }/* End of BuildSRBSetup*/
1985 /*******************************************************************
1987 * @brief Builds QOS Info for DRB Setum Item
1991 * Function : BuildQOSInfo
1993 * Functionality: Constructs the QOS Info for DRB Setup Item
1995 * @params[in] QoSInformation_t *qosinfo
1997 * @return ROK - success
2000 * ****************************************************************/
2001 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2003 /* NonDynamic5QIDescriptor */
2004 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2005 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2006 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2011 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2013 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2014 sizeof(AveragingWindow_t));
2015 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2020 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2021 /*MaxDataBurstVolume*/
2022 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2023 sizeof(MaxDataBurstVolume_t));
2024 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2029 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2031 /*nRGRAN Allocation Retention Priority*/
2032 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2033 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2034 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2036 /* TO DO: GBR_QoSFlowInformation */
2038 }/*End of BuildQOSInfo*/
2040 /*******************************************************************
2042 * @brief Builds SNSSAI
2046 * Function : BuildSNSSAI
2048 * Functionality: Constructs the SNSSAI For DRB list
2050 * @params[in] SNSSAI_t *snssai
2052 * @return ROK - success
2055 * ****************************************************************/
2056 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2060 snssai->sST.size = sizeof(uint8_t);
2061 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2062 if(snssai->sST.buf == NULLP)
2066 snssai->sST.buf[0] = 3;
2068 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2069 if(snssai->sD == NULLP)
2073 snssai->sD->size = 3*sizeof(uint8_t);
2074 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2075 if(snssai->sD->buf == NULLP)
2079 snssai->sD->buf[0] = 3;
2080 snssai->sD->buf[1] = 6;
2081 snssai->sD->buf[2] = 9;
2083 }/*End of BuildSNSSAI*/
2085 /*******************************************************************
2087 * @brief Builds the flow map.
2091 * Function : BuildFlowsMap
2093 * Functionality: Constructs the flowmap For DRB list
2095 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2097 * @return ROK - success
2100 * ****************************************************************/
2101 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2107 flowMap->list.count = flowCnt;
2108 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2109 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2110 if(flowMap->list.array == NULLP)
2114 for(idx=0; idx<flowCnt; idx++)
2116 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2117 if(flowMap->list.array[idx] == NULLP)
2123 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2124 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2130 }/*End of BuildFlowsMap*/
2132 /*******************************************************************
2134 * @brief Builds the Uplink Tunnel Info
2138 * Function : BuildULTnlInfo
2140 * Functionality: Constructs the UL TnlInfo For DRB list
2142 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2144 * @return ROK - success
2147 * ****************************************************************/
2148 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2153 ulInfo->list.count = ulCnt;
2154 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2155 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2156 if(ulInfo->list.array == NULLP)
2160 for(idx=0; idx<ulCnt; idx++)
2162 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2163 if(ulInfo->list.array[idx] == NULLP)
2169 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2170 UPTransportLayerInformation_PR_gTPTunnel;
2172 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2173 sizeof(GTPTunnel_t));
2174 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2178 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2179 transportLayerAddress.size = 4*sizeof(uint8_t);
2180 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2181 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2182 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2183 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2184 transportLayerAddress.buf == NULLP)
2188 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2189 transportLayerAddress.buf[0] = 4;
2190 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2191 transportLayerAddress.buf[1] = 4;
2192 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2193 transportLayerAddress.buf[2] = 4;
2194 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2195 transportLayerAddress.buf[3] = 5;
2196 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2197 transportLayerAddress.bits_unused = 0;
2199 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2200 = 4 * sizeof(uint8_t);
2201 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2202 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2203 gTPTunnel->gTP_TEID.size);
2204 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2209 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2210 gTP_TEID.buf[0] = 11;
2211 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2212 gTP_TEID.buf[1] = 0;
2213 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2214 gTP_TEID.buf[2] = 0;
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 gTP_TEID.buf[3] = 1;
2219 }/*End of BuildULTnlInfo*/
2221 /*******************************************************************
2223 * @brief Builds DRBS to be setup
2227 * Function : BuildDRBSetup
2229 * Functionality: Constructs the DRB's for UESetReq
2231 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2233 * @return ROK - success
2236 * ****************************************************************/
2237 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2239 uint8_t BuildQOSInforet;
2240 uint8_t BuildSNSSAIret;
2241 uint8_t BuildFlowsMapret;
2242 uint8_t BuildULTnlInforet;
2245 DRBs_ToBeSetup_Item_t *drbSetItem;
2247 drbSet->list.count = drbCnt;
2248 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2249 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2250 if(drbSet->list.array == NULLP)
2254 for(idx=0; idx<drbCnt; idx++)
2256 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2257 if(drbSet->list.array[idx] == NULLP)
2263 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2264 drbSet->list.array[idx]->criticality = Criticality_ignore;
2265 drbSet->list.array[idx]->value.present = \
2266 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2267 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2269 drbSetItem->dRBID = 1;
2271 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2272 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2273 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2277 drbSetItem->qoSInformation.choice.choice_extension->id = \
2278 ProtocolIE_ID_id_DRB_Information;
2279 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2281 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2282 QoSInformation_ExtIEs__value_PR_DRB_Information;
2283 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2284 choice_extension->value.choice.DRB_Information.dRB_QoS);
2285 if(BuildQOSInforet != ROK)
2290 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2291 choice_extension->value.choice.DRB_Information.sNSSAI);
2292 if(BuildSNSSAIret != ROK)
2296 /*Flows mapped to DRB List*/
2297 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2298 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2299 if(BuildFlowsMapret != ROK)
2303 /*ULUPTNLInformation To Be Setup List*/
2304 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2305 if(BuildULTnlInforet != ROK)
2310 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2312 /*UL Configuration*/
2313 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2314 if(drbSetItem->uLConfiguration == NULLP)
2318 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2320 }/* End of BuildDRBSetup*/
2322 /*******************************************************************
2324 * @brief Deallocating memory of function BuildAndSendUESetReq
2328 * Function : FreeNrcgi
2330 * Functionality: Deallocating memory for function BuildNrcgi
2332 * @params[in] NRCGI_t *nrcgi
2336 *******************************************************************/
2337 void FreeNrcgi(NRCGI_t *nrcgi)
2339 if(nrcgi->pLMN_Identity.buf != NULLP)
2341 if(nrcgi->nRCellIdentity.buf != NULLP)
2343 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2345 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2348 /*******************************************************************
2350 * @brief Deallocating memory of function BuildAndSendUESetReq
2354 * Function : FreeSplCellList
2356 * Functionality: Deallocating memory for function BuildSplCellList
2358 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2363 * *****************************************************************/
2364 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2367 if(spCellLst->list.array != NULLP)
2369 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2371 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2373 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2375 if(spCellLst->list.array[cellidx]!=NULLP)
2377 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2380 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2383 /*******************************************************************
2385 * @brief Deallocating memory of function BuildAndSendUESetReq
2389 * Function : FreeSRBSetup
2391 * Functionality: Deallocating memory for function BuildSRBSetup
2393 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2398 * ******************************************************************/
2399 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2402 if(srbSet->list.array != NULLP)
2404 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2406 if(srbSet->list.array[srbidx]!=NULLP)
2408 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2411 CU_FREE(srbSet->list.array,srbSet->list.size);
2414 /*******************************************************************
2416 * @brief Deallocating memory of function BuildAndSendUESetReq
2420 * Function : FreeQOSInfo
2422 * Functionality: Deallocating memory for function BuildQOSInfo
2424 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2428 * ****************************************************************/
2429 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2431 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2433 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2435 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2437 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2438 sizeof(MaxDataBurstVolume_t));
2440 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2441 sizeof(AveragingWindow_t));
2443 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2444 sizeof(NonDynamic5QIDescriptor_t));
2447 /*******************************************************************
2449 * @brief Deallocating memory of function BuildAndSendUESetReq
2453 * Function : FreeULTnlInfo
2455 * Functionality: Deallocating memory for function BuildULTnlInfo
2457 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2462 * ****************************************************************/
2463 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2466 if(ulInfo->list.array != NULLP)
2468 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2470 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2472 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2474 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2475 transportLayerAddress.buf != NULLP)
2477 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2480 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2481 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2482 gTPTunnel->gTP_TEID.size);
2484 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2485 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2486 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2488 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2489 sizeof(GTPTunnel_t));
2492 if(ulInfo->list.array[ulidx]!=NULLP)
2494 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2497 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2500 /*******************************************************************
2502 * @brief Deallocating memory for BuildAndSendUESetReq
2506 * Function : FreeDRBSetup
2508 * Functionality: Deallocating memory for BuildDRBSetup
2510 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2514 * ****************************************************************/
2515 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2517 DRBs_ToBeSetup_Item_t *drbSetItem;
2520 if(drbSet->list.array == NULLP)
2522 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2524 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2526 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2527 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2529 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2530 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2532 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2533 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2535 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2536 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2538 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2540 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2542 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2544 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2545 flows_Mapped_To_DRB_List.list.array != NULLP)
2547 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2548 flows_Mapped_To_DRB_List.list.count; flowidx++)
2550 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2551 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2553 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2554 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2555 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2557 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2558 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2559 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2561 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2562 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2563 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2565 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2566 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2568 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2569 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2570 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2571 sizeof(MaxDataBurstVolume_t));
2573 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2574 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2575 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2577 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2578 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2579 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2582 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2583 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2585 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2586 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2589 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2590 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2591 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2593 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2594 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2596 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2597 sizeof(OCTET_STRING_t));
2599 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2600 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2602 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2603 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2605 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2606 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2608 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2609 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2611 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2614 if(drbSet->list.array[drbidx]!=NULLP)
2616 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2619 CU_FREE(drbSet->list.array,drbSet->list.size);
2624 /*******************************************************************
2626 * @brief Free the UE Setup Request
2630 * Function : FreeUeContextSetupReq
2632 * Functionality: Deallocate the memory of BuildUESetReq
2634 * @params[in] F1AP_PDU_t *f1apMsg
2639 * ****************************************************************/
2640 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2643 UEContextSetupRequest_t *ueSetReq = NULLP;
2645 if(f1apMsg != NULLP)
2647 if(f1apMsg->choice.initiatingMessage != NULLP)
2649 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2650 if(ueSetReq->protocolIEs.list.array != NULLP)
2652 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2654 if(ueSetReq->protocolIEs.list.array[idx])
2656 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2658 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2660 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2662 case ProtocolIE_ID_id_SpCell_ID:
2663 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2665 case ProtocolIE_ID_id_ServCellIndex:
2667 case ProtocolIE_ID_id_SpCellULConfigured:
2669 case ProtocolIE_ID_id_CUtoDURRCInformation:
2670 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2672 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2673 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2675 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2676 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2678 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2679 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2681 case ProtocolIE_ID_id_RRCContainer:
2682 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2684 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2685 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2689 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2694 for(ieId=0; ieId<idx; ieId++)
2696 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2698 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2701 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2703 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2705 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2709 /**Filling cell group info **/
2710 /*******************************************************************
2712 * @brief Build Control resource set to add/modify list
2716 * Function : BuildControlRSetToAddModList
2718 * Functionality: Build Control resource set to add/modify list
2721 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2723 * @return ROK - success
2726 * ****************************************************************/
2727 uint8_t BuildControlRSetToAddModList
2729 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2734 uint8_t numBytes, bitsUnused;
2735 struct ControlResourceSet *controlRSet;
2736 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2737 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2740 controlRSetList->list.count = elementCnt;
2741 controlRSetList->list.size = \
2742 elementCnt * sizeof(struct ControlResourceSet *);
2744 controlRSetList->list.array = NULLP;
2745 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2746 if(!controlRSetList->list.array)
2748 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2752 for(idx = 0; idx < elementCnt; idx++)
2754 controlRSetList->list.array[idx] = NULLP;
2755 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2756 if(!controlRSetList->list.array[idx])
2758 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2764 controlRSet = controlRSetList->list.array[idx];
2765 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2767 /* Values harcoded according to our design:
2770 * Bit string stored ff0000000000
2774 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2775 controlRSet->frequencyDomainResources.buf = NULLP;
2776 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2777 controlRSet->frequencyDomainResources.size);
2778 if(!controlRSet->frequencyDomainResources.buf)
2780 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2784 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2785 coreset0EndPrb = CORESET0_END_PRB;
2786 coreset1StartPrb = coreset0EndPrb + 6;
2787 coreset1NumPrb = CORESET1_NUM_PRB;
2788 /* calculate the PRBs */
2789 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2790 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2791 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2793 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2794 controlRSet->cce_REG_MappingType.present = \
2795 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2797 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2798 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2799 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2800 controlRSet->tci_PresentInDCI = NULLP;
2802 uint8_t tciStateIdx;
2804 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2805 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2806 if(!controlRset->tci_StatesPDCCH_ToAddList)
2808 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2813 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2814 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2815 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2816 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2817 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2819 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2823 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2825 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2826 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2828 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2835 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2837 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2838 if(!controlRset->tci_PresentInDCI)
2840 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2844 *(controlRset->tci_PresentInDCI);
2847 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2848 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2849 if(!controlRSet->pdcch_DMRS_ScramblingID)
2851 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2854 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2857 } /* End BuildControlRSetToAddModList */
2859 /*******************************************************************
2861 * @brief Build search space to add/modify list
2865 * Function : BuildSearchSpcToAddModList
2867 * Functionality: Build search space to add/modify list
2870 * @return ROK - success
2873 * ****************************************************************/
2874 uint8_t BuildSearchSpcToAddModList
2876 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2884 struct SearchSpace *searchSpc;
2887 searchSpcList->list.count = elementCnt;
2888 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2890 searchSpcList->list.array = NULLP;
2891 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2892 if(!searchSpcList->list.array)
2894 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2898 for(idx = 0; idx < elementCnt; idx++)
2900 searchSpcList->list.array[idx] = NULLP;
2901 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2902 if(!searchSpcList->list.array[idx])
2904 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2910 searchSpc = searchSpcList->list.array[idx];
2912 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2914 searchSpc->controlResourceSetId = NULLP;
2915 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2916 if(!searchSpc->controlResourceSetId)
2918 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2921 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2923 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2924 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2925 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2926 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2928 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2931 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2932 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2934 searchSpc->duration = NULLP;
2935 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2936 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2937 if(!searchSpc->monitoringSymbolsWithinSlot)
2939 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2943 /* Values taken from reference logs :
2946 * Bit string stores 8000
2951 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2952 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2953 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2954 searchSpc->monitoringSymbolsWithinSlot->size);
2955 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2957 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2962 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2963 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2964 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2965 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2967 searchSpc->nrofCandidates = NULLP;
2968 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2969 if(!searchSpc->nrofCandidates)
2971 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2975 searchSpc->nrofCandidates->aggregationLevel1 = \
2976 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2977 searchSpc->nrofCandidates->aggregationLevel2 = \
2978 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2979 searchSpc->nrofCandidates->aggregationLevel4 = \
2980 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2981 searchSpc->nrofCandidates->aggregationLevel8 = \
2982 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2983 searchSpc->nrofCandidates->aggregationLevel16 = \
2984 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2986 searchSpc->searchSpaceType = NULLP;
2987 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2988 if(!searchSpc->searchSpaceType)
2990 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2994 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2996 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2997 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2998 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2999 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3001 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3004 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3005 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3008 }/* End BuildSearchSpcToAddModList */
3010 /*******************************************************************
3012 * @brief Builds BWP DL dedicated PDCCH config
3016 * Function : BuildBWPDlDedPdcchCfg
3018 * Functionality: Builds BWP DL dedicated PDCCH config
3020 * @params[in] struct PDCCH_Config *pdcchCfg
3022 * @return ROK - success
3025 * ****************************************************************/
3026 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3028 pdcchCfg->controlResourceSetToAddModList = NULLP;
3029 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3030 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3031 if(!pdcchCfg->controlResourceSetToAddModList)
3033 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3037 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3042 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3044 pdcchCfg->searchSpacesToAddModList = NULLP;
3045 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3046 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3047 if(!pdcchCfg->searchSpacesToAddModList)
3049 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3053 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3058 pdcchCfg->searchSpacesToReleaseList = NULLP;
3059 pdcchCfg->downlinkPreemption = NULLP;
3060 pdcchCfg->tpc_PUSCH = NULLP;
3061 pdcchCfg->tpc_PUCCH = NULLP;
3062 pdcchCfg->tpc_SRS = NULLP;
3067 /*******************************************************************
3069 * @brief Builds DMRS DL PDSCH Mapping type A
3073 * Function : BuildDMRSDLPdschMapTypeA
3075 * Functionality: Builds DMRS DL PDSCH Mapping type A
3078 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3079 * @return ROK - success
3082 * ****************************************************************/
3083 uint8_t BuildDMRSDLPdschMapTypeA
3085 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3088 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3089 dmrsDlCfg->choice.setup = NULLP;
3090 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3091 if(!dmrsDlCfg->choice.setup)
3093 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3097 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3098 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3099 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3100 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3102 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3105 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3107 dmrsDlCfg->choice.setup->maxLength = NULLP;
3108 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3109 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3110 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3115 /*******************************************************************
3117 * @brief Builds TCI states to add/modify list
3121 * Function : BuildTCIStatesToAddModList
3123 * Functionality:Builds TCI states to add/modify list
3126 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3128 * @return ROK - success
3131 * ****************************************************************/
3132 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3137 /*******************************************************************
3139 * @brief Builds PDSCH time domain allocation list
3143 * Function : BuildPdschTimeDomAllocList
3145 * Functionality: Builds PDSCH time domain allocation list
3148 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3150 * @return ROK - success
3153 * ****************************************************************/
3154 uint8_t BuildPdschTimeDomAllocList
3156 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3161 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3163 timeDomAllocList->present = \
3164 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3166 timeDomAllocList->choice.setup = NULLP;
3167 CU_ALLOC(timeDomAllocList->choice.setup, \
3168 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3169 if(!timeDomAllocList->choice.setup)
3171 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3176 timeDomAllocList->choice.setup->list.count = elementCnt;
3177 timeDomAllocList->choice.setup->list.size = \
3178 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3180 timeDomAllocList->choice.setup->list.array = NULLP;
3181 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3182 timeDomAllocList->choice.setup->list.size);
3183 if(!timeDomAllocList->choice.setup->list.array)
3185 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3189 for(idx = 0; idx < elementCnt; idx++)
3191 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3192 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3193 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3194 if(!timeDomAllocList->choice.setup->list.array[idx])
3196 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3202 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3204 timeDomAlloc->k0 = NULLP;
3205 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3206 timeDomAlloc->startSymbolAndLength = 53;
3211 /*******************************************************************
3213 * @brief Builds PDSCH PRB Bundling type
3217 * Function : BuildPdschPrbBundlingType
3219 * Functionality: Builds PDSCH PRB Bundling type
3222 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3224 * @return ROK - success
3227 * ****************************************************************/
3228 uint8_t BuildPdschPrbBundlingType
3230 struct PDSCH_Config__prb_BundlingType *prbBndlType
3233 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3235 prbBndlType->choice.staticBundling = NULLP;
3236 CU_ALLOC(prbBndlType->choice.staticBundling, \
3237 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3238 if(!prbBndlType->choice.staticBundling)
3240 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3243 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3248 /*******************************************************************
3250 * @brief Builds BWP DL dedicated PDSCH config
3254 * Function : BuildBWPDlDedPdschCfg
3256 * Functionality: Builds BWP DL dedicated PDSCH config
3258 * @params[in] struct PDSCH_Config *pdschCfg
3260 * @return ROK - success
3263 * ****************************************************************/
3264 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3266 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3268 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3269 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3270 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3271 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3273 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3277 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3282 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3283 pdschCfg->tci_StatesToAddModList = NULLP;
3284 pdschCfg->tci_StatesToReleaseList = NULLP;
3285 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3287 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3288 if(!pdschCfg->tci_StatesToAddModList)
3290 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3293 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3299 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3301 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3302 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3303 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3304 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3306 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3309 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3313 pdschCfg->pdsch_AggregationFactor = NULLP;
3314 pdschCfg->rateMatchPatternToAddModList = NULLP;
3315 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3316 pdschCfg->rateMatchPatternGroup1 = NULLP;
3317 pdschCfg->rateMatchPatternGroup2 = NULLP;
3318 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3319 pdschCfg->mcs_Table = NULLP;
3321 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3322 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3323 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3325 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3328 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3330 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3335 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3336 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3337 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3338 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3339 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3340 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3341 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3346 /*******************************************************************
3348 * @brief Builds intitial DL BWP
3351 * Function : BuildInitialDlBWP
3353 * Functionality: Builds intitial DL BWP in spCellCfgDed
3355 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3357 * @return ROK - success
3360 * ****************************************************************/
3361 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3363 dlBwp->pdcch_Config = NULLP;
3364 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3365 if(!dlBwp->pdcch_Config)
3367 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3370 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3372 dlBwp->pdcch_Config->choice.setup = NULLP;
3373 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3374 if(!dlBwp->pdcch_Config->choice.setup)
3376 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3379 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3384 dlBwp->pdsch_Config = NULLP;
3385 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3386 if(!dlBwp->pdsch_Config)
3388 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3391 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3393 dlBwp->pdsch_Config->choice.setup = NULLP;
3394 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3395 if(!dlBwp->pdsch_Config->choice.setup)
3397 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3401 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3406 dlBwp->sps_Config = NULLP;
3407 dlBwp->radioLinkMonitoringConfig = NULLP;
3411 /*******************************************************************
3413 * @brief Builds DMRS UL Pusch Mapping type A
3417 * Function : BuildDMRSULPuschMapTypeA
3419 * Functionality: Builds DMRS UL Pusch Mapping type A
3422 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3423 * @return ROK - success
3426 * ****************************************************************/
3427 uint8_t BuildDMRSULPuschMapTypeA
3429 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3432 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3433 dmrsUlCfg->choice.setup= NULLP;
3434 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3435 if(!dmrsUlCfg->choice.setup)
3437 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3441 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3442 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3443 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3444 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3446 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3449 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3451 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3452 dmrsUlCfg->choice.setup->maxLength = NULLP;
3453 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3454 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3455 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3456 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3458 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3462 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3463 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3465 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3467 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3470 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3472 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3473 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3477 /*******************************************************************
3479 * @brief Build PUSCH time domain allocation list
3483 * Function : BuildPuschTimeDomAllocList
3485 * Functionality: Build PUSCH time domain allocation list
3488 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3490 * @return ROK - success
3493 * ****************************************************************/
3494 uint8_t BuildPuschTimeDomAllocList
3496 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3501 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3503 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3504 timeDomAllocList->choice.setup = NULLP;
3505 CU_ALLOC(timeDomAllocList->choice.setup, \
3506 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3507 if(!timeDomAllocList->choice.setup)
3509 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3514 timeDomAllocList->choice.setup->list.count = elementCnt;
3515 timeDomAllocList->choice.setup->list.size = \
3516 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3517 timeDomAllocList->choice.setup->list.array = NULLP;
3518 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3519 timeDomAllocList->choice.setup->list.size);
3520 if(!timeDomAllocList->choice.setup->list.array)
3522 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3526 for(idx = 0; idx < elementCnt; idx++)
3528 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3529 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3530 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3531 if(!timeDomAllocList->choice.setup->list.array[idx])
3533 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3539 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3540 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3541 if(!timeDomAlloc->k2)
3543 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3546 *(timeDomAlloc->k2) = PUSCH_K2;
3547 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3548 timeDomAlloc->startSymbolAndLength = 27;
3552 /*******************************************************************
3554 * @brief Builds BWP UL dedicated PUSCH Config
3558 * Function : BuildBWPUlDedPuschCfg
3561 * Builds BWP UL dedicated PUSCH Config
3563 * @params[in] : PUSCH_Config_t *puschCfg
3565 * @return ROK - success
3568 * ****************************************************************/
3569 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3571 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3572 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3573 if(!puschCfg->dataScramblingIdentityPUSCH)
3575 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3578 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3580 puschCfg->txConfig = NULLP;
3581 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3582 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3583 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3584 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3586 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3590 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3595 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3596 puschCfg->pusch_PowerControl = NULLP;
3597 puschCfg->frequencyHopping = NULLP;
3598 puschCfg->frequencyHoppingOffsetLists = NULLP;
3599 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3601 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3602 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3603 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3604 if(!puschCfg->pusch_TimeDomainAllocationList)
3606 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3610 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3615 puschCfg->pusch_AggregationFactor = NULLP;
3616 puschCfg->mcs_Table = NULLP;
3617 puschCfg->mcs_TableTransformPrecoder = NULLP;
3618 puschCfg->transformPrecoder = NULLP;
3619 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3620 if(!puschCfg->transformPrecoder)
3622 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3625 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3627 puschCfg->codebookSubset = NULLP;
3628 puschCfg->maxRank = NULLP;
3629 puschCfg->rbg_Size = NULLP;
3630 puschCfg->uci_OnPUSCH = NULLP;
3631 puschCfg->tp_pi2BPSK = NULLP;
3636 /*******************************************************************
3638 * @brief Fills SRS resource to add/modify list
3642 * Function : BuildSrsRsrcAddModList
3644 * Functionality: Fills SRS resource to add/modify list
3647 * @return ROK - success
3650 * ****************************************************************/
3651 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3657 resourceList->list.count = elementCnt;
3658 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3659 resourceList->list.array = NULLP;
3660 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3661 if(!resourceList->list.array)
3663 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3667 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3669 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3670 if(!resourceList->list.array[rsrcIdx])
3672 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3678 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3679 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3680 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3682 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3683 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3684 sizeof(struct SRS_Resource__transmissionComb__n2));
3685 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3687 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3690 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3691 = SRS_COMB_OFFSET_N2;
3692 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3693 = SRS_CYCLIC_SHIFT_N2;
3695 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3697 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3698 SRS_Resource__resourceMapping__nrofSymbols_n1;
3699 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3700 SRS_Resource__resourceMapping__repetitionFactor_n1;
3702 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3703 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3704 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3705 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3706 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3707 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3708 SRS_Resource__groupOrSequenceHopping_neither;
3710 /* Setting resource type to aperiodic for intergration purposes */
3711 resourceList->list.array[rsrcIdx]->resourceType.present = \
3712 SRS_Resource__resourceType_PR_aperiodic;
3713 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3714 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3715 sizeof(struct SRS_Resource__resourceType__aperiodic));
3716 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3718 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3721 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3726 /*******************************************************************
3728 * @brief Build SRS resource set Add/mod list
3732 * Function : BuildSrsRsrcSetAddModList
3734 * Functionality: Build SRS resource set Add/mod list
3737 * @return ROK - success
3740 * ****************************************************************/
3741 uint8_t BuildSrsRsrcSetAddModList
3743 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3749 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3752 rsrcSetList->list.count = elementCnt;
3753 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3754 rsrcSetList->list.array = NULLP;
3755 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3756 if(!rsrcSetList->list.array)
3758 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3762 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3764 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3765 if(!rsrcSetList->list.array[rSetIdx])
3767 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3773 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3775 /* Fill Resource Id list in resource set */
3776 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3777 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3778 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3779 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3781 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3786 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3787 rsrcIdList->list.count = elementCnt;
3788 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3789 rsrcIdList->list.array = NULLP;
3790 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3791 if(!rsrcIdList->list.array)
3793 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3797 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3799 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3800 if(!rsrcIdList->list.array[rsrcIdx])
3802 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3808 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3810 /* Fill resource type */
3811 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3812 SRS_ResourceSet__resourceType_PR_aperiodic;
3814 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3815 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3816 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3817 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3819 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3822 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3823 = APERIODIC_SRS_RESRC_TRIGGER;
3825 /* TODO : Fill values for below IEs as expected by Viavi */
3826 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3827 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3830 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3831 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3832 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3833 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3834 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3839 /*******************************************************************
3841 * @brief Builds BWP UL dedicated SRS Config
3845 * Function : BuildBWPUlDedSrsCfg
3847 * Functionality: Builds BWP UL dedicated SRS Config
3849 * @params[in] SRS Config
3850 * @return ROK - success
3853 * ****************************************************************/
3854 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3856 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3857 srsCfg->srs_ResourceSetToAddModList = NULLP;
3858 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3859 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3860 if(!srsCfg->srs_ResourceSetToAddModList)
3862 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3865 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3870 srsCfg->srs_ResourceToReleaseList = NULLP;
3872 /* Resource to Add/Modify list */
3873 srsCfg->srs_ResourceToAddModList = NULLP;
3874 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3875 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3876 if(!srsCfg->srs_ResourceToAddModList)
3878 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3882 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3887 srsCfg->tpc_Accumulation = NULLP;
3892 /*******************************************************************
3894 * @brief Builds inital UL BWP
3898 * Function : BuildInitialUlBWP
3900 * Functionality: Builds initial UL BWP
3902 * @params[in] BWP_UplinkDedicated_t *ulBwp
3903 * @return ROK - success
3906 * ****************************************************************/
3907 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3909 ulBwp->pucch_Config = NULLP;
3911 /* Fill BWP UL dedicated PUSCH config */
3912 ulBwp->pusch_Config = NULLP;
3913 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3914 if(!ulBwp->pusch_Config)
3916 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3920 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3921 ulBwp->pusch_Config->choice.setup = NULLP;
3922 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3923 if(!ulBwp->pusch_Config->choice.setup)
3925 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3929 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3934 ulBwp->configuredGrantConfig = NULLP;
3936 /* Fill BPW UL dedicated SRS config */
3937 ulBwp->srs_Config = NULLP;
3938 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3939 if(!ulBwp->srs_Config)
3941 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3945 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3946 ulBwp->srs_Config->choice.setup = NULLP;
3947 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3948 if(!ulBwp->srs_Config->choice.setup)
3950 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3954 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3959 ulBwp->beamFailureRecoveryConfig = NULLP;
3964 /*******************************************************************
3966 * @brief Builds Pusch Serving cell Config
3970 * Function : BuildPuschSrvCellCfg
3972 * Functionality: Builds Pusch Serving cell Config
3974 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3976 * @return ROK - success
3979 * ****************************************************************/
3980 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3982 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3983 puschCfg->choice.setup = NULLP;
3984 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3985 if(!puschCfg->choice.setup)
3987 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3991 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3992 puschCfg->choice.setup->rateMatching = NULLP;
3993 puschCfg->choice.setup->xOverhead = NULLP;
3994 puschCfg->choice.setup->ext1 = NULLP;
3995 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3996 if(!puschCfg->choice.setup->ext1)
3998 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4002 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4003 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4004 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4006 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4009 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4011 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4012 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4013 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4015 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4018 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4022 /*******************************************************************
4024 * @brief Builds UL config
4027 * Function : BuildUlCfg
4029 * Functionality: Builds UL config in spCellCfgDed
4031 * @params[in] UplinkConfig_t *ulCfg
4033 * @return ROK - success
4036 * ****************************************************************/
4037 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4039 ulCfg->initialUplinkBWP = NULLP;
4040 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4041 if(!ulCfg->initialUplinkBWP)
4043 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4047 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4052 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4053 ulCfg->uplinkBWP_ToAddModList = NULLP;
4054 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4055 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4056 if(!ulCfg->firstActiveUplinkBWP_Id)
4058 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4061 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4063 ulCfg->pusch_ServingCellConfig = NULLP;
4064 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4065 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4066 if(!ulCfg->pusch_ServingCellConfig)
4068 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4072 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4077 ulCfg->carrierSwitching = NULLP;
4078 ulCfg->ext1 = NULLP;
4082 /*******************************************************************
4084 * @brief Builds PDSCH serving cell config
4087 * Function : BuildPdschSrvCellCfg
4089 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4091 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4093 * @return ROK - success
4096 * ****************************************************************/
4097 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4099 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4100 pdschCfg->choice.setup = NULLP;
4101 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4102 if(!pdschCfg->choice.setup)
4104 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4108 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4109 pdschCfg->choice.setup->xOverhead = NULLP;
4110 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4111 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4112 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4114 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4117 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4118 pdschCfg->choice.setup->pucch_Cell = NULLP;
4119 pdschCfg->choice.setup->ext1 = NULLP;
4124 /*******************************************************************
4126 * @brief Builds CSI Meas config
4129 * Function : BuildCsiMeasCfg
4131 * Functionality: Builds CSI Meas config in spCellCfgDed
4133 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4135 * @return ROK - success
4138 * ****************************************************************/
4139 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4145 /*******************************************************************
4147 * @brief Builds Spcell config dedicated
4150 * Function : BuildSpCellCfgDed
4152 * Functionality: Builds sp cell config dedicated in spCellCfg
4154 * @params[in] ServingCellConfig_t srvCellCfg
4156 * @return ROK - success
4159 * ****************************************************************/
4160 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4162 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4164 srvCellCfg->initialDownlinkBWP = NULLP;
4165 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4166 if(!srvCellCfg->initialDownlinkBWP)
4168 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4172 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4174 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4177 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4178 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4180 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4181 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4182 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4184 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4187 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4189 srvCellCfg->bwp_InactivityTimer = NULLP;
4191 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4192 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4193 if(!srvCellCfg->defaultDownlinkBWP_Id)
4195 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4198 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4200 srvCellCfg->uplinkConfig = NULLP;
4201 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4202 if(!srvCellCfg->uplinkConfig)
4204 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4208 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4210 DU_LOG("\nF1AP : BuildUlCfg failed");
4213 srvCellCfg->supplementaryUplink = NULLP;
4214 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4216 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4217 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4218 if(!srvCellCfg->pdsch_ServingCellConfig)
4220 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4224 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4226 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4230 srvCellCfg->csi_MeasConfig = NULLP;
4232 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4233 if(!srvCellCfg->csi_MeasConfig)
4235 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4239 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4241 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4245 srvCellCfg->sCellDeactivationTimer = NULLP;
4246 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4247 srvCellCfg->tag_Id = TAG_ID;
4248 srvCellCfg->dummy = NULLP;
4249 srvCellCfg->pathlossReferenceLinking = NULLP;
4250 srvCellCfg->servingCellMO = NULLP;
4251 srvCellCfg->ext1 = NULLP;
4255 /*******************************************************************
4257 * @brief Builds Spcell config
4261 * Function : BuildSpCellCfg
4263 * Functionality: Builds sp cell config in DuToCuRrcContainer
4265 * @params[in] SpCellConfig_t spCellCfg
4267 * @return ROK - success
4270 * ****************************************************************/
4271 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4274 spCellCfg->servCellIndex = NULLP;
4275 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4276 if(!spCellCfg->servCellIndex)
4278 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4281 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4283 spCellCfg->reconfigurationWithSync = NULLP;
4284 spCellCfg->rlf_TimersAndConstants = NULLP;
4285 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4286 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4287 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4289 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4292 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4294 spCellCfg->spCellConfigDedicated = NULLP;
4295 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4296 if(!spCellCfg->spCellConfigDedicated)
4298 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4301 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4303 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4308 /*******************************************************************
4310 * @brief Builds Phy cell group config
4314 * Function : BuildPhyCellGrpCfg
4316 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4318 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4320 * @return ROK - success
4323 * ****************************************************************/
4324 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4326 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4327 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4329 phyCellGrpCfg->p_NR_FR1 = NULLP;
4330 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4331 if(!phyCellGrpCfg->p_NR_FR1)
4333 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4336 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4337 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4338 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4339 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4340 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4341 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4342 phyCellGrpCfg->cs_RNTI = NULLP;
4343 phyCellGrpCfg->ext1 = NULLP;
4344 phyCellGrpCfg->ext2 = NULLP;
4349 /*******************************************************************
4351 * @brief Builds tag config
4355 * Function : BuildTagConfig
4357 * Functionality: Builds tag config in MacCellGroupConfig
4359 * @params[in] TAG_Config *tag_Config
4361 * @return ROK - success
4364 * ****************************************************************/
4365 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4367 struct TAG_Config__tag_ToAddModList *tagList;
4368 uint8_t idx, elementCnt;
4370 tagConfig->tag_ToReleaseList = NULLP;
4371 tagConfig->tag_ToAddModList = NULLP;
4372 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4373 if(!tagConfig->tag_ToAddModList)
4375 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4379 elementCnt = 1; //ODU_VALUE_ONE;
4380 tagList = tagConfig->tag_ToAddModList;
4381 tagList->list.count = elementCnt;
4382 tagList->list.size = elementCnt * sizeof(struct TAG *);
4384 tagList->list.array = NULLP;
4385 CU_ALLOC(tagList->list.array, tagList->list.size);
4386 if(!tagList->list.array)
4388 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4392 for(idx=0; idx<tagList->list.count; idx++)
4394 tagList->list.array[idx] = NULLP;
4395 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4396 if(!tagList->list.array[idx])
4398 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4404 tagList->list.array[idx]->tag_Id = TAG_ID;
4405 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4410 /*******************************************************************
4412 * @brief Builds PHR Config
4416 * Function : BuildPhrConfig
4418 * Functionality: Builds phrConfig in MacCellGroupConfig
4420 * @params[in] PHR Config *
4422 * @return ROK - success
4425 * ****************************************************************/
4426 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4429 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4430 phrConfig->choice.setup = NULLP;
4431 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4432 if(!phrConfig->choice.setup)
4434 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4438 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4439 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4440 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4441 phrConfig->choice.setup->multiplePHR = false;
4442 phrConfig->choice.setup->dummy = false;
4443 phrConfig->choice.setup->phr_Type2OtherCell = false;
4444 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4449 /*******************************************************************
4451 * @brief Builds BSR Config
4455 * Function : BuildBsrConfig
4457 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4459 * @params[in] BSR_Config *bsrConfig
4461 * @return ROK - success
4464 * ****************************************************************/
4465 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4467 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4468 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4469 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4474 /*******************************************************************
4476 * @brief Builds scheduling request config
4480 * Function : BuildSchedulingReqConfig
4482 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4484 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4486 * @return ROK - success
4489 * ****************************************************************/
4490 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4492 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4493 uint8_t idx, elementCnt;
4495 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4496 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4497 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4498 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4500 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4504 elementCnt = 1; //ODU_VALUE_ONE;
4505 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4506 schReqList->list.count = elementCnt;
4507 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4509 schReqList->list.array = NULLP;
4510 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4511 if(!schReqList->list.array)
4513 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4517 for(idx=0;idx<schReqList->list.count; idx++)
4519 schReqList->list.array[idx] = NULLP;
4520 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4521 if(!schReqList->list.array[idx])
4523 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4529 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4531 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4532 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4533 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4535 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4538 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4539 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4540 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4544 /*******************************************************************
4546 * @brief Builds Mac cell group config
4550 * Function : BuildMacCellGrpCfg
4552 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4554 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4556 * @return ROK - success
4559 * ****************************************************************/
4560 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4562 macCellGrpCfg->drx_Config = NULLP;
4563 macCellGrpCfg->schedulingRequestConfig = NULLP;
4564 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4565 if(!macCellGrpCfg->schedulingRequestConfig)
4567 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4571 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4573 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4577 macCellGrpCfg->bsr_Config = NULLP;
4578 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4579 if(!macCellGrpCfg->bsr_Config)
4581 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4585 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4587 DU_LOG("\nF1AP : BuildBsrConfig failed");
4591 macCellGrpCfg->tag_Config = NULLP;
4592 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4593 if(!macCellGrpCfg->tag_Config)
4595 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4599 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4601 DU_LOG("\nF1AP : BuildTagConfig failed");
4605 macCellGrpCfg->phr_Config = NULLP;
4606 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4607 if(!macCellGrpCfg->phr_Config)
4609 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4613 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4615 DU_LOG("\nF1AP : BuildPhrConfig failed");
4619 macCellGrpCfg->skipUplinkTxDynamic = false;
4620 macCellGrpCfg->ext1 = NULLP;
4624 /*******************************************************************
4626 * @brief Frees memeory allocated for SearchSpcToAddModList
4630 * Function : FreeSearchSpcToAddModList
4632 * Functionality: Deallocating memory of SearchSpcToAddModList
4634 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4638 4221 * ****************************************************************/
4639 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4643 struct SearchSpace *searchSpc=NULLP;
4645 if(searchSpcList->list.array)
4647 if(searchSpcList->list.array[idx2])
4649 searchSpc = searchSpcList->list.array[idx2];
4650 if(searchSpc->controlResourceSetId)
4652 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4654 if(searchSpc->monitoringSymbolsWithinSlot)
4656 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4658 if(searchSpc->nrofCandidates)
4660 if(searchSpc->searchSpaceType)
4662 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4663 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4664 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4665 SearchSpace__searchSpaceType));
4667 CU_FREE(searchSpc->nrofCandidates,
4668 sizeof(struct SearchSpace__nrofCandidates));
4670 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4671 searchSpc->monitoringSymbolsWithinSlot->size);
4673 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4674 sizeof(BIT_STRING_t));
4676 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4677 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4679 CU_FREE(searchSpc->controlResourceSetId,
4680 sizeof(ControlResourceSetId_t));
4683 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4685 CU_FREE(searchSpcList->list.array[idx1],
4686 sizeof(struct SearchSpace));
4688 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4691 /*******************************************************************
4693 * @brief Frees memory allocated for PdschTimeDomAllocList
4697 * Function : FreePdschTimeDomAllocList
4699 * Functionality: Deallocating memory of PdschTimeDomAllocList
4701 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4705 4221 * ****************************************************************/
4706 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4710 if(timeDomAllocList->choice.setup)
4712 if(timeDomAllocList->choice.setup->list.array)
4714 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4716 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4717 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4719 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4720 timeDomAllocList->choice.setup->list.size);
4722 CU_FREE(timeDomAllocList->choice.setup,\
4723 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4726 /*******************************************************************
4728 * @brief Frees memory allocated for PuschTimeDomAllocList
4732 * Function : FreePuschTimeDomAllocList
4734 * Functionality: Deallocating memory of PuschTimeDomAllocList
4736 * @params[in] PUSCH_Config_t *puschCfg
4740 ***********************************************************************/
4741 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4745 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4747 if(puschCfg->pusch_TimeDomainAllocationList)
4749 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4750 if(timeDomAllocList_t->choice.setup)
4752 if(timeDomAllocList_t->choice.setup->list.array)
4754 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4755 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4757 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4758 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4760 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4761 timeDomAllocList_t->choice.setup->list.size);
4763 CU_FREE(timeDomAllocList_t->choice.setup, \
4764 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4766 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4767 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4768 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4772 /*******************************************************************
4774 * @brief Frees memory allocated for InitialUlBWP
4778 * Function : FreeInitialUlBWP
4780 * Functionality: Deallocating memory of InitialUlBWP
4782 * @params[in] BWP_UplinkDedicated_t *ulBwp
4786 * ****************************************************************/
4787 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4789 uint8_t rSetIdx, rsrcIdx;
4790 SRS_Config_t *srsCfg = NULLP;
4791 PUSCH_Config_t *puschCfg = NULLP;
4792 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4793 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4794 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4795 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4797 if(ulBwp->pusch_Config)
4799 if(ulBwp->pusch_Config->choice.setup)
4801 puschCfg=ulBwp->pusch_Config->choice.setup;
4802 if(puschCfg->dataScramblingIdentityPUSCH)
4804 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4806 FreePuschTimeDomAllocList(puschCfg);
4807 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4808 if(dmrsUlCfg->choice.setup)
4810 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4812 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4814 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4816 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4817 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4819 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4822 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4824 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4825 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4827 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4829 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4831 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4833 /* Free SRS-Config */
4834 if(ulBwp->srs_Config)
4836 if(ulBwp->srs_Config->choice.setup)
4838 srsCfg = ulBwp->srs_Config->choice.setup;
4840 /* Free Resource Set to add/mod list */
4841 if(srsCfg->srs_ResourceSetToAddModList)
4843 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4844 if(rsrcSetList->list.array)
4848 /* Free SRS resource Id list in this SRS resource set */
4849 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4851 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4853 if(rsrcIdList->list.array)
4855 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4857 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4859 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4861 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4862 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4865 /* Free resource type info for this SRS resource set */
4866 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4867 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4869 /* Free memory for each resource set */
4870 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4872 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4874 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4876 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4877 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4880 /* Free resource to add/modd list */
4881 if(srsCfg->srs_ResourceToAddModList)
4883 resourceList = srsCfg->srs_ResourceToAddModList;
4884 if(resourceList->list.array)
4887 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4888 sizeof(struct SRS_Resource__transmissionComb__n2));
4889 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4890 sizeof(struct SRS_Resource__resourceType__aperiodic));
4892 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4894 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4896 CU_FREE(resourceList->list.array, resourceList->list.size);
4898 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4899 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4902 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4904 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4908 /*******************************************************************
4910 * @brief Frees memory allocated for initialUplinkBWP
4914 * Function : FreeinitialUplinkBWP
4916 * Functionality: Deallocating memory of initialUplinkBWP
4918 * @params[in] UplinkConfig_t *ulCfg
4923 * ****************************************************************/
4924 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4926 BWP_UplinkDedicated_t *ulBwp=NULLP;
4927 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4929 if(ulCfg->initialUplinkBWP)
4931 ulBwp=ulCfg->initialUplinkBWP;
4932 if(ulCfg->firstActiveUplinkBWP_Id)
4934 if(ulCfg->pusch_ServingCellConfig)
4936 puschCfg=ulCfg->pusch_ServingCellConfig;
4937 if(puschCfg->choice.setup)
4939 if(puschCfg->choice.setup->ext1)
4941 CU_FREE(puschCfg->choice.setup->ext1->\
4942 processingType2Enabled,sizeof(BOOLEAN_t));
4943 CU_FREE(puschCfg->choice.setup->ext1->\
4944 maxMIMO_Layers,sizeof(long));
4945 CU_FREE(puschCfg->choice.setup->ext1, \
4946 sizeof(struct PUSCH_ServingCellConfig__ext1));
4948 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4950 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4952 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4954 FreeInitialUlBWP(ulBwp);
4955 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4958 /*******************************************************************
4960 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4964 * Function : FreeBWPDlDedPdschCfg
4966 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4968 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4973 * ****************************************************************/
4974 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4976 struct PDSCH_Config *pdschCfg=NULLP;
4977 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4978 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4979 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4981 if(dlBwp->pdsch_Config->choice.setup)
4983 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4984 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4986 if(pdschCfg->pdsch_TimeDomainAllocationList)
4988 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4989 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4991 prbBndlType=&pdschCfg->prb_BundlingType;
4992 CU_FREE(prbBndlType->choice.staticBundling,\
4993 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4994 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4996 FreePdschTimeDomAllocList(timeDomAllocList);
4997 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4998 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5000 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5001 if(dmrsDlCfg->choice.setup)
5003 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5005 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5007 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5008 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5010 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5013 /*******************************************************************
5015 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5019 * Function : FreeBWPDlDedPdcchCfg
5021 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5023 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5028 * ****************************************************************/
5029 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5033 struct PDCCH_Config *pdcchCfg=NULLP;
5034 struct ControlResourceSet *controlRSet=NULLP;
5035 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5037 if(dlBwp->pdcch_Config->choice.setup)
5039 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5040 if(pdcchCfg->controlResourceSetToAddModList)
5042 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5043 if(controlRSetList->list.array)
5045 controlRSet = controlRSetList->list.array[idx2];
5048 if(controlRSet->frequencyDomainResources.buf)
5050 if(controlRSet->pdcch_DMRS_ScramblingID)
5052 if(pdcchCfg->searchSpacesToAddModList)
5054 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5055 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5056 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5058 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5060 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5061 controlRSet->frequencyDomainResources.size);
5064 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5066 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5068 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5070 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5071 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5073 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5076 /*******************************************************************
5078 * @brief Builds RLC Config
5082 * Function : BuildRlcConfig
5084 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5086 * @params[in] RLC_Config *rlcConfig
5088 * @return ROK - success
5091 * ****************************************************************/
5092 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5095 rlcConfig->present = RLC_Config_PR_am;
5097 rlcConfig->choice.am = NULLP;
5098 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5099 if(!rlcConfig->choice.am)
5101 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5106 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5107 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5108 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5110 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5113 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5114 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5115 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5116 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5117 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5120 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5121 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5122 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5124 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5127 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5128 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5129 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5134 /*******************************************************************
5136 * @brief Builds MAC LC Config
5140 * Function : BuildMacLCConfig
5142 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5144 * @params[in] struct LogicalChannelConfig macLcConfig
5146 * @return ROK - success
5149 * ****************************************************************/
5150 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5153 macLcConfig->ul_SpecificParameters = NULLP;
5154 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5155 if(!macLcConfig->ul_SpecificParameters)
5157 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5161 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5162 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5163 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5164 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5165 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5166 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5167 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5169 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5170 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5171 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5173 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5176 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5178 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5179 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5180 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5182 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5185 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5187 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5188 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5189 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5193 /*******************************************************************
5195 * @brief Builds RLC Bearer to Add/Mod list
5199 * Function :BuildRlcBearerToAddModList
5201 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5203 * @params[in] rlc_BearerToAddModList
5205 * @return ROK - success
5208 * ****************************************************************/
5209 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5211 uint8_t idx, elementCnt;
5214 rlcBearerList->list.count = elementCnt;
5215 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5217 rlcBearerList->list.array = NULLP;
5218 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5219 if(!rlcBearerList->list.array)
5221 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5225 for(idx=0; idx<rlcBearerList->list.count; idx++)
5227 rlcBearerList->list.array[idx] = NULLP;
5228 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5229 if(!rlcBearerList->list.array[idx])
5231 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5237 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5239 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5240 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5242 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5246 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5247 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5249 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5250 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5251 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5252 if(!rlcBearerList->list.array[idx]->rlc_Config)
5254 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5258 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5260 DU_LOG("\nF1AP : BuildRlcConfig failed");
5264 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5265 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5266 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5268 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5272 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5274 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5281 /*******************************************************************
5283 * @brief Free memory allocated for CellGroupConfig
5287 * Function : FreeMemCellGrpCfg
5289 * Functionality: Deallocating memory of CellGroupConfig
5291 * @params[in] pointer to CellGroupConfigRrc_t
5293 * @return ROK - success
5296 ******************************************************************/
5297 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5300 SpCellConfig_t *spCellCfg=NULLP;
5301 ServingCellConfig_t *srvCellCfg=NULLP;
5302 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5303 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5304 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5305 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5306 struct RLC_Config *rlcConfig=NULLP;
5307 struct LogicalChannelConfig *macLcConfig=NULLP;
5308 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5309 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5310 struct TAG_Config *tagConfig=NULLP;
5311 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5312 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5313 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5315 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5318 if(rlcBearerList->list.array)
5320 for(idx=0; idx<rlcBearerList->list.count; idx++)
5322 if(rlcBearerList->list.array[idx])
5324 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5325 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5328 if(rlcConfig->choice.am)
5330 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5331 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5332 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5334 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5336 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5339 if(macLcConfig->ul_SpecificParameters)
5341 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5342 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5343 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5345 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5347 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5350 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5352 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5355 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5358 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5359 if(schedulingRequestConfig)
5361 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5364 if(schReqList->list.array)
5366 for(idx=0;idx<schReqList->list.count; idx++)
5368 if(schReqList->list.array[idx])
5370 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5371 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5374 CU_FREE(schReqList->list.array, schReqList->list.size);
5376 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5377 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5378 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5380 if(macCellGrpCfg->bsr_Config)
5382 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5384 tagConfig = macCellGrpCfg->tag_Config;
5387 tagList = tagConfig->tag_ToAddModList;
5390 if(tagList->list.array)
5392 for(idx=0; idx<tagList->list.count; idx++)
5394 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5396 CU_FREE(tagList->list.array, tagList->list.size);
5398 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5400 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5403 phrConfig = macCellGrpCfg->phr_Config;
5406 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5407 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5410 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5413 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5416 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5417 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5420 spCellCfg = cellGrpCfg->spCellConfig;
5423 if(spCellCfg->servCellIndex)
5425 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5427 if(spCellCfg->spCellConfigDedicated)
5429 srvCellCfg = spCellCfg->spCellConfigDedicated;
5430 if(srvCellCfg->initialDownlinkBWP)
5432 dlBwp = srvCellCfg->initialDownlinkBWP;
5433 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5435 if(srvCellCfg->defaultDownlinkBWP_Id)
5437 if(srvCellCfg->uplinkConfig)
5439 if(srvCellCfg->pdsch_ServingCellConfig)
5441 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5442 if(pdschCfg->choice.setup)
5444 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5445 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5447 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5448 ServingCellConfig__pdsch_ServingCellConfig));
5450 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5451 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5453 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5455 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5457 if(dlBwp->pdcch_Config)
5459 if(dlBwp->pdsch_Config)
5461 FreeBWPDlDedPdschCfg(dlBwp);
5462 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5464 FreeBWPDlDedPdcchCfg(dlBwp);
5465 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5467 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5469 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5471 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5473 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5475 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5480 /*******************************************************************
5482 * @brief Fills CellGroupConfig
5486 * Function : fillCellGrpCfg
5488 * Functionality: Fills CellGroupConfig
5490 * @params[in] pointer to CellGroupConfigRrc_t
5492 * @return ROK - success
5495 ******************************************************************/
5497 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5499 uint8_t ret = RFAILED;
5500 CellGroupConfigRrc_t cellGrpCfg;
5501 asn_enc_rval_t encRetVal;
5505 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5507 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5508 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5509 if(!cellGrpCfg.rlc_BearerToAddModList)
5511 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5514 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5516 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5520 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5521 cellGrpCfg.mac_CellGroupConfig = NULLP;
5522 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5523 if(!cellGrpCfg.mac_CellGroupConfig)
5525 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5528 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5530 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5535 cellGrpCfg.physicalCellGroupConfig = NULLP;
5536 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5537 if(!cellGrpCfg.physicalCellGroupConfig)
5539 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5542 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5544 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5548 cellGrpCfg.spCellConfig = NULLP;
5549 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5550 if(!cellGrpCfg.spCellConfig)
5552 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5555 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5557 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5561 cellGrpCfg.sCellToAddModList = NULLP;
5562 cellGrpCfg.sCellToReleaseList = NULLP;
5563 cellGrpCfg.ext1 = NULLP;
5565 /* encode cellGrpCfg into duToCuRrcContainer */
5566 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5567 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5569 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5570 /* Encode results */
5571 if(encRetVal.encoded == ENCODE_FAIL)
5573 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5574 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5579 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5580 for(int i=0; i< encBufSize; i++)
5582 printf("%x",encBuf[i]);
5586 cellGrp->size = encBufSize;
5587 CU_ALLOC(cellGrp->buf, cellGrp->size);
5590 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5593 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5597 FreeMemCellGrpCfg(&cellGrpCfg);
5601 /*******************************************************************
5603 * @brief Fills CuToDuContainer
5607 * Function : fillCuToDuContainer
5609 * Functionality: Fills CuToDuContainer
5611 * @params[in] pointer to CUtoDURRCInformation_t
5613 * @return ROK - success
5616 ******************************************************************/
5618 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
5620 uint8_t elementCnt = 0;
5622 uint8_t idx, idx2, rrcBufLen;
5625 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5626 if(rrcMsg->iE_Extensions)
5628 rrcMsg->iE_Extensions->list.count = elementCnt;
5629 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
5631 /* Initialize the CUtoDURRCInformation_ExtIEs */
5632 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5634 if(rrcMsg->iE_Extensions->list.array == NULLP)
5636 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
5640 for(idx=0; idx<elementCnt; idx++)
5642 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
5643 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
5649 /* Filling CellGroupConfig_t IE */
5650 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
5651 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
5652 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
5653 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
5654 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
5659 /*******************************************************************
5661 * @brief Free CuToDuContainer
5665 * Function : FreeCuToDuInfo
5667 * Functionality: Free CuToDuContainer
5669 * @params[in] pointer to CUtoDURRCInformation_t
5671 * @return ROK - success
5674 ******************************************************************/
5676 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
5680 if(rrcMsg->iE_Extensions)
5682 if(rrcMsg->iE_Extensions->list.array)
5684 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
5686 if(rrcMsg->iE_Extensions->list.array[idx])
5688 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
5690 case ProtocolIE_ID_id_CellGroupConfig:
5691 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
5693 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
5694 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
5699 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
5700 rrcMsg->iE_Extensions->list.array[idx]->id);
5706 for(idx2 = 0; idx2 < idx; idx2++)
5708 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
5710 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5714 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5717 /*******************************************************************
5719 * @brief Builds and sends the UE Setup Request
5723 * Function : BuildAndSendUeContextSetupReq
5725 * Functionality: Constructs the UE Setup Request and sends
5726 * it to the CU through SCTP.
5730 * @return ROK - success
5733 * ****************************************************************/
5734 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
5735 uint16_t rrcContLen, uint8_t *rrcContainer)
5738 uint8_t SplCellListret;
5739 uint8_t SrbSetupret;
5741 uint8_t idx, bufLen;
5743 F1AP_PDU_t *f1apMsg = NULLP;
5744 UEContextSetupRequest_t *ueSetReq = NULLP;
5745 asn_enc_rval_t encRetVal; /* Encoder return value */
5746 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5747 uint8_t ret= RFAILED;
5751 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
5753 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5754 if(f1apMsg == NULLP)
5756 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5760 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5761 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5762 if(f1apMsg->choice.initiatingMessage == NULLP)
5764 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5768 f1apMsg->choice.initiatingMessage->procedureCode = \
5769 ProcedureCode_id_UEContextSetup;
5770 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
5771 f1apMsg->choice.initiatingMessage->value.present = \
5772 InitiatingMessage__value_PR_UEContextSetupRequest;
5774 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5777 ueSetReq->protocolIEs.list.count = elementCnt;
5778 ueSetReq->protocolIEs.list.size = \
5779 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
5781 /* Initialize the UESetup members */
5782 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5784 if(ueSetReq->protocolIEs.list.array == NULLP)
5786 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
5790 for(idx1=0; idx1<elementCnt; idx1++)
5792 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
5793 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
5801 /*GNB CU UE F1AP ID*/
5802 ueSetReq->protocolIEs.list.array[idx]->id = \
5803 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
5804 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5805 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5806 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
5807 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
5809 /*GNB DU UE F1AP ID*/
5811 ueSetReq->protocolIEs.list.array[idx]->id = \
5812 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5813 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5814 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5815 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
5816 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
5820 ueSetReq->protocolIEs.list.array[idx]->id = \
5821 ProtocolIE_ID_id_SpCell_ID;
5822 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5823 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5824 UEContextSetupRequestIEs__value_PR_NRCGI;
5825 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5831 /*Served Cell Index*/
5833 ueSetReq->protocolIEs.list.array[idx]->id = \
5834 ProtocolIE_ID_id_ServCellIndex;
5835 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5836 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5837 UEContextSetupRequestIEs__value_PR_ServCellIndex;
5838 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
5841 /*CellULConfigured*/
5843 ueSetReq->protocolIEs.list.array[idx]->id = \
5844 ProtocolIE_ID_id_SpCellULConfigured;
5845 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5846 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5847 UEContextSetupRequestIEs__value_PR_CellULConfigured;
5848 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
5849 CellULConfigured_none;
5851 /*CUtoDURRCContainer*/
5853 ueSetReq->protocolIEs.list.array[idx]->id = \
5854 ProtocolIE_ID_id_CUtoDURRCInformation;
5855 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5856 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5857 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
5858 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
5863 /*Special Cells to be SetupList*/
5865 ueSetReq->protocolIEs.list.array[idx]->id = \
5866 ProtocolIE_ID_id_SCell_ToBeSetup_List;
5867 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5868 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5869 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
5870 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5871 if(SplCellListret != ROK)
5875 /*SRBs To Be Setup List*/
5877 ueSetReq->protocolIEs.list.array[idx]->id = \
5878 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
5879 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5880 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5881 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
5882 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5883 if(SrbSetupret != ROK)
5887 /*DRBs to Be Setup List*/
5889 ueSetReq->protocolIEs.list.array[idx]->id = \
5890 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
5891 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5892 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5893 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
5894 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5899 /* RRC Container for security mode */
5901 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
5902 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5903 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5904 UEContextSetupRequestIEs__value_PR_RRCContainer;
5905 char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
5907 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
5908 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
5909 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
5910 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
5912 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
5915 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen);
5916 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen);
5918 /* RRC delivery status request */
5920 ueSetReq->protocolIEs.list.array[idx]->id = \
5921 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
5922 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5923 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5924 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
5925 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
5926 RRCDeliveryStatusRequest_true;
5928 /* Bit Rate hardcoded as in reference logs */
5930 ueSetReq->protocolIEs.list.array[idx]->id = \
5931 ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL;
5932 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5933 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5934 UEContextSetupRequestIEs__value_PR_BitRate;
5935 char bitRateBuf[4]= {0x3B, 0x37, 0xF4, 0xCD};
5937 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size = bufLen;
5938 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf,\
5939 ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.size);
5940 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf)
5942 DU_LOG(" F1AP : Failed to allocate memory for Bit Rate in BuildAndSendUeContextSetupReq()");
5945 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, 0, bufLen);
5946 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.BitRate.buf, bitRateBuf, bufLen);
5948 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5950 /* Encode the F1SetupRequest type as APER */
5951 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5953 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
5955 /* Encode results */
5956 if(encRetVal.encoded == ENCODE_FAIL)
5958 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
5959 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5964 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
5965 for(int i=0; i< encBufSize; i++)
5967 printf("%x",encBuf[i]);
5972 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
5974 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
5980 FreeUeContextSetupReq(f1apMsg);
5983 }/* End of BuildAndSendUeContextSetupReq*/
5985 /****************************************************************
5986 * @brief Function to process Ul Rrc Msg received from DU
5990 * Function : procUlRrcMsg
5993 * - Function to process Ul Rrc Msg received from DU
5996 * @return ROK - success
5999 * ****************************************************************/
6001 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
6003 uint8_t idx, ret, srbId, rrcMsgType;
6004 uint8_t cuUeF1apId, duUeF1apId;
6005 uint8_t *rrcContainer = NULLP;
6006 uint16_t rrcContLen;
6007 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
6010 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6012 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6014 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6016 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6018 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6021 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6023 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6026 case ProtocolIE_ID_id_SRBID:
6027 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6029 case ProtocolIE_ID_id_RRCContainer:
6031 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6032 CU_ALLOC(rrcContainer, rrcContLen)
6035 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
6038 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6044 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6050 f1apMsgDb.dlRrcMsgCount++;
6051 rrcMsgType = setDlRRCMsgType();
6052 if(rrcMsgType == REGISTRATION_ACCEPT)
6054 DU_LOG("\nSending DL RRC MSG for RRC Registration Complete");
6055 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6057 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6059 DU_LOG("\nSending Ue Context Setup Req");
6060 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6061 rrcContLen, rrcContainer);
6067 /****************************************************************
6068 * @brief Build And Send F1ResetAck
6072 * Function : FreeF1ResetAck
6075 * - Build And Send F1ResetRSP
6078 * @return ROK - success
6081 * ****************************************************************/
6082 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6085 ResetAcknowledge_t *f1ResetAck;
6089 if(f1apMsg->choice.successfulOutcome)
6091 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6093 if(f1ResetAck->protocolIEs.list.array)
6095 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6097 if(f1ResetAck->protocolIEs.list.array[idx])
6099 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6102 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6104 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6106 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6110 /****************************************************************
6111 * @brief Build And Send F1ResetAck
6115 * Function : BuildAndSendF1ResetAck
6118 * - Build And Send F1ResetRSP
6121 * @return ROK - success
6124 * ****************************************************************/
6126 uint8_t BuildAndSendF1ResetAck()
6129 uint8_t elementCnt = 0;
6130 uint8_t ret = RFAILED;
6131 F1AP_PDU_t *f1apMsg = NULL;
6132 ResetAcknowledge_t *f1ResetAck = NULLP;
6133 asn_enc_rval_t encRetVal;
6134 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6137 /* Allocate the memory for F1ResetRequest_t */
6138 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6139 if(f1apMsg == NULLP)
6141 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6145 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6147 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6148 if(f1apMsg->choice.successfulOutcome == NULLP)
6150 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6154 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6155 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6156 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6157 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6161 f1ResetAck->protocolIEs.list.count = elementCnt;
6162 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6164 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6165 if(f1ResetAck->protocolIEs.list.array == NULLP)
6167 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6171 for(idx=0; idx<elementCnt; idx++)
6173 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6174 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6181 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6182 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6183 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6184 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6186 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6188 /* Encode the F1SetupRequest type as UPER */
6189 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6191 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6193 /* Check encode results */
6194 if(encRetVal.encoded == ENCODE_FAIL)
6196 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6197 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6202 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6203 for(int i=0; i< encBufSize; i++)
6205 printf("%x",encBuf[i]);
6209 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6211 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6219 FreeF1ResetAck(f1apMsg);
6223 /*******************************************************************
6225 * @brief Handles received F1AP message and sends back response
6229 * Function : F1APMsgHdlr
6232 * - Decodes received F1AP control message
6233 * - Prepares response message, encodes and sends to SCTP
6236 * @return ROK - success
6239 * ****************************************************************/
6240 void F1APMsgHdlr(Buffer *mBuf)
6246 F1AP_PDU_t *f1apMsg = NULLP;
6247 asn_dec_rval_t rval; /* Decoder return value */
6248 F1AP_PDU_t f1apasnmsg ;
6250 DU_LOG("\nF1AP : Received F1AP message buffer");
6251 ODU_PRINT_MSG(mBuf, 0,0);
6253 /* Copy mBuf into char array to decode it */
6254 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6255 CU_ALLOC(recvBuf, (Size)recvBufLen);
6257 if(recvBuf == NULLP)
6259 DU_LOG("\nF1AP : Memory allocation failed");
6262 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6264 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6268 printf("\nF1AP : Received flat buffer to be decoded : ");
6269 for(i=0; i< recvBufLen; i++)
6271 printf("%x",recvBuf[i]);
6274 /* Decoding flat buffer into F1AP messsage */
6275 f1apMsg = &f1apasnmsg;
6276 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6278 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6279 CU_FREE(recvBuf, (Size)recvBufLen);
6281 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6283 DU_LOG("\nF1AP : ASN decode failed");
6287 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6289 switch(f1apMsg->present)
6291 case F1AP_PDU_PR_initiatingMessage:
6293 switch(f1apMsg->choice.initiatingMessage->value.present)
6295 case InitiatingMessage__value_PR_Reset:
6297 DU_LOG("\nF1AP : F1 reset request received ");
6298 BuildAndSendF1ResetAck();
6302 case InitiatingMessage__value_PR_F1SetupRequest:
6304 DU_LOG("\nF1AP : F1 setup request received");
6305 BuildAndSendF1SetupRsp();
6309 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
6311 DU_LOG("\nF1AP : GNB-DU config update received");
6312 BuildAndSendDUUpdateAck();
6313 DU_LOG("\nF1AP : Sending F1 reset request");
6314 BuildAndSendF1ResetReq();
6317 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
6319 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
6320 procInitULRRCMsg(f1apMsg);
6323 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
6325 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
6326 procUlRrcMsg(f1apMsg);
6330 case InitiatingMessage__value_PR_RRCDeliveryReport:
6332 DU_LOG("\nF1AP : Received RRC delivery report");
6337 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
6340 }/* End of switch(initiatingMessage) */
6344 case F1AP_PDU_PR_successfulOutcome:
6346 switch(f1apMsg->choice.successfulOutcome->value.present)
6348 case SuccessfulOutcome__value_PR_ResetAcknowledge:
6350 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
6353 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
6357 DU_LOG("\nF1AP : UE ContextSetupResponse received");
6358 f1apMsgDb.dlRrcMsgCount++;
6359 rrcMsgType = setDlRRCMsgType();
6360 if(rrcMsgType == RRC_RECONFIG)
6362 DU_LOG("\nImplementing DL RRC MSG for RRC Reconfig Complete");
6363 BuildAndSendDLRRCMessageTransfer(SRB1, rrcMsgType);
6369 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
6370 f1apMsg->choice.successfulOutcome->value.present);
6373 }/* End of switch(successfulOutcome) */
6378 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6381 }/* End of switch(f1apMsg->present) */
6383 } /* End of F1APMsgHdlr */
6385 /**********************************************************************
6387 **********************************************************************/