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"
27 /*******************************************************************
29 * @brief Sends F1 msg over SCTP
33 * Function : SendF1APMsg
35 * Functionality: Sends F1 msg over SCTP
37 * @params[in] Region region
39 * @return ROK - success
42 * ****************************************************************/
43 S16 SendF1APMsg(Region region, Pool pool)
47 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
49 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
51 ODU_PRINT_MSG(mBuf, 0,0);
53 if(sctpSend(mBuf) != ROK)
55 DU_LOG("\nF1AP : SCTP Send failed");
56 ODU_PUT_MSG_BUF(mBuf);
62 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
63 ODU_PUT_MSG_BUF(mBuf);
66 ODU_PUT_MSG_BUF(mBuf);
70 DU_LOG("\nF1AP : Failed to allocate memory");
77 /*******************************************************************
79 * @brief Builds NRCell ID
83 * Function : BuildNrCellId
85 * Functionality: Building the NR Cell ID
87 * @params[in] BIT_STRING_t *nrcell
88 * @return ROK - success
91 * ****************************************************************/
93 S16 BuildNrCellId(BIT_STRING_t *nrcell)
96 for (tmp = 0 ; tmp < nrcell->size-1; tmp++)
101 nrcell->bits_unused = 4;
102 nrcell->size = 5 * sizeof(uint8_t);
106 /********************************************************************
108 * @brief Builds and sends the F1SetupResponse
112 * Function : BuildAndSendF1SetupRsp
114 * Functionality: Constructs the F1SetupResponse message and sends
115 * it back to the DU through SCTP.
117 * @params[in] void **buf,Buffer to which encoded pattern is written into
118 * @params[in] int *size,size of buffer
120 * @return ROK - success
123 * ****************************************************************/
124 S16 BuildAndSendF1SetupRsp()
127 U8 elementCnt,cellCnt;
128 F1AP_PDU_t *f1apMsg = NULL;
129 F1SetupResponse_t *f1SetupRsp;
130 GNB_CU_Name_t *cuName;
131 Cells_to_be_Activated_List_t *cellToActivate;
132 RRC_Version_t *rrcVer;
133 asn_enc_rval_t encRetVal;
134 DU_LOG("\nF1AP : Building F1 Setup Response\n");
136 /* Allocate the memory for F1SetupRequest_t */
137 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
140 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
143 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
145 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
146 if(f1apMsg->choice.successfulOutcome == NULLP)
148 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
149 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
153 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
154 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
155 f1apMsg->choice.successfulOutcome->value.present = \
156 SuccessfulOutcome__value_PR_F1SetupResponse;
157 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
160 f1SetupRsp->protocolIEs.list.count = elementCnt;
161 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
163 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
164 elementCnt * sizeof(F1SetupResponseIEs_t *));
165 if(f1SetupRsp->protocolIEs.list.array == NULLP)
167 DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed");
168 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
169 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
173 for(idx=0; idx<elementCnt; idx++)
175 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
176 sizeof(F1SetupResponseIEs_t));
177 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
179 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
180 elementCnt * sizeof(F1SetupResponseIEs_t *));
181 CU_FREE(f1apMsg->choice.successfulOutcome, \
182 sizeof(SuccessfulOutcome_t));
183 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
190 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
191 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
192 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
193 F1SetupResponseIEs__value_PR_TransactionID;
194 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
199 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
200 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
201 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
202 F1SetupResponseIEs__value_PR_GNB_CU_Name;
203 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
204 cuName->size = sizeof(cuCfgParams.cuName);
206 CU_ALLOC(cuName->buf, sizeof(cuName->size));
207 if(cuName->buf == NULLP)
209 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
211 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
212 sizeof(F1SetupResponseIEs_t));
214 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
215 elementCnt * sizeof(F1SetupResponseIEs_t *));
216 CU_FREE(f1apMsg->choice.successfulOutcome,\
217 sizeof(SuccessfulOutcome_t));
218 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
221 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
223 /*Cells to be activated list*/
225 f1SetupRsp->protocolIEs.list.array[idx]->id = \
226 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
227 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
228 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
229 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
230 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
231 Cells_to_be_Activated_List;
233 cellToActivate->list.count = cellCnt;
234 cellToActivate->list.size = \
235 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
236 CU_ALLOC(cellToActivate->list.array,\
237 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
238 if(cellToActivate->list.array == NULLP)
240 CU_FREE(cuName->buf, sizeof(cuName->size));
241 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
243 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
244 sizeof(F1SetupResponseIEs_t));
246 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
247 elementCnt * sizeof(F1SetupResponseIEs_t *));
248 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
249 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
252 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
254 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
255 if(cellToActivate->list.array[ieIdx] == NULLP)
257 CU_FREE(cellToActivate->list.array,\
258 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
259 CU_FREE(cuName->buf, sizeof(cuName->size));
260 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
262 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
263 sizeof(F1SetupResponseIEs_t));
265 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
266 elementCnt * sizeof(F1SetupResponseIEs_t *));
267 CU_FREE(f1apMsg->choice.successfulOutcome, \
268 sizeof(SuccessfulOutcome_t));
269 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
273 cellToActivate->list.array[0]->id = \
274 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
275 cellToActivate->list.array[0]->criticality = Criticality_ignore;
276 cellToActivate->list.array[0]->value.present = \
277 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
278 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
279 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
280 CU_ALLOC(cellToActivate->list.array[0]->\
281 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
283 if(cellToActivate->list.array[0]->value.choice.\
284 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
287 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
289 CU_FREE(cellToActivate->list.array[ieIdx],\
290 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
293 CU_FREE(cellToActivate->list.array,\
294 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
295 CU_FREE(cuName->buf, sizeof(cuName->size));
296 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
298 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
299 sizeof(F1SetupResponseIEs_t));
301 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
302 elementCnt * sizeof(F1SetupResponseIEs_t *));
303 CU_FREE(f1apMsg->choice.successfulOutcome, \
304 sizeof(SuccessfulOutcome_t));
305 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
308 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
309 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
310 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
311 nRCGI.nRCellIdentity.size = 5;
312 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
313 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
315 if(cellToActivate->list.array[0]->value.choice.\
316 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
318 CU_FREE(cellToActivate->list.array[0]->\
319 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
321 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
323 CU_FREE(cellToActivate->list.array[ieIdx],\
324 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
327 CU_FREE(cellToActivate->list.array,\
328 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
329 CU_FREE(cuName->buf, sizeof(cuName->size));
330 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
332 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
333 sizeof(F1SetupResponseIEs_t));
335 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
336 elementCnt * sizeof(F1SetupResponseIEs_t *));
337 CU_FREE(f1apMsg->choice.successfulOutcome, \
338 sizeof(SuccessfulOutcome_t));
339 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
342 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
345 f1SetupRsp->protocolIEs.list.array[idx]->id = \
346 ProtocolIE_ID_id_GNB_CU_RRC_Version;
347 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
348 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
349 F1SetupResponseIEs__value_PR_RRC_Version;
350 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
351 rrcVer->latest_RRC_Version.size = RRC_SIZE;
353 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(U8));
354 if(rrcVer->latest_RRC_Version.buf == NULLP)
356 CU_FREE(cuName->buf, sizeof(cuName->size));
357 for(ieIdx=0; ieIdx<elementCnt; idx++)
359 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
360 sizeof(F1SetupResponseIEs_t));
362 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
363 elementCnt * sizeof(F1SetupResponseIEs_t *));
364 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
365 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
369 /* Need to check RRC Version */
370 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
371 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
372 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
373 if(rrcVer->iE_Extensions == NULLP)
375 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
376 CU_FREE(cuName->buf, sizeof(cuName->size));
377 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
379 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
380 sizeof(F1SetupResponseIEs_t));
382 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
383 elementCnt * sizeof(F1SetupResponseIEs_t *));
384 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
385 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
388 rrcVer->iE_Extensions->list.count = 1;
389 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
390 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
391 sizeof(struct RRC_Version_ExtIEs *));
392 if(rrcVer->iE_Extensions->list.array == NULLP)
394 CU_FREE(rrcVer->iE_Extensions,\
395 sizeof(ProtocolExtensionContainer_4624P81_t));
396 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
397 CU_FREE(cuName->buf, sizeof(cuName->size));
398 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
400 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
401 sizeof(F1SetupResponseIEs_t));
403 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
404 elementCnt * sizeof(F1SetupResponseIEs_t *));
405 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
406 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
409 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
410 sizeof(struct RRC_Version_ExtIEs));
411 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
413 CU_FREE(rrcVer->iE_Extensions->list.array,\
414 sizeof(struct RRC_Version_ExtIEs *));
415 CU_FREE(rrcVer->iE_Extensions,\
416 sizeof(ProtocolExtensionContainer_4624P81_t));
417 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
418 CU_FREE(cuName->buf, sizeof(cuName->size));
419 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
421 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
422 sizeof(F1SetupResponseIEs_t));
424 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
425 elementCnt * sizeof(F1SetupResponseIEs_t *));
426 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
427 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
430 rrcVer->iE_Extensions->list.array[0]->id = \
431 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
432 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
433 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
434 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
435 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
436 Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
437 CU_ALLOC(rrcVer->iE_Extensions->list.\
438 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
440 if(rrcVer->iE_Extensions->list.\
441 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
443 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
444 sizeof(struct RRC_Version_ExtIEs));
445 CU_FREE(rrcVer->iE_Extensions->list.array,\
446 sizeof(struct RRC_Version_ExtIEs *));
447 CU_FREE(rrcVer->iE_Extensions,\
448 sizeof(ProtocolExtensionContainer_4624P81_t));
449 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
450 CU_FREE(cuName->buf, sizeof(cuName->size));
451 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
453 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
454 sizeof(F1SetupResponseIEs_t));
456 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
457 elementCnt * sizeof(F1SetupResponseIEs_t *));
458 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
459 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
462 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
463 Latest_RRC_Version_Enhanced.buf[0] = 0;
464 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
465 Latest_RRC_Version_Enhanced.buf[1] = 5;
466 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
467 Latest_RRC_Version_Enhanced.buf[2] = 15;
469 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
471 /* Encode the F1SetupRequest type as UPER */
472 memset(encBuf, 0, ENC_BUF_MAX_LEN);
474 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
477 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
478 CU_FREE(cuName->buf, sizeof(cuName->size));
479 for(idx=0; idx<elementCnt; idx++)
481 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
483 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
484 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
485 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
487 /* Check encode results */
488 if(encRetVal.encoded == ENCODE_FAIL)
490 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
491 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
496 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
497 for(int i=0; i< encBufSize; i++)
499 printf("%x",encBuf[i]);
504 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
506 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
511 }/* End of BuildAndSendF1SetupRsp */
513 /*******************************************************************
515 * @brief Builds and sends the DUUpdateAcknowledge
519 * Function : BuildAndSendDUUpdateAck
521 * Functionality: Constructs the DU Update Acknowledge message and sends
522 * it to the DU through SCTP.
524 * @params[in] void **buf,Buffer to which encoded pattern is written into
525 * @params[in] int *size,size of buffer
527 * @return ROK - success
530 * ****************************************************************/
532 S16 BuildAndSendDUUpdateAck()
536 F1AP_PDU_t *f1apMsg = NULL;
537 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
538 asn_enc_rval_t enRetVal; /* Encoder return value */
540 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
542 /* Allocate the memory for F1SetupRequest_t */
543 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
546 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
550 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
552 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
553 if(f1apMsg->choice.successfulOutcome == NULLP)
555 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
556 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
560 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
561 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
562 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
563 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
566 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
567 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
569 /* Initialize the F1Setup members */
570 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
571 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
573 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
574 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
575 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
579 for(idx=0; idx<elementCnt; idx++)
581 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
582 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
584 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
585 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
586 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
593 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
594 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
595 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
596 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
598 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
600 /* Encode the F1SetupRequest type as UPER */
601 memset(encBuf, 0, ENC_BUF_MAX_LEN);
603 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
606 for(idx=0; idx<elementCnt; idx++)
608 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
610 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
611 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
612 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
614 /* Checking encode results */
615 if(enRetVal.encoded == ENCODE_FAIL)
617 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
622 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
623 for(int i=0; i< encBufSize; i++)
625 printf("%x",encBuf[i]);
630 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
632 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
638 }/* End of BuildAndSendDUUpdateAck*/
639 /*******************************************************************
641 * @brief deallocating the memory of F1reset msg
645 * Function : FreeF1ResetReq
648 * - freeing memory of F1reset request msg
654 * ****************************************************************/
655 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
658 Reset_t *f1ResetMsg = NULLP;
662 if(f1apMsg->choice.initiatingMessage)
664 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
665 if(f1ResetMsg->protocolIEs.list.array)
667 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
669 if(f1ResetMsg->protocolIEs.list.array[idx])
671 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
674 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
676 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
678 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
681 /*******************************************************************
683 * @brief build ansld ans send f1reset msg
687 * Function : BuildAndSendF1ResetReq
689 * Functionality: build and send f1reset msg
691 * @return ROK - success
694 * ****************************************************************/
695 uint8_t BuildAndSendF1ResetReq()
697 uint8_t elementCnt=0;
699 uint8_t ret= RFAILED;
700 Reset_t *f1ResetMsg = NULLP;
701 F1AP_PDU_t *f1apMsg = NULLP;
702 asn_enc_rval_t encRetVal;
703 DU_LOG("\nF1AP : Building F1 Reset request \n");
706 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
709 DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
712 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
713 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
714 if(f1apMsg->choice.initiatingMessage == NULLP)
716 DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed");
719 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
720 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
721 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
723 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
726 f1ResetMsg->protocolIEs.list.count = elementCnt;
727 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
729 /* Initialize the F1Reset members */
730 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
731 if(f1ResetMsg->protocolIEs.list.array == NULLP)
733 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq");
736 for(idx=0; idx<elementCnt; idx++)
738 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
739 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
741 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
748 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
749 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
750 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
751 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
755 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
756 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
757 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
758 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
759 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
763 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
764 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
765 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
766 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
767 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
769 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
771 /* Encode the F1SetupRequest type as APER */
772 memset(encBuf, 0, ENC_BUF_MAX_LEN);
774 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
778 if(encRetVal.encoded == ENCODE_FAIL)
780 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
781 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
786 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
787 for(idx=0; idx< encBufSize; idx++)
789 printf("%x",encBuf[idx]);
793 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
795 DU_LOG("\nF1AP : Sending F1 Reset request failed");
803 FreeF1ResetReq(f1apMsg);
807 /*******************************************************************
809 * @brief Fills Radio Bearer Config
813 * Function : fillRadioBearerConfig
815 * Functionality: Fills Radio Bearer Config
817 * @params[in] SRB_ToAddModList *
819 * @return ROK - success
822 * ****************************************************************/
823 uint8_t fillRadioBearerConfig(SRB_ToAddModList_t *bearerCfg)
828 if(bearerCfg != NULLP)
831 bearerCfg->list.count = elementCnt;
832 bearerCfg->list.size =\
833 elementCnt * sizeof(SRB_ToAddMod_t *);
834 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
835 if(bearerCfg->list.array != NULLP)
837 for(idx = 0; idx < elementCnt; idx++)
839 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
840 if(bearerCfg->list.array[idx] == NULLP)
842 for(ied = 0; ied < idx; ied++)
844 CU_FREE(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
846 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
856 bearerCfg->list.array[idx]->srb_Identity = SRB1;
861 /*******************************************************************
863 * @brief Fills Master CellGroup Info
867 * Function : fillMasterCellGroup
869 * Functionality: Fills Master Cell Group IE
871 * @params[in] RRCSetup_IEs_t *
873 * @return ROK - success
876 * ****************************************************************/
878 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
881 masterCellGroup->buf = NULLP;
882 if(f1apMsgDb.duToCuContainer.buf)
884 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
885 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
886 if(masterCellGroup->buf != NULLP)
888 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
889 masterCellGroup->size);
903 /*******************************************************************
905 * @brief Fills RRC setup IE
909 * Function : fillRRCSetupIE
911 * Functionality: Fills RRC Setup IE
913 * @params[in] RRCSetup_IEs_t *
915 * @return ROK - success
918 * ****************************************************************/
920 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
925 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
926 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
928 ret = fillRadioBearerConfig(rrcSetupIE->radioBearerConfig.srb_ToAddModList);
932 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
936 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
942 /*******************************************************************
944 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
948 * Function : BuildDLRRCContainer
950 * Functionality: Builds RRC Container IE required for
951 * DLRRCMessageTransfer
955 * @return ROK - success
958 * ****************************************************************/
960 uint8_t BuildDLRRCContainer(RRCContainer_t *rrcContainer)
964 DL_CCCH_Message_t dl_CCCH_Msg;
965 asn_enc_rval_t encRetVal;
967 if(rrcContainer != NULLP)
969 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
971 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
972 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
974 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
975 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
976 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
978 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
979 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
980 present = RRCSetup__criticalExtensions_PR_rrcSetup;
981 /* Fill RRC Setup IE */
982 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
983 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
984 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
985 criticalExtensions.choice.rrcSetup != NULLP)
987 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
988 criticalExtensions.choice.rrcSetup);
992 /* encode DL-CCCH message into RRC Container */
993 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
994 memset(encBuf, 0, ENC_BUF_MAX_LEN);
996 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
998 if(encRetVal.encoded == ENCODE_FAIL)
1000 DU_LOG( "\n F1AP : Could not encode RRCContainer (at %s)\n",\
1001 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1006 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer\n");
1007 for(int i = 0; i< encBufSize; i++)
1009 printf("%x",encBuf[i]);
1011 rrcContainer->size = encBufSize;
1012 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1013 if(rrcContainer->buf != NULLP)
1015 memset(rrcContainer->buf, 0, encBufSize);
1016 for(idx2 = 0; idx2 < encBufSize; idx2++)
1018 rrcContainer->buf[idx2] = encBuf[idx2];
1030 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg");
1036 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg");
1042 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice");
1048 DU_LOG("\nF1AP: Memory Alloc failed for DlCcch Msg");
1054 /*******************************************************************
1056 * @brief Builds and sends the DLRRCMessageTransfer
1060 * Function : BuildAndSendDLRRCMessageTransfer
1062 * Functionality: Constructs the DL RRC Message Transfer and sends
1063 * it to the CU through SCTP.
1067 * @return ROK - success
1070 * ****************************************************************/
1071 S16 BuildAndSendDLRRCMessageTransfer()
1073 uint8_t elementCnt = 0;
1077 F1AP_PDU_t *f1apMsg = NULLP;
1078 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1079 asn_enc_rval_t encRetVal; /* Encoder return value */
1081 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1083 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1084 if(f1apMsg == NULLP)
1086 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1090 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1091 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1092 sizeof(InitiatingMessage_t));
1093 if(f1apMsg->choice.initiatingMessage == NULLP)
1095 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1096 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1100 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1101 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1102 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1103 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1106 dlRRCMsg->protocolIEs.list.count = elementCnt;
1107 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1109 /* Initialize the F1Setup members */
1110 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1111 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1113 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1114 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1115 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1119 for(idx=0; idx<elementCnt; idx++)
1121 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1122 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1124 for(ieId=0; ieId<idx; ieId++)
1126 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1127 sizeof(DLRRCMessageTransferIEs_t));
1129 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1130 dlRRCMsg->protocolIEs.list.size);
1131 CU_FREE(f1apMsg->choice.initiatingMessage,\
1132 sizeof(InitiatingMessage_t));
1133 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1138 /* GNB CU UE F1AP ID */
1140 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1141 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1142 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1143 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1144 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1146 /* GNB DU UE F1AP ID */
1148 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1149 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1150 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1151 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1152 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1153 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1157 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1158 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1159 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1160 DLRRCMessageTransferIEs__value_PR_SRBID;
1161 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB1;
1165 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1166 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1167 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1168 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1169 BuildDLRRCContainer(&dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1171 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1173 /* Encode the F1SetupRequest type as APER */
1174 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1176 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1178 /* Encode results */
1179 if(encRetVal.encoded == ENCODE_FAIL)
1181 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1182 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1187 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1188 for(int i=0; i< encBufSize; i++)
1190 printf("%x",encBuf[i]);
1195 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1197 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1202 }/* End of BuildAndSendDLRRCMessageTransfer */
1204 /*******************************************************************
1206 * @brief Builds and sends the UE Setup Response
1210 * Function : BuildAndSendUESetRsp
1212 * Functionality: Constructs the UE Setup Response and sends
1213 * it to the DU through SCTP.
1217 * @return ROK - success
1220 * ****************************************************************/
1221 S16 BuildAndSendUESetRsp()
1230 F1AP_PDU_t *f1apMsg = NULL;
1231 UEContextSetupResponse_t *ueSetRsp;
1232 asn_enc_rval_t encRetVal; /* Encoder return value */
1234 DU_LOG("\n F1AP : Building UE Context Setup Response\n");
1236 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1237 if(f1apMsg == NULLP)
1239 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1243 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
1244 CU_ALLOC(f1apMsg->choice.successfulOutcome,
1245 sizeof(SuccessfulOutcome_t));
1246 if(f1apMsg->choice.successfulOutcome == NULLP)
1248 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1249 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1253 f1apMsg->choice.successfulOutcome->procedureCode = \
1254 ProcedureCode_id_UEContextSetup;
1255 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
1256 f1apMsg->choice.successfulOutcome->value.present = \
1257 SuccessfulOutcome__value_PR_UEContextSetupResponse;
1259 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
1261 ueSetRsp->protocolIEs.list.count = elementCnt;
1262 ueSetRsp->protocolIEs.list.size = \
1263 elementCnt * sizeof(UEContextSetupResponse_t *);
1265 /* Initialize the UESetup members */
1266 CU_ALLOC(ueSetRsp->protocolIEs.list.array, \
1267 ueSetRsp->protocolIEs.list.size);
1268 if(ueSetRsp->protocolIEs.list.array == NULLP)
1270 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
1271 CU_FREE(f1apMsg->choice.successfulOutcome,
1272 sizeof(SuccessfulOutcome_t));
1273 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
1277 for(idx=0; idx<elementCnt; idx++)
1279 CU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
1280 sizeof(UEContextSetupResponseIEs_t));
1281 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
1283 for(ieId=0; ieId<idx; ieId++)
1285 CU_FREE(ueSetRsp->protocolIEs.list.array[ieId],\
1286 sizeof(UEContextSetupResponseIEs_t));
1288 CU_FREE(ueSetRsp->protocolIEs.list.array,\
1289 ueSetRsp->protocolIEs.list.size);
1290 CU_FREE(f1apMsg->choice.successfulOutcome,\
1291 sizeof(SuccessfulOutcome_t));
1292 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1299 /*GNB CU UE F1AP ID*/
1300 ueSetRsp->protocolIEs.list.array[idx]->id = \
1301 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1302 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1303 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1304 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
1305 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1307 /*GNB DU UE F1AP ID*/
1309 ueSetRsp->protocolIEs.list.array[idx]->id = \
1310 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1311 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1312 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1313 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
1314 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1317 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1319 /* Encode the F1SetupRequest type as APER */
1320 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1322 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1324 /* Encode results */
1325 if(encRetVal.encoded == ENCODE_FAIL)
1327 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
1328 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1333 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
1334 for(int i=0; i< encBufSize; i++)
1336 printf("%x",encBuf[i]);
1341 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1343 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
1348 }/* End of BuildAndSendUESetRsp */
1350 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1354 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1355 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1357 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1359 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1361 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1363 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1365 case ProtocolIE_ID_id_NRCGI:
1367 case ProtocolIE_ID_id_C_RNTI:
1369 case ProtocolIE_ID_id_RRCContainer:
1371 case ProtocolIE_ID_id_DUtoCURRCContainer:
1373 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1374 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1375 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1377 DU_LOG("\n Received Du to Cu RRC Container ");
1378 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1379 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1380 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1381 f1apMsgDb.duToCuContainer.size);
1382 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1384 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1385 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1386 .duToCuContainer.size);
1391 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1397 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1402 ret = BuildAndSendDLRRCMessageTransfer();
1407 /*******************************************************************
1409 * @brief Builds Nrcgi
1413 * Function : BuildNrcgi
1415 * Functionality: Building the PLMN ID and NR Cell id
1417 * @params[in] NRCGI_t *nrcgi
1418 * @return ROK - success
1421 * ****************************************************************/
1422 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1426 uint8_t byteSize = 5;
1428 /* Allocate Buffer Memory */
1429 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1430 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1431 if(nrcgi->pLMN_Identity.buf == NULLP)
1435 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1441 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1442 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1443 if(nrcgi->nRCellIdentity.buf == NULLP)
1447 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1454 /*******************************************************************
1456 * @brief Builds Special cell list for UE Setup Request
1460 * Function : BuildSplCellList
1462 * Functionality: Constructs the Special Cell list for UESetReq
1464 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1466 * @return ROK - success
1469 * ****************************************************************/
1470 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1476 spCellLst->list.count = cellCnt;
1477 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1478 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1479 if(spCellLst->list.array == NULLP)
1483 for(idx=0; idx<cellCnt; idx++)
1485 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1486 if(spCellLst->list.array[idx] == NULLP)
1492 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1493 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1494 spCellLst->list.array[idx]->value.present =\
1495 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1496 /* Special Cell ID -NRCGI */
1497 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1502 /*Special Cell Index*/
1503 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1505 }/* End of BuildSplCellList*/
1507 /*******************************************************************
1509 * @brief Builds SRBS to be setup
1513 * Function : BuildSRBSetup
1515 * Functionality: Constructs the SRB's for UESetReq
1517 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1519 * @return ROK - success
1522 * ****************************************************************/
1523 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1528 srbSet->list.count = srbCnt;
1529 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1530 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1531 if(srbSet->list.array == NULLP)
1535 for(idx=0; idx<srbCnt; idx++)
1537 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1538 if(srbSet->list.array[idx] == NULLP)
1544 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1545 srbSet->list.array[idx]->criticality = Criticality_ignore;
1546 srbSet->list.array[idx]->value.present = \
1547 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1548 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1550 }/* End of BuildSRBSetup*/
1552 /*******************************************************************
1554 * @brief Builds QOS Info for DRB Setum Item
1558 * Function : BuildQOSInfo
1560 * Functionality: Constructs the QOS Info for DRB Setup Item
1562 * @params[in] QoSInformation_t *qosinfo
1564 * @return ROK - success
1567 * ****************************************************************/
1568 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1570 /* NonDynamic5QIDescriptor */
1571 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
1572 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
1573 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
1578 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
1580 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
1581 sizeof(AveragingWindow_t));
1582 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
1587 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
1588 /*MaxDataBurstVolume*/
1589 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1590 sizeof(MaxDataBurstVolume_t));
1591 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
1596 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
1598 /*nRGRAN Allocation Retention Priority*/
1599 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
1600 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
1601 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
1603 /* TO DO: GBR_QoSFlowInformation */
1605 }/*End of BuildQOSInfo*/
1607 /*******************************************************************
1609 * @brief Builds SNSSAI
1613 * Function : BuildSNSSAI
1615 * Functionality: Constructs the SNSSAI For DRB list
1617 * @params[in] SNSSAI_t *snssai
1619 * @return ROK - success
1622 * ****************************************************************/
1623 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
1627 snssai->sST.size = sizeof(uint8_t);
1628 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
1629 if(snssai->sST.buf == NULLP)
1633 snssai->sST.buf[0] = 3;
1635 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
1636 if(snssai->sD == NULLP)
1640 snssai->sD->size = 3*sizeof(uint8_t);
1641 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
1642 if(snssai->sD->buf == NULLP)
1646 snssai->sD->buf[0] = 3;
1647 snssai->sD->buf[1] = 6;
1648 snssai->sD->buf[2] = 9;
1650 }/*End of BuildSNSSAI*/
1652 /*******************************************************************
1654 * @brief Builds the flow map.
1658 * Function : BuildFlowsMap
1660 * Functionality: Constructs the flowmap For DRB list
1662 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
1664 * @return ROK - success
1667 * ****************************************************************/
1668 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
1674 flowMap->list.count = flowCnt;
1675 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
1676 CU_ALLOC(flowMap->list.array,flowMap->list.size);
1677 if(flowMap->list.array == NULLP)
1681 for(idx=0; idx<flowCnt; idx++)
1683 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
1684 if(flowMap->list.array[idx] == NULLP)
1690 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
1691 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
1697 }/*End of BuildFlowsMap*/
1699 /*******************************************************************
1701 * @brief Builds the Uplink Tunnel Info
1705 * Function : BuildULTnlInfo
1707 * Functionality: Constructs the UL TnlInfo For DRB list
1709 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
1711 * @return ROK - success
1714 * ****************************************************************/
1715 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
1720 ulInfo->list.count = ulCnt;
1721 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
1722 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
1723 if(ulInfo->list.array == NULLP)
1727 for(idx=0; idx<ulCnt; idx++)
1729 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
1730 if(ulInfo->list.array[idx] == NULLP)
1736 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
1737 UPTransportLayerInformation_PR_gTPTunnel;
1739 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
1740 sizeof(GTPTunnel_t));
1741 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
1745 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1746 transportLayerAddress.size = 4*sizeof(uint8_t);
1747 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1748 transportLayerAddress.buf,ulInfo->list.array[idx]->\
1749 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
1750 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1751 transportLayerAddress.buf == NULLP)
1755 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1756 transportLayerAddress.buf[0] = 4;
1757 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1758 transportLayerAddress.buf[1] = 4;
1759 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1760 transportLayerAddress.buf[2] = 4;
1761 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1762 transportLayerAddress.buf[3] = 5;
1763 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1764 transportLayerAddress.bits_unused = 0;
1766 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
1767 = 4 * sizeof(uint8_t);
1768 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1769 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
1770 gTPTunnel->gTP_TEID.size);
1771 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
1776 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1777 gTP_TEID.buf[0] = 11;
1778 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1779 gTP_TEID.buf[1] = 0;
1780 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1781 gTP_TEID.buf[2] = 0;
1782 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1783 gTP_TEID.buf[3] = 1;
1786 }/*End of BuildULTnlInfo*/
1788 /*******************************************************************
1790 * @brief Builds DRBS to be setup
1794 * Function : BuildDRBSetup
1796 * Functionality: Constructs the DRB's for UESetReq
1798 * @params[in] DRBs_ToBeSetup_List_t *drbSet
1800 * @return ROK - success
1803 * ****************************************************************/
1804 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
1806 uint8_t BuildQOSInforet;
1807 uint8_t BuildSNSSAIret;
1808 uint8_t BuildFlowsMapret;
1809 uint8_t BuildULTnlInforet;
1812 DRBs_ToBeSetup_Item_t *drbSetItem;
1814 drbSet->list.count = drbCnt;
1815 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
1816 CU_ALLOC(drbSet->list.array,drbSet->list.size);
1817 if(drbSet->list.array == NULLP)
1821 for(idx=0; idx<drbCnt; idx++)
1823 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
1824 if(drbSet->list.array[idx] == NULLP)
1830 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
1831 drbSet->list.array[idx]->criticality = Criticality_ignore;
1832 drbSet->list.array[idx]->value.present = \
1833 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
1834 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
1836 drbSetItem->dRBID = 1;
1838 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
1839 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
1840 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
1844 drbSetItem->qoSInformation.choice.choice_extension->id = \
1845 ProtocolIE_ID_id_DRB_Information;
1846 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
1848 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
1849 QoSInformation_ExtIEs__value_PR_DRB_Information;
1850 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
1851 choice_extension->value.choice.DRB_Information.dRB_QoS);
1852 if(BuildQOSInforet != ROK)
1857 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
1858 choice_extension->value.choice.DRB_Information.sNSSAI);
1859 if(BuildSNSSAIret != ROK)
1863 /*Flows mapped to DRB List*/
1864 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
1865 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
1866 if(BuildFlowsMapret != ROK)
1870 /*ULUPTNLInformation To Be Setup List*/
1871 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
1872 if(BuildULTnlInforet != ROK)
1877 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
1879 /*UL Configuration*/
1880 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
1881 if(drbSetItem->uLConfiguration == NULLP)
1885 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
1887 }/* End of BuildDRBSetup*/
1889 /*******************************************************************
1891 * @brief Deallocating memory of function BuildAndSendUESetReq
1895 * Function : FreeNrcgi
1897 * Functionality: Deallocating memory for function BuildNrcgi
1899 * @params[in] NRCGI_t *nrcgi
1903 *******************************************************************/
1904 void FreeNrcgi(NRCGI_t *nrcgi)
1906 if(nrcgi->pLMN_Identity.buf != NULLP)
1908 if(nrcgi->nRCellIdentity.buf != NULLP)
1910 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1912 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1915 /*******************************************************************
1917 * @brief Deallocating memory of function BuildAndSendUESetReq
1921 * Function : FreeSplCellList
1923 * Functionality: Deallocating memory for function BuildSplCellList
1925 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1930 * *****************************************************************/
1931 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1934 if(spCellLst->list.array != NULLP)
1936 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
1938 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
1940 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1942 if(spCellLst->list.array[cellidx]!=NULLP)
1944 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1947 CU_FREE(spCellLst->list.array,spCellLst->list.size);
1950 /*******************************************************************
1952 * @brief Deallocating memory of function BuildAndSendUESetReq
1956 * Function : FreeSRBSetup
1958 * Functionality: Deallocating memory for function BuildSRBSetup
1960 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1965 * ******************************************************************/
1966 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1969 if(srbSet->list.array != NULLP)
1971 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
1973 if(srbSet->list.array[srbidx]!=NULLP)
1975 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1978 CU_FREE(srbSet->list.array,srbSet->list.size);
1981 /*******************************************************************
1983 * @brief Deallocating memory of function BuildAndSendUESetReq
1987 * Function : FreeQOSInfo
1989 * Functionality: Deallocating memory for function BuildQOSInfo
1991 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
1995 * ****************************************************************/
1996 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1998 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2000 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2002 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2004 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2005 sizeof(MaxDataBurstVolume_t));
2007 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2008 sizeof(AveragingWindow_t));
2010 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2011 sizeof(NonDynamic5QIDescriptor_t));
2014 /*******************************************************************
2016 * @brief Deallocating memory of function BuildAndSendUESetReq
2020 * Function : FreeULTnlInfo
2022 * Functionality: Deallocating memory for function BuildULTnlInfo
2024 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2029 * ****************************************************************/
2030 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2033 if(ulInfo->list.array != NULLP)
2035 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2037 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2039 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2041 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2042 transportLayerAddress.buf != NULLP)
2044 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2047 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2048 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2049 gTPTunnel->gTP_TEID.size);
2051 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2052 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2053 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2055 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2056 sizeof(GTPTunnel_t));
2059 if(ulInfo->list.array[ulidx]!=NULLP)
2061 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2064 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2067 /*******************************************************************
2069 * @brief Deallocating memory for BuildAndSendUESetReq
2073 * Function : FreeDRBSetup
2075 * Functionality: Deallocating memory for BuildDRBSetup
2077 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2081 * ****************************************************************/
2082 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2084 DRBs_ToBeSetup_Item_t *drbSetItem;
2087 if(drbSet->list.array == NULLP)
2089 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2091 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2093 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2094 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2096 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2097 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2099 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2100 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2102 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2103 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2105 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2107 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2109 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2111 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2112 flows_Mapped_To_DRB_List.list.array != NULLP)
2114 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2115 flows_Mapped_To_DRB_List.list.count; flowidx++)
2117 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2118 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2120 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2121 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2122 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2124 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2125 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2126 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2128 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2129 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2130 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2132 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2133 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2135 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2136 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2137 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2138 sizeof(MaxDataBurstVolume_t));
2140 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2141 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2142 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2144 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2145 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2146 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2149 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2150 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2152 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2153 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2156 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2157 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2158 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2160 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2161 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2163 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2164 sizeof(OCTET_STRING_t));
2166 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2167 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2169 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2170 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2172 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2173 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2175 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2176 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2178 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2181 if(drbSet->list.array[drbidx]!=NULLP)
2183 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2186 CU_FREE(drbSet->list.array,drbSet->list.size);
2191 /*******************************************************************
2193 * @brief Free the UE Setup Request
2197 * Function : FreeUESetReq
2199 * Functionality: Deallocate the memory of BuildUESetReq
2201 * @params[in] F1AP_PDU_t *f1apMsg
2206 * ****************************************************************/
2207 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
2211 UEContextSetupRequest_t *ueSetReq;
2213 if(f1apMsg != NULLP)
2215 if(f1apMsg->choice.initiatingMessage != NULLP)
2217 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2218 if(ueSetReq->protocolIEs.list.array != NULLP)
2220 if(ueSetReq->protocolIEs.list.array[idx])
2222 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2224 if(ueSetReq->protocolIEs.list.array[idx])
2226 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2228 if(ueSetReq->protocolIEs.list.array[idx])
2230 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2232 if(ueSetReq->protocolIEs.list.array[idx])
2234 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2239 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
2241 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2243 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2246 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2248 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2250 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2254 /*******************************************************************
2256 * @brief Builds and sends the UE Setup Request
2260 * Function : BuildAndSendUESetReq
2262 * Functionality: Constructs the UE Setup Request and sends
2263 * it to the CU through SCTP.
2267 * @return ROK - success
2270 * ****************************************************************/
2271 uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
2272 uint16_t rrcContLen, uint8_t *rrcContainer)
2275 uint8_t SplCellListret;
2276 uint8_t SrbSetupret;
2280 F1AP_PDU_t *f1apMsg = NULLP;
2281 UEContextSetupRequest_t *ueSetReq = NULLP;
2282 asn_enc_rval_t encRetVal; /* Encoder return value */
2283 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2284 uint8_t ret= RFAILED;
2288 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2290 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2291 if(f1apMsg == NULLP)
2293 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2297 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2298 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2299 if(f1apMsg->choice.initiatingMessage == NULLP)
2301 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2305 f1apMsg->choice.initiatingMessage->procedureCode = \
2306 ProcedureCode_id_UEContextSetup;
2307 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2308 f1apMsg->choice.initiatingMessage->value.present = \
2309 InitiatingMessage__value_PR_UEContextSetupRequest;
2311 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2314 ueSetReq->protocolIEs.list.count = elementCnt;
2315 ueSetReq->protocolIEs.list.size = \
2316 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2318 /* Initialize the UESetup members */
2319 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2321 if(ueSetReq->protocolIEs.list.array == NULLP)
2323 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2327 for(idx1=0; idx1<elementCnt; idx1++)
2329 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
2330 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
2338 /*GNB CU UE F1AP ID*/
2339 ueSetReq->protocolIEs.list.array[idx]->id = \
2340 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2341 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2342 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2343 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2344 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
2346 /*GNB DU UE F1AP ID*/
2348 ueSetReq->protocolIEs.list.array[idx]->id = \
2349 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2350 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2351 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2352 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2353 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
2357 ueSetReq->protocolIEs.list.array[idx]->id = \
2358 ProtocolIE_ID_id_SpCell_ID;
2359 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2360 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2361 UEContextSetupRequestIEs__value_PR_NRCGI;
2362 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2368 /*Served Cell Index*/
2370 ueSetReq->protocolIEs.list.array[idx]->id = \
2371 ProtocolIE_ID_id_ServCellIndex;
2372 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2373 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2374 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2375 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2378 /*CellULConfigured*/
2380 ueSetReq->protocolIEs.list.array[idx]->id = \
2381 ProtocolIE_ID_id_SpCellULConfigured;
2382 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2383 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2384 UEContextSetupRequestIEs__value_PR_CellULConfigured;
2385 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2386 CellULConfigured_none;
2389 /*CUtoDURRCContainer*/
2391 ueSetReq->protocolIEs.list.array[idx]->id = \
2392 ProtocolIE_ID_id_CUtoDURRCInformation;
2393 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2394 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2395 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
2397 /*Special Cells to be SetupList*/
2399 ueSetReq->protocolIEs.list.array[idx]->id = \
2400 ProtocolIE_ID_id_SCell_ToBeSetup_List;
2401 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2402 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2403 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
2404 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2405 if(SplCellListret != ROK)
2409 /*SRBs To Be Setup List*/
2411 ueSetReq->protocolIEs.list.array[idx]->id = \
2412 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
2413 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2414 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2415 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
2416 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2417 if(SrbSetupret != ROK)
2421 /*DRBs to Be Setup List*/
2423 ueSetReq->protocolIEs.list.array[idx]->id = \
2424 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
2425 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2426 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2427 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
2428 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2436 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
2437 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2438 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2439 UEContextSetupRequestIEs__value_PR_RRCContainer;
2440 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = rrcContLen;
2441 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
2442 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2443 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
2445 DU_LOG(" F1AP : Memory allocation for BuildAndSendUESetReq failed");
2448 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2449 rrcContainer, ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2451 /* RRC delivery status request */
2453 ueSetReq->protocolIEs.list.array[idx]->id = \
2454 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
2455 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2456 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2457 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
2458 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
2459 RRCDeliveryStatusRequest_true;
2461 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2463 /* Encode the F1SetupRequest type as APER */
2464 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2466 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2468 /* Encode results */
2469 if(encRetVal.encoded == ENCODE_FAIL)
2471 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
2472 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2477 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
2478 for(int i=0; i< encBufSize; i++)
2480 printf("%x",encBuf[i]);
2485 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
2487 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
2493 FreeUESetReq(f1apMsg);
2496 }/* End of BuildAndSendUESetReq*/
2498 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
2502 uint8_t cuUeF1apId, duUeF1apId;
2503 uint8_t *rrcContainer;
2504 uint16_t rrcContLen;
2505 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
2507 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2509 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
2511 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
2513 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2515 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
2518 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2520 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2523 case ProtocolIE_ID_id_SRBID:
2525 case ProtocolIE_ID_id_RRCContainer:
2527 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
2528 CU_ALLOC(rrcContainer, rrcContLen)
2531 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
2534 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
2540 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
2545 ret = BuildAndSendUESetReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer);
2548 /****************************************************************
2549 * @brief Build And Send F1ResetAck
2553 * Function : FreeF1ResetAck
2556 * - Build And Send F1ResetRSP
2559 * @return ROK - success
2562 * ****************************************************************/
2563 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
2566 ResetAcknowledge_t *f1ResetAck;
2570 if(f1apMsg->choice.successfulOutcome)
2572 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
2574 if(f1ResetAck->protocolIEs.list.array)
2576 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
2578 if(f1ResetAck->protocolIEs.list.array[idx])
2580 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
2583 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
2585 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
2587 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2590 /****************************************************************
2591 * @brief Build And Send F1ResetAck
2595 * Function : BuildAndSendF1ResetAck
2598 * - Build And Send F1ResetRSP
2601 * @return ROK - success
2604 * ****************************************************************/
2606 uint8_t BuildAndSendF1ResetAck()
2609 uint8_t elementCnt = 0;
2610 uint8_t ret = RFAILED;
2611 F1AP_PDU_t *f1apMsg = NULL;
2612 ResetAcknowledge_t *f1ResetAck = NULLP;
2613 asn_enc_rval_t encRetVal;
2614 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
2617 /* Allocate the memory for F1ResetRequest_t */
2618 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2619 if(f1apMsg == NULLP)
2621 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
2625 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
2627 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
2628 if(f1apMsg->choice.successfulOutcome == NULLP)
2630 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
2634 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
2635 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
2636 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
2637 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
2641 f1ResetAck->protocolIEs.list.count = elementCnt;
2642 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
2644 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
2645 if(f1ResetAck->protocolIEs.list.array == NULLP)
2647 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
2651 for(idx=0; idx<elementCnt; idx++)
2653 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
2654 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
2661 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
2662 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2663 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
2664 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
2666 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2668 /* Encode the F1SetupRequest type as UPER */
2669 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2671 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
2673 /* Check encode results */
2674 if(encRetVal.encoded == ENCODE_FAIL)
2676 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
2677 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2682 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
2683 for(int i=0; i< encBufSize; i++)
2685 printf("%x",encBuf[i]);
2689 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
2691 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
2699 FreeF1ResetAck(f1apMsg);
2702 /*******************************************************************
2704 * @brief Handles received F1AP message and sends back response
2708 * Function : F1APMsgHdlr
2711 * - Decodes received F1AP control message
2712 * - Prepares response message, encodes and sends to SCTP
2715 * @return ROK - success
2718 * ****************************************************************/
2719 void F1APMsgHdlr(Buffer *mBuf)
2725 F1AP_PDU_t *f1apMsg = NULLP;
2726 asn_dec_rval_t rval; /* Decoder return value */
2727 F1AP_PDU_t f1apasnmsg ;
2729 DU_LOG("\nF1AP : Received F1AP message buffer");
2730 ODU_PRINT_MSG(mBuf, 0,0);
2732 /* Copy mBuf into char array to decode it */
2733 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
2734 CU_ALLOC(recvBuf, (Size)recvBufLen);
2736 if(recvBuf == NULLP)
2738 DU_LOG("\nF1AP : Memory allocation failed");
2741 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
2743 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
2747 printf("\nF1AP : Received flat buffer to be decoded : ");
2748 for(i=0; i< recvBufLen; i++)
2750 printf("%x",recvBuf[i]);
2753 /* Decoding flat buffer into F1AP messsage */
2754 f1apMsg = &f1apasnmsg;
2755 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
2757 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
2758 CU_FREE(recvBuf, (Size)recvBufLen);
2760 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2762 DU_LOG("\nF1AP : ASN decode failed");
2766 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2768 switch(f1apMsg->present)
2770 case F1AP_PDU_PR_initiatingMessage:
2772 switch(f1apMsg->choice.initiatingMessage->value.present)
2774 case InitiatingMessage__value_PR_Reset:
2776 DU_LOG("\nF1AP : F1 reset request received ");
2777 BuildAndSendF1ResetAck();
2781 case InitiatingMessage__value_PR_F1SetupRequest:
2783 DU_LOG("\nF1AP : F1 setup request received");
2784 BuildAndSendF1SetupRsp();
2788 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
2790 DU_LOG("\nF1AP : GNB-DU config update received");
2791 BuildAndSendDUUpdateAck();
2792 DU_LOG("\nF1AP : Sending F1 reset request");
2793 BuildAndSendF1ResetReq();
2796 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
2798 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
2799 procInitULRRCMsg(f1apMsg);
2802 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
2804 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
2805 procUlRrcMsg(f1apMsg);
2809 case InitiatingMessage__value_PR_RRCDeliveryReport:
2811 DU_LOG("\nF1AP : Received RRC delivery report");
2816 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
2819 }/* End of switch(initiatingMessage) */
2823 case F1AP_PDU_PR_successfulOutcome:
2825 switch(f1apMsg->choice.successfulOutcome->value.present)
2827 case SuccessfulOutcome__value_PR_ResetAcknowledge:
2829 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
2832 }/* End of switch(successfulOutcome) */
2837 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
2840 }/* End of switch(f1apMsg->present) */
2842 } /* End of F1APMsgHdlr */
2844 /**********************************************************************
2846 **********************************************************************/