X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_f1ap_msg_hdl.c;h=75881f32e7dee444c2705a15392cf3056ad379c8;hb=3fb14013a5209cb17f3e2a5a3faf496b5e9cdd95;hp=99f5c4225c701e0d02205b60eec225d53325f0b1;hpb=088bb8763eaf91c139ede025faf2fac7e57d25ed;p=o-du%2Fl2.git diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index 99f5c4225..75881f32e 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -70,26 +70,26 @@ S16 SendF1APMsg(Region region, Pool pool) DU_LOG("\nF1AP : Failed to allocate memory"); return RFAILED; } - + return ROK; } /* SendF1APMsg */ /******************************************************************* -* -* @brief Builds NRCell ID -* -* @details -* -* Function : BuildNrCellId -* -* Functionality: Building the NR Cell ID -* -* @params[in] BIT_STRING_t *nrcell -* @return ROK - success -* RFAILED - failure -* -* ****************************************************************/ - + * + * @brief Builds NRCell ID + * + * @details + * + * Function : BuildNrCellId + * + * Functionality: Building the NR Cell ID + * + * @params[in] BIT_STRING_t *nrcell + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + S16 BuildNrCellId(BIT_STRING_t *nrcell) { U8 tmp; @@ -123,15 +123,15 @@ S16 BuildNrCellId(BIT_STRING_t *nrcell) * ****************************************************************/ S16 BuildAndSendF1SetupRsp() { - U8 idx,idy; + U8 idx,ieIdx; U8 elementCnt,cellCnt; F1AP_PDU_t *f1apMsg = NULL; F1SetupResponse_t *f1SetupRsp; GNB_CU_Name_t *cuName; Cells_to_be_Activated_List_t *cellToActivate; - RRC_Version_t *rrcVer; - asn_enc_rval_t encRetVal; - DU_LOG("\nF1AP : Building F1 Setup Response\n"); + RRC_Version_t *rrcVer; + asn_enc_rval_t encRetVal; + DU_LOG("\nF1AP : Building F1 Setup Response\n"); /* Allocate the memory for F1SetupRequest_t */ CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); @@ -153,7 +153,7 @@ S16 BuildAndSendF1SetupRsp() f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup; f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; f1apMsg->choice.successfulOutcome->value.present = \ - SuccessfulOutcome__value_PR_F1SetupResponse; + SuccessfulOutcome__value_PR_F1SetupResponse; f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse; elementCnt = 4; @@ -161,7 +161,7 @@ S16 BuildAndSendF1SetupRsp() f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *); CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); if(f1SetupRsp->protocolIEs.list.array == NULLP) { DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed"); @@ -173,15 +173,15 @@ S16 BuildAndSendF1SetupRsp() for(idx=0; idxprotocolIEs.list.array[idx], \ - sizeof(F1SetupResponseIEs_t)); + sizeof(F1SetupResponseIEs_t)); if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP) { - CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); - CU_FREE(f1apMsg->choice.successfulOutcome, \ - sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); - return RFAILED; + CU_FREE(f1SetupRsp->protocolIEs.list.array,\ + elementCnt * sizeof(F1SetupResponseIEs_t *)); + CU_FREE(f1apMsg->choice.successfulOutcome, \ + sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + return RFAILED; } } @@ -190,153 +190,152 @@ S16 BuildAndSendF1SetupRsp() f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID; f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; f1SetupRsp->protocolIEs.list.array[idx]->value.present = \ - F1SetupResponseIEs__value_PR_TransactionID; + F1SetupResponseIEs__value_PR_TransactionID; f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\ - TRANS_ID; + TRANS_ID; /*CU Name*/ idx++; f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name; f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore; f1SetupRsp->protocolIEs.list.array[idx]->value.present = \ - F1SetupResponseIEs__value_PR_GNB_CU_Name; + F1SetupResponseIEs__value_PR_GNB_CU_Name; cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name; cuName->size = sizeof(cuCfgParams.cuName); CU_ALLOC(cuName->buf, sizeof(cuName->size)); if(cuName->buf == NULLP) + { + for(ieIdx=0; ieIdxprotocolIEs.list.array[idy],\ - sizeof(F1SetupResponseIEs_t)); - } - CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); - CU_FREE(f1apMsg->choice.successfulOutcome,\ - sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); - return RFAILED; + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\ + sizeof(F1SetupResponseIEs_t)); } + CU_FREE(f1SetupRsp->protocolIEs.list.array,\ + elementCnt * sizeof(F1SetupResponseIEs_t *)); + CU_FREE(f1apMsg->choice.successfulOutcome,\ + sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + return RFAILED; + } strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName); - + /*Cells to be activated list*/ idx++; f1SetupRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_Cells_to_be_Activated_List ; + ProtocolIE_ID_id_Cells_to_be_Activated_List ; f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; f1SetupRsp->protocolIEs.list.array[idx]->value.present = \ - F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List; + F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List; cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\ - Cells_to_be_Activated_List; + Cells_to_be_Activated_List; cellCnt=1; cellToActivate->list.count = cellCnt; cellToActivate->list.size = \ - cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *); + cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *); CU_ALLOC(cellToActivate->list.array,\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); + sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); if(cellToActivate->list.array == NULLP) { CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy],\ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } - for(idy=0; idylist.array[idy],\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs )); - if(cellToActivate->list.array[idy] == NULLP) + CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs )); + if(cellToActivate->list.array[ieIdx] == NULLP) { - CU_FREE(cellToActivate->list.array,\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); - CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); - } - CU_FREE(f1SetupRsp->protocolIEs.list.array, \ - elementCnt * sizeof(F1SetupResponseIEs_t *)); - CU_FREE(f1apMsg->choice.successfulOutcome, \ - sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); - return RFAILED; + CU_FREE(cellToActivate->list.array,\ + sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); + CU_FREE(cuName->buf, sizeof(cuName->size)); + for(ieIdx=0; ieIdxprotocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); + } + CU_FREE(f1SetupRsp->protocolIEs.list.array, \ + elementCnt * sizeof(F1SetupResponseIEs_t *)); + CU_FREE(f1apMsg->choice.successfulOutcome, \ + sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + return RFAILED; } } cellToActivate->list.array[0]->id = \ - ProtocolIE_ID_id_Cells_to_be_Activated_List_Item; + ProtocolIE_ID_id_Cells_to_be_Activated_List_Item; cellToActivate->list.array[0]->criticality = Criticality_ignore; cellToActivate->list.array[0]->value.present = \ - Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item; + Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item; cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\ nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t); CU_ALLOC(cellToActivate->list.array[0]->\ - value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\ - 3*sizeof(uint8_t)); + value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\ + 3*sizeof(uint8_t)); if(cellToActivate->list.array[0]->value.choice.\ - Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP) + Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP) { - for(idy=0; idylist.array[idy],\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs )); + CU_FREE(cellToActivate->list.array[ieIdx],\ + sizeof(struct Cells_to_be_Activated_List_ItemIEs )); } CU_FREE(cellToActivate->list.array,\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); + sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array, \ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, \ - sizeof(SuccessfulOutcome_t)); + sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } - buildPlmnId(cuCfgParams.plmn , &cellToActivate->list.array[0]->value.choice.\ - Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity); + buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\ + Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf); cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\ nRCGI.nRCellIdentity.size = 5; CU_ALLOC(cellToActivate->list.array[0]->value.choice.\ - Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\ - 5*sizeof(uint8_t)); + Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\ + 5*sizeof(uint8_t)); if(cellToActivate->list.array[0]->value.choice.\ - Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP) + Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP) { CU_FREE(cellToActivate->list.array[0]->\ - value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\ - 3*sizeof(uint8_t)); - for(idy=0; idylist.array[idy],\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs )); + CU_FREE(cellToActivate->list.array[ieIdx],\ + sizeof(struct Cells_to_be_Activated_List_ItemIEs )); } CU_FREE(cellToActivate->list.array,\ - sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); + sizeof(struct Cells_to_be_Activated_List_ItemIEs *)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array, \ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, \ - sizeof(SuccessfulOutcome_t)); + sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } @@ -344,10 +343,10 @@ S16 BuildAndSendF1SetupRsp() /* RRC Version */ idx++; f1SetupRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_GNB_CU_RRC_Version; + ProtocolIE_ID_id_GNB_CU_RRC_Version; f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; f1SetupRsp->protocolIEs.list.array[idx]->value.present = \ - F1SetupResponseIEs__value_PR_RRC_Version; + F1SetupResponseIEs__value_PR_RRC_Version; rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version; rrcVer->latest_RRC_Version.size = RRC_SIZE; @@ -355,19 +354,19 @@ S16 BuildAndSendF1SetupRsp() if(rrcVer->latest_RRC_Version.buf == NULLP) { CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } - /* Need to check RRC Version */ + /* Need to check RRC Version */ rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer; rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t)); @@ -375,13 +374,13 @@ S16 BuildAndSendF1SetupRsp() { CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; @@ -389,73 +388,73 @@ S16 BuildAndSendF1SetupRsp() rrcVer->iE_Extensions->list.count = 1; rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *); CU_ALLOC(rrcVer->iE_Extensions->list.array,\ - sizeof(struct RRC_Version_ExtIEs *)); + sizeof(struct RRC_Version_ExtIEs *)); if(rrcVer->iE_Extensions->list.array == NULLP) { CU_FREE(rrcVer->iE_Extensions,\ - sizeof(ProtocolExtensionContainer_4624P81_t)); + sizeof(ProtocolExtensionContainer_4624P81_t)); CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\ - sizeof(struct RRC_Version_ExtIEs)); + sizeof(struct RRC_Version_ExtIEs)); if(rrcVer->iE_Extensions->list.array[0] == NULLP) { CU_FREE(rrcVer->iE_Extensions->list.array,\ - sizeof(struct RRC_Version_ExtIEs *)); + sizeof(struct RRC_Version_ExtIEs *)); CU_FREE(rrcVer->iE_Extensions,\ - sizeof(ProtocolExtensionContainer_4624P81_t)); + sizeof(ProtocolExtensionContainer_4624P81_t)); CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; } rrcVer->iE_Extensions->list.array[0]->id = \ - ProtocolIE_ID_id_latest_RRC_Version_Enhanced; + ProtocolIE_ID_id_latest_RRC_Version_Enhanced; rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject; rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \ - RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced; + RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced; rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\ Latest_RRC_Version_Enhanced.size = 3*sizeof(U8); CU_ALLOC(rrcVer->iE_Extensions->list.\ - array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\ - 3*sizeof(U8)); + array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\ + 3*sizeof(U8)); if(rrcVer->iE_Extensions->list.\ - array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP) + array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP) { CU_FREE(rrcVer->iE_Extensions->list.array[0],\ - sizeof(struct RRC_Version_ExtIEs)); + sizeof(struct RRC_Version_ExtIEs)); CU_FREE(rrcVer->iE_Extensions->list.array,\ - sizeof(struct RRC_Version_ExtIEs *)); + sizeof(struct RRC_Version_ExtIEs *)); CU_FREE(rrcVer->iE_Extensions,\ - sizeof(ProtocolExtensionContainer_4624P81_t)); + sizeof(ProtocolExtensionContainer_4624P81_t)); CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8)); CU_FREE(cuName->buf, sizeof(cuName->size)); - for(idy=0; idyprotocolIEs.list.array[idy], \ - sizeof(F1SetupResponseIEs_t)); + CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \ + sizeof(F1SetupResponseIEs_t)); } CU_FREE(f1SetupRsp->protocolIEs.list.array,\ - elementCnt * sizeof(F1SetupResponseIEs_t *)); + elementCnt * sizeof(F1SetupResponseIEs_t *)); CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); return RFAILED; @@ -470,7 +469,7 @@ S16 BuildAndSendF1SetupRsp() xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); /* Encode the F1SetupRequest type as UPER */ - cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); + memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf); @@ -488,24 +487,24 @@ S16 BuildAndSendF1SetupRsp() /* Check encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - return RFAILED; + DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + return RFAILED; } else { - DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } + DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } } /* Sending msg */ if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK) { - DU_LOG("\nF1AP : Sending F1 Setup Response failed"); - return RFAILED; + DU_LOG("\nF1AP : Sending F1 Setup Response failed"); + return RFAILED; } return ROK; @@ -582,10 +581,10 @@ S16 BuildAndSendDUUpdateAck() CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t)); if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP) { - CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *)); - CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); - return RFAILED; + CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *)); + CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + return RFAILED; } } @@ -597,9 +596,9 @@ S16 BuildAndSendDUUpdateAck() gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID; xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); - + /* Encode the F1SetupRequest type as UPER */ - cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); + memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf); @@ -620,10 +619,10 @@ S16 BuildAndSendDUUpdateAck() } else { - DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n"); + DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n"); for(int i=0; i< encBufSize; i++) { - printf("%x",encBuf[i]); + printf("%x",encBuf[i]); } } @@ -637,6 +636,173 @@ S16 BuildAndSendDUUpdateAck() return ROK; }/* End of BuildAndSendDUUpdateAck*/ +/******************************************************************* +* +* @brief deallocating the memory of F1reset msg +* +* @details +* +* Function : FreeF1ResetReq +* +* Functionality : +* - freeing memory of F1reset request msg +* +* @params[in] +* @return void +* +* +* ****************************************************************/ +void FreeF1ResetReq(F1AP_PDU_t *f1apMsg) +{ + uint8_t idx = 0; + Reset_t *f1ResetMsg = NULLP; + + if(f1apMsg) + { + if(f1apMsg->choice.initiatingMessage) + { + f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset; + if(f1ResetMsg->protocolIEs.list.array) + { + for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++) + { + if(f1ResetMsg->protocolIEs.list.array[idx]) + { + CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t)); + } + } + CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size); + } + CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); + } + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + } +} +/******************************************************************* +* +* @brief build ansld ans send f1reset msg +* +* @details +* +* Function : BuildAndSendF1ResetReq +* +* Functionality: build and send f1reset msg +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t BuildAndSendF1ResetReq() +{ + uint8_t elementCnt=0; + uint8_t idx=0; + uint8_t ret= RFAILED; + Reset_t *f1ResetMsg = NULLP; + F1AP_PDU_t *f1apMsg = NULLP; + asn_enc_rval_t encRetVal; + DU_LOG("\nF1AP : Building F1 Reset request \n"); + do + { + CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); + if(f1apMsg == NULLP) + { + DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed"); + break; + } + f1apMsg->present = F1AP_PDU_PR_initiatingMessage; + CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); + if(f1apMsg->choice.initiatingMessage == NULLP) + { + DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed"); + break; + } + f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset; + f1apMsg->choice.initiatingMessage->criticality = Criticality_reject; + f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset; + + f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset; + + elementCnt = 3; + f1ResetMsg->protocolIEs.list.count = elementCnt; + f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *); + + /* Initialize the F1Reset members */ + CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size); + if(f1ResetMsg->protocolIEs.list.array == NULLP) + { + DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq"); + break; + } + for(idx=0; idxprotocolIEs.list.array[idx],sizeof(ResetIEs_t)); + if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP) + { + DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array"); + break; + } + } + + /*TransactionID*/ + idx=0; + f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID; + f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; + f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID; + f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1; + + /*Cause*/ + idx++; + f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause; + f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore; + f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause; + f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork; + f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons; + + /*Reset Type*/ + idx++; + f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType; + f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; + f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType; + f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface; + f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all; + + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); + + /* Encode the F1SetupRequest type as APER */ + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ + encBuf); + + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; + } + else + { + DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n"); + for(idx=0; idx< encBufSize; idx++) + { + printf("%x",encBuf[idx]); + } + } + + if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK) + { + DU_LOG("\nF1AP : Sending F1 Reset request failed"); + break; + } + + ret = ROK; + break; + }while(true); + + FreeF1ResetReq(f1apMsg); + return ret; + } /******************************************************************* * @@ -644,7 +810,7 @@ S16 BuildAndSendDUUpdateAck() * * @details * - * Function : fillRadioBearerConfig + * Function : fillSrbCfg * * Functionality: Fills Radio Bearer Config * @@ -654,11 +820,10 @@ S16 BuildAndSendDUUpdateAck() * RFAILED - failure * * ****************************************************************/ -uint8_t fillRadioBearerConfig(SRB_ToAddModList_t *bearerCfg) +uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg) { uint8_t elementCnt; - uint8_t idx; - uint8_t ied; + uint8_t idx, ieId; if(bearerCfg != NULLP) { elementCnt = 1; @@ -673,21 +838,21 @@ uint8_t fillRadioBearerConfig(SRB_ToAddModList_t *bearerCfg) CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t)); if(bearerCfg->list.array[idx] == NULLP) { - for(ied = 0; ied < idx; ied++) + for(ieId = 0; ieId < idx; ieId++) { - CU_FREE(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t)); + CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t)); } CU_FREE(bearerCfg->list.array, bearerCfg->list.size); return RFAILED; } } } - else - { - return RFAILED; - } + else + { + return RFAILED; + } idx = 0; - bearerCfg->list.array[idx]->srb_Identity = SRB1; + bearerCfg->list.array[idx]->srb_Identity = srbId; } return ROK; } @@ -713,23 +878,23 @@ uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup) { uint8_t ret = ROK; masterCellGroup->buf = NULLP; - if(f1apMsgDb.duToCuContainer.buf) - { + if(f1apMsgDb.duToCuContainer.buf) + { masterCellGroup->size = f1apMsgDb.duToCuContainer.size; CU_ALLOC(masterCellGroup->buf, masterCellGroup->size); if(masterCellGroup->buf != NULLP) { - memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\ - masterCellGroup->size); + memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\ + masterCellGroup->size); } - else - { - ret = RFAILED; - } - } - else - { - ret = RFAILED; + else + { + ret = RFAILED; + } + } + else + { + ret = RFAILED; } return ret; } @@ -757,22 +922,448 @@ uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE) if(rrcSetupIE) { CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t)); - if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP) - { - ret = fillRadioBearerConfig(rrcSetupIE->radioBearerConfig.srb_ToAddModList); - } - if(!ret) + if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP) + { + ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList); + } + if(ret == ROK) + { + ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup); + } + else + { + CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t)); + ret = RFAILED; + } + } + return ret; +} +/******************************************************************* + * + * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer + * + * @details + * + * Function : fillDlCcchRrcMsg + * + * Functionality: Fills DL DCCCH Message required for + * DLRRCMessageTransfer + * + * @params[in] RRCContainer_t *rrcContainer + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer) +{ + uint8_t ret = ROK; + uint16_t idx2; + DL_CCCH_Message_t dl_CCCH_Msg; + asn_enc_rval_t encRetVal; + + if(rrcContainer != NULLP) + { + dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1; + + CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t)); + if(dl_CCCH_Msg.message.choice.c1 != NULLP) + { + dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup; + CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t)); + if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP) + { + dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0; + dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\ + present = RRCSetup__criticalExtensions_PR_rrcSetup; + /* Fill RRC Setup IE */ + CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ + criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t)); + if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ + criticalExtensions.choice.rrcSetup != NULLP) + { + ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ + criticalExtensions.choice.rrcSetup); + + if(ret == ROK) + { + /* encode DL-CCCH message into RRC Container */ + xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg); + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf); + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + return RFAILED; + } + else + { + DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n"); + for(int i = 0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } + rrcContainer->size = encBufSize; + CU_ALLOC(rrcContainer->buf, rrcContainer->size); + if(rrcContainer->buf != NULLP) + { + memset(rrcContainer->buf, 0, encBufSize); + for(idx2 = 0; idx2 < encBufSize; idx2++) + { + rrcContainer->buf[idx2] = encBuf[idx2]; + } + } + } + } + else + { + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: RRC Container is NULLP at fillDlCcchRrcMsg()"); + ret = RFAILED; + } +} + +uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow) +{ + uint8_t idx, ied, elementCnt; + + elementCnt = 1; + qosFlow->list.count = elementCnt; + qosFlow->list.size = elementCnt * sizeof(QFI_t *); + CU_ALLOC(qosFlow->list.array, qosFlow->list.size); + if(qosFlow->list.array != NULLP) + { + for(idx = 0; idx < elementCnt; idx++) + { + CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t)); + if(qosFlow->list.array[idx] == NULLP) + { + for(ied = 0; ied < idx; ied++) + { + CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t)); + } + CU_FREE(qosFlow->list.array, qosFlow->list.size); + return RFAILED; + } + } + } + idx = 0; + *qosFlow->list.array[idx] = 9; + return ROK; +} + +/******************************************************************* + * + * @brief Fills CN Assoc for Drb to Add/Mod List + * + * @details + * + * Function : fillCnAssoc + * + * Functionality: Fills CN Assoc for Drb to Add/Mod List + * + * @params[in] struct DRB_ToAddMod__cnAssociation * + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc) +{ + uint8_t ret = ROK; + + cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config; + if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity) + { + cnAssoc->choice.eps_BearerIdentity = 5; + } + if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config) + { + CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t)); + if(cnAssoc->choice.sdap_Config) + { + cnAssoc->choice.sdap_Config->pdu_Session = 5; + cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0; + cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0; + cnAssoc->choice.sdap_Config->defaultDRB = true; + cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP; + cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP; + CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \ + sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd)); + if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd) + { + ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd); + } + else + { + DU_LOG("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()"); + CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t)); + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: Mem alloc failed at fillCnAssoc()"); + ret = RFAILED; + } + } + return ret; +} + +/******************************************************************* + * + * @brief Fills Radio Bearer Config for Drb + * + * @details + * + * Function : fillDrbCfg + * + * Functionality: Fills Radio Bearer Config for Drb + * + * @params[in] drbId, DRB_ToAddModList * + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg) +{ + uint8_t idx, ied, ret, elementCnt; + + ret = ROK; + if(drbCfg != NULLP) + { + elementCnt = 1; + drbCfg->list.count = elementCnt; + drbCfg->list.size =\ + elementCnt * sizeof(DRB_ToAddMod_t *); + CU_ALLOC(drbCfg->list.array, drbCfg->list.size); + if(drbCfg->list.array != NULLP) + { + for(idx = 0; idx < elementCnt; idx++) + { + CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t)); + if(drbCfg->list.array[idx] == NULLP) + { + for(ied = 0; ied < idx; ied++) + { + CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t)); + } + CU_FREE(drbCfg->list.array, drbCfg->list.size); + return RFAILED; + } + } + } + else + { + return RFAILED; + } + idx = 0; + /* CN ASSOCIATION */ + CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation)); + if(drbCfg->list.array[idx]->cnAssociation) + { + ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation); + } + /* DRB */ + drbCfg->list.array[idx]->drb_Identity = drbId; + } + return ret; +} + +/******************************************************************* + * + * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer + * + * @details + * + * Function : fillRrcReconfigIE + * + * Functionality: Fills RRC Reconfig Message required for + * DLRRCMessageTransfer + * + * @params[in] RRCReconfiguration_IEs_t* rrcReconfig + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg) +{ + uint8_t ret = ROK; + CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t)); + if(rrcReconfigMsg->radioBearerConfig) + { + CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t)); + if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP) + { + ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList); + + } + if(ret == ROK) + { + CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t)); + if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP) + { + ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList); + if(ret == RFAILED) + { + DU_LOG("\n F1AP: Failed to fill DrbCfg at fillRrcReconfigIE()"); + CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t)); + CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t)); + } + } + } + else + { + DU_LOG("\n F1AP: memory Alloc failed at fillRrcReconfigIE()"); + CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t)); + } + } + + return ret; +} +/******************************************************************* + * + * @brief Fills DL DCCH Message required for DLRRCMessageTransfer + * + * @details + * + * Function : fillDlDcchRrcMsg + * + * Functionality: Fills DL DCCH Message required for + * DLRRCMessageTransfer + * + * @params[in] RRCContainer_t *rrcContainer + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer) +{ + uint8_t ret = ROK; + uint16_t idx2; + DL_DCCH_Message_t dl_DCCH_Msg; + memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t)); + asn_enc_rval_t encRetVal; + + if(rrcContainer != NULLP) + { + dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1; + + CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t)); + if(dl_DCCH_Msg.message.choice.c1 != NULLP) + { + dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration; + CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t)); + if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP) + { + dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0; + dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\ + present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration; + /* Fill RRC Reconfig IE */ + CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\ + criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t)); + if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\ + criticalExtensions.choice.rrcReconfiguration != NULLP) + { + ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\ + criticalExtensions.choice.rrcReconfiguration); + + if(ret == ROK) + { + /* encode DL-DCCH message into RRC Container */ + xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg); + cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf); + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + return RFAILED; + } + else + { + DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n"); + for(int i = 0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } + rrcContainer->size = encBufSize; + CU_ALLOC(rrcContainer->buf, rrcContainer->size); + if(rrcContainer->buf != NULLP) + { + memset(rrcContainer->buf, 0, encBufSize); + for(idx2 = 0; idx2 < encBufSize; idx2++) + { + rrcContainer->buf[idx2] = encBuf[idx2]; + } + } + } + } + else + { + DU_LOG("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()"); + } + } + else + { + DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()"); + ret = RFAILED; + } + } + else { - ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup); + DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()"); + ret = RFAILED; } - else - { - CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t)); - ret = RFAILED; - } + } + else + { + DU_LOG("\nF1AP: RRC Container is NULLP at fillDlDcchRrcMsg()"); + ret = RFAILED; } return ret; } + /******************************************************************* * * @brief Builds RRC Container IE required for DLRRCMessageTransfer @@ -791,97 +1382,22 @@ uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE) * * ****************************************************************/ -uint8_t BuildDLRRCContainer(RRCContainer_t *rrcContainer) +uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer) { uint8_t ret = ROK; - uint16_t idx2; - DL_CCCH_Message_t dl_CCCH_Msg; - asn_enc_rval_t encRetVal; - if(rrcContainer != NULLP) + if(rrcMsgType == RRC_SETUP) + { + ret = fillDlCcchRrcMsg(rrcContainer); + if(ret == RFAILED) + DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at BuildDLRRCContainer()"); + } + else if(rrcMsgType == RRC_RECONFIG) { - dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1; - - CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t)); - if(dl_CCCH_Msg.message.choice.c1 != NULLP) - { - dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup; - CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t)); - if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP) - { - dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0; - dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\ - present = RRCSetup__criticalExtensions_PR_rrcSetup; - /* Fill RRC Setup IE */ - CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ - criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t)); - if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ - criticalExtensions.choice.rrcSetup != NULLP) - { - ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\ - criticalExtensions.choice.rrcSetup); - - if(!ret) - { - /* encode DL-CCCH message into RRC Container */ - xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg); - cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); - encBufSize = 0; - encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf); - /* Encode results */ - if(encRetVal.encoded == ENCODE_FAIL) - { - DU_LOG( "\n F1AP : Could not encode RRCContainer (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - return RFAILED; - } - else - { - DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer\n"); - for(int i = 0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } - rrcContainer->size = encBufSize; - CU_ALLOC(rrcContainer->buf, rrcContainer->size); - if(rrcContainer->buf != NULLP) - { - memset(rrcContainer->buf, 0, encBufSize); - for(idx2 = 0; idx2 < encBufSize; idx2++) - { - rrcContainer->buf[idx2] = encBuf[idx2]; - } - } - } - } - else - { - ret = RFAILED; - } - } - else - { - DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg"); - ret = RFAILED; - } - } - else - { - DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg"); - ret = RFAILED; - } - } - else - { - DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice"); - ret = RFAILED; - } + ret = fillDlDcchRrcMsg(rrcContainer); + if(ret == RFAILED) + DU_LOG("\n F1AP: Failed at fill DL-DCCH Msg at BuildDLRRCContainer()"); } - else - { - DU_LOG("\nF1AP: Memory Alloc failed for DlCcch Msg"); - ret = RFAILED; - } return ret; } @@ -902,7 +1418,7 @@ uint8_t BuildDLRRCContainer(RRCContainer_t *rrcContainer) * RFAILED - failure * * ****************************************************************/ -S16 BuildAndSendDLRRCMessageTransfer() +uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t rrcMsgType) { uint8_t elementCnt = 0; uint8_t ieId; @@ -922,7 +1438,7 @@ S16 BuildAndSendDLRRCMessageTransfer() f1apMsg->present = F1AP_PDU_PR_initiatingMessage; CU_ALLOC(f1apMsg->choice.initiatingMessage, - sizeof(InitiatingMessage_t)); + sizeof(InitiatingMessage_t)); if(f1apMsg->choice.initiatingMessage == NULLP) { DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed"); @@ -954,17 +1470,17 @@ S16 BuildAndSendDLRRCMessageTransfer() CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t)); if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP) { - for(ieId=0; ieIdprotocolIEs.list.array[ieId],\ - sizeof(DLRRCMessageTransferIEs_t)); - } - CU_FREE(dlRRCMsg->protocolIEs.list.array,\ - dlRRCMsg->protocolIEs.list.size); - CU_FREE(f1apMsg->choice.initiatingMessage,\ - sizeof(InitiatingMessage_t)); - CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); - return RFAILED; + for(ieId=0; ieIdprotocolIEs.list.array[ieId],\ + sizeof(DLRRCMessageTransferIEs_t)); + } + CU_FREE(dlRRCMsg->protocolIEs.list.array,\ + dlRRCMsg->protocolIEs.list.size); + CU_FREE(f1apMsg->choice.initiatingMessage,\ + sizeof(InitiatingMessage_t)); + CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); + return RFAILED; } } @@ -973,64 +1489,64 @@ S16 BuildAndSendDLRRCMessageTransfer() dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; dlRRCMsg->protocolIEs.list.array[idx]->value.present = \ - DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID; + DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID; dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID; - + /* GNB DU UE F1AP ID */ idx++; dlRRCMsg->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; + ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; dlRRCMsg->protocolIEs.list.array[idx]->value.present = \ - DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID; + DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID; dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID; - + /* SRBID */ idx++; dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID; dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; dlRRCMsg->protocolIEs.list.array[idx]->value.present = \ - DLRRCMessageTransferIEs__value_PR_SRBID; + DLRRCMessageTransferIEs__value_PR_SRBID; dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB1; - + /* RRCContainer */ idx++; dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer; dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject; dlRRCMsg->protocolIEs.list.array[idx]->value.present = \ - DLRRCMessageTransferIEs__value_PR_RRCContainer; - BuildDLRRCContainer(&dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer); - + DLRRCMessageTransferIEs__value_PR_RRCContainer; + BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer); + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); - + /* Encode the F1SetupRequest type as APER */ - cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); + memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ - encBuf); + encBuf); /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - return RFAILED; + DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + return RFAILED; } else { - DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } + DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } } - + /* Sending msg */ if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK) { - DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed"); - return RFAILED; + DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed"); + return RFAILED; } - + return ROK; }/* End of BuildAndSendDLRRCMessageTransfer */ @@ -1053,136 +1569,191 @@ S16 BuildAndSendDLRRCMessageTransfer() * ****************************************************************/ S16 BuildAndSendUESetRsp() { - S16 ret; - U8 elementCnt; - U8 cellCnt; - U8 ieId; - U8 idx; - U8 drbCnt; - U8 drbId; - F1AP_PDU_t *f1apMsg = NULL; + S16 ret; + U8 elementCnt; + U8 cellCnt; + U8 ieId; + U8 idx; + U8 drbCnt; + U8 drbId; + F1AP_PDU_t *f1apMsg = NULL; UEContextSetupResponse_t *ueSetRsp; - asn_enc_rval_t encRetVal; /* Encoder return value */ - - DU_LOG("\n F1AP : Building UE Context Setup Response\n"); - - CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); - if(f1apMsg == NULLP) - { - DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed"); - return RFAILED; - } - - f1apMsg->present = F1AP_PDU_PR_successfulOutcome; - CU_ALLOC(f1apMsg->choice.successfulOutcome, - sizeof(SuccessfulOutcome_t)); - if(f1apMsg->choice.successfulOutcome == NULLP) - { - DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed"); - CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); - return RFAILED; - } - - f1apMsg->choice.successfulOutcome->procedureCode = \ - ProcedureCode_id_UEContextSetup; - f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; - f1apMsg->choice.successfulOutcome->value.present = \ - SuccessfulOutcome__value_PR_UEContextSetupResponse; - ueSetRsp = - &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; - elementCnt = 2; - ueSetRsp->protocolIEs.list.count = elementCnt; - ueSetRsp->protocolIEs.list.size = \ - elementCnt * sizeof(UEContextSetupResponse_t *); - - /* Initialize the UESetup members */ - CU_ALLOC(ueSetRsp->protocolIEs.list.array, \ - ueSetRsp->protocolIEs.list.size); - if(ueSetRsp->protocolIEs.list.array == NULLP) - { - DU_LOG(" F1AP : Memory allocation for UE Setup Response failed"); - CU_FREE(f1apMsg->choice.successfulOutcome, - sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t)); - return RFAILED; - } - - for(idx=0; idxprotocolIEs.list.array[idx],\ - sizeof(UEContextSetupResponseIEs_t)); - if(ueSetRsp->protocolIEs.list.array[idx] == NULLP) - { - for(ieId=0; ieIdprotocolIEs.list.array[ieId],\ - sizeof(UEContextSetupResponseIEs_t)); - } - CU_FREE(ueSetRsp->protocolIEs.list.array,\ - ueSetRsp->protocolIEs.list.size); - CU_FREE(f1apMsg->choice.successfulOutcome,\ - sizeof(SuccessfulOutcome_t)); - CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); - return RFAILED; - } - } - - idx = 0; - - /*GNB CU UE F1AP ID*/ - ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; - ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; - ueSetRsp->protocolIEs.list.array[idx]->value.present = \ - UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; - ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID; - - /*GNB DU UE F1AP ID*/ - idx++; - ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; - ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; - ueSetRsp->protocolIEs.list.array[idx]->value.present = \ - UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; - ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID; - - - xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); - - /* Encode the F1SetupRequest type as APER */ - cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN); - encBufSize = 0; - encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ - encBuf); - /* Encode results */ - if(encRetVal.encoded == ENCODE_FAIL) - { - DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - return RFAILED; - } - else - { - DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } - } + asn_enc_rval_t encRetVal; /* Encoder return value */ - /* Sending msg */ - if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK) - { - DU_LOG("\n F1AP : Sending UE Context Setup Request Failed"); - return RFAILED; - } + DU_LOG("\n F1AP : Building UE Context Setup Response\n"); - return ROK; + CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); + if(f1apMsg == NULLP) + { + DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed"); + return RFAILED; + } + + f1apMsg->present = F1AP_PDU_PR_successfulOutcome; + CU_ALLOC(f1apMsg->choice.successfulOutcome, + sizeof(SuccessfulOutcome_t)); + if(f1apMsg->choice.successfulOutcome == NULLP) + { + DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed"); + CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); + return RFAILED; + } + + f1apMsg->choice.successfulOutcome->procedureCode = \ + ProcedureCode_id_UEContextSetup; + f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; + f1apMsg->choice.successfulOutcome->value.present = \ + SuccessfulOutcome__value_PR_UEContextSetupResponse; + ueSetRsp = + &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; + elementCnt = 2; + ueSetRsp->protocolIEs.list.count = elementCnt; + ueSetRsp->protocolIEs.list.size = \ + elementCnt * sizeof(UEContextSetupResponse_t *); + + /* Initialize the UESetup members */ + CU_ALLOC(ueSetRsp->protocolIEs.list.array, \ + ueSetRsp->protocolIEs.list.size); + if(ueSetRsp->protocolIEs.list.array == NULLP) + { + DU_LOG(" F1AP : Memory allocation for UE Setup Response failed"); + CU_FREE(f1apMsg->choice.successfulOutcome, + sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t)); + return RFAILED; + } + + for(idx=0; idxprotocolIEs.list.array[idx],\ + sizeof(UEContextSetupResponseIEs_t)); + if(ueSetRsp->protocolIEs.list.array[idx] == NULLP) + { + for(ieId=0; ieIdprotocolIEs.list.array[ieId],\ + sizeof(UEContextSetupResponseIEs_t)); + } + CU_FREE(ueSetRsp->protocolIEs.list.array,\ + ueSetRsp->protocolIEs.list.size); + CU_FREE(f1apMsg->choice.successfulOutcome,\ + sizeof(SuccessfulOutcome_t)); + CU_FREE(f1apMsg,sizeof(F1AP_PDU_t)); + return RFAILED; + } + } + + idx = 0; + + /*GNB CU UE F1AP ID*/ + ueSetRsp->protocolIEs.list.array[idx]->id = \ + ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; + ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; + ueSetRsp->protocolIEs.list.array[idx]->value.present = \ + UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; + ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID; + + /*GNB DU UE F1AP ID*/ + idx++; + ueSetRsp->protocolIEs.list.array[idx]->id = \ + ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; + ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; + ueSetRsp->protocolIEs.list.array[idx]->value.present = \ + UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; + ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID; + + + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); + + /* Encode the F1SetupRequest type as APER */ + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ + encBuf); + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + return RFAILED; + } + else + { + DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } + } + + /* Sending msg */ + if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK) + { + DU_LOG("\n F1AP : Sending UE Context Setup Request Failed"); + return RFAILED; + } + + return ROK; }/* End of BuildAndSendUESetRsp */ +/******************************************************************* + * + * @brief Function to set the Dl RRC Msg Type + * + * @details + * + * Function : setDlRRCMsgType + * + * Functionality: Constructs the UE Setup Response and sends + * it to the DU through SCTP. + * + * @params[in] + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t setDlRRCMsgType() +{ + uint8_t rrcMsgType = 0; + switch(f1apMsgDb.dlRrcMsgCount) + { + case RRC_SETUP: + rrcMsgType = RRC_SETUP; + break; + case RRC_SECURITY_MODE_COMMAND: + rrcMsgType = RRC_SECURITY_MODE_COMMAND; + break; + case RRC_RECONFIG: + rrcMsgType = RRC_RECONFIG; + break; + default: + break; + } + return rrcMsgType; +} + +/******************************************************************* + * + * @brief Function to build Initial UL RRC Message + * + * @details + * + * Function : procInitULRRCMsg + * + * Functionality: Function to build Initial UL RRC Message + * + * @params[in] + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg) { - uint8_t idx; + uint8_t idx, rrcMsgType; uint8_t ret =ROK; InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP; DU_LOG("\n filling the required values in DB in procInitULRRCMsg"); @@ -1193,46 +1764,50 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg) { switch(initULRRCMsg->protocolIEs.list.array[idx]->id) { - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_NRCGI: - break; - case ProtocolIE_ID_id_C_RNTI: - break; - case ProtocolIE_ID_id_RRCContainer: - break; - case ProtocolIE_ID_id_DUtoCURRCContainer: - { - if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\ - .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\ - .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP)) - { - DU_LOG("\n Received Du to Cu RRC Container "); - f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\ - .list.array[idx]->value.choice.DUtoCURRCContainer.size; - CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \ - f1apMsgDb.duToCuContainer.size); - if(f1apMsgDb.duToCuContainer.buf != NULLP) - { - memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\ - .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\ - .duToCuContainer.size); - } - } - else - { - DU_LOG("\n Failed to receive Du to Cu RRC Container "); - ret = RFAILED; - } - break; - } - default: - DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id); - break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_NRCGI: + break; + case ProtocolIE_ID_id_C_RNTI: + break; + case ProtocolIE_ID_id_RRCContainer: + break; + case ProtocolIE_ID_id_DUtoCURRCContainer: + { + if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\ + .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\ + .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP)) + { + DU_LOG("\n Received Du to Cu RRC Container "); + f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\ + .list.array[idx]->value.choice.DUtoCURRCContainer.size; + CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \ + f1apMsgDb.duToCuContainer.size); + if(f1apMsgDb.duToCuContainer.buf != NULLP) + { + memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\ + .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\ + .duToCuContainer.size); + } + } + else + { + DU_LOG("\n Failed to receive Du to Cu RRC Container "); + ret = RFAILED; + } + break; + } + default: + DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id); + break; } } - if(!ret) - ret = BuildAndSendDLRRCMessageTransfer(); + if(ret == ROK) + { + f1apMsgDb.dlRrcMsgCount++; + rrcMsgType = setDlRRCMsgType(); + ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType); + } return ret; } @@ -1264,7 +1839,7 @@ uint8_t BuildNrcgi(NRCGI_t *nrcgi) { return RFAILED; } - ret = buildPlmnId(cuCfgParams.plmn , &nrcgi->pLMN_Identity); + ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf); if(ret != ROK) { @@ -2115,7 +2690,7 @@ uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \ memset(&encRetVal, 0, sizeof(asn_enc_rval_t)); uint8_t ret= RFAILED; uint8_t ret1; - while(1) + while(true) { DU_LOG("\n F1AP : Building UE Context Setup Request\n"); @@ -2293,7 +2868,7 @@ uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); /* Encode the F1SetupRequest type as APER */ - cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN); + memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ encBuf); @@ -2329,13 +2904,13 @@ uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg) { - uint8_t idx; - uint8_t ret =ROK; + uint8_t idx, ret, srbId, rrcMsgType; uint8_t cuUeF1apId, duUeF1apId; - uint8_t *rrcContainer; + uint8_t *rrcContainer = NULLP; uint16_t rrcContLen; ULRRCMessageTransfer_t *ulRrcMsg = NULLP; + ret = ROK; ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer; for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++) @@ -2353,6 +2928,7 @@ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg) break; } case ProtocolIE_ID_id_SRBID: + srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID; break; case ProtocolIE_ID_id_RRCContainer: { @@ -2373,10 +2949,178 @@ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg) break; } } - if(!ret) - ret = BuildAndSendUESetReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer); + if(srbId == 1) + { + f1apMsgDb.dlRrcMsgCount++; + rrcMsgType = setDlRRCMsgType(); + if(rrcMsgType == RRC_SECURITY_MODE_COMMAND) + { + ret = BuildAndSendUESetReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer); + } + if(rrcMsgType == RRC_RECONFIG) + { + ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType); + } + } return ret; } + +/**************************************************************** + * @brief Build And Send F1ResetAck + * + * @details + * + * Function : FreeF1ResetAck + * + * Functionality: + * - Build And Send F1ResetRSP + * + * @params[in] + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void FreeF1ResetAck(F1AP_PDU_t *f1apMsg) +{ + uint8_t idx; + ResetAcknowledge_t *f1ResetAck; + + if(f1apMsg) + { + if(f1apMsg->choice.successfulOutcome) + { + f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge; + + if(f1ResetAck->protocolIEs.list.array) + { + for(idx=0; idxprotocolIEs.list.count ; idx++) + { + if(f1ResetAck->protocolIEs.list.array[idx]) + { + CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t)); + } + } + CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size ); + } + CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + } + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + } +} + +/**************************************************************** +* @brief Build And Send F1ResetAck +* +* @details +* +* Function : BuildAndSendF1ResetAck +* +* Functionality: +* - Build And Send F1ResetRSP +* +* @params[in] +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t BuildAndSendF1ResetAck() +{ + uint8_t idx = 0; + uint8_t elementCnt = 0; + uint8_t ret = RFAILED; + F1AP_PDU_t *f1apMsg = NULL; + ResetAcknowledge_t *f1ResetAck = NULLP; + asn_enc_rval_t encRetVal; + DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n"); + + do{ + /* Allocate the memory for F1ResetRequest_t */ + CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); + if(f1apMsg == NULLP) + { + DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed"); + break; + } + + f1apMsg->present = F1AP_PDU_PR_successfulOutcome; + + CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + if(f1apMsg->choice.successfulOutcome == NULLP) + { + DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed"); + break; + } + + f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset; + f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; + f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge; + f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge; + + elementCnt = 1; + + f1ResetAck->protocolIEs.list.count = elementCnt; + f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *); + + CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size ); + if(f1ResetAck->protocolIEs.list.array == NULLP) + { + DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed"); + break; + } + + for(idx=0; idxprotocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t)); + if(f1ResetAck->protocolIEs.list.array[idx] == NULLP) + { + break; + } + } + /*TransactionID*/ + idx = 0; + f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID; + f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject; + f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID; + f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID; + + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); + + /* Encode the F1SetupRequest type as UPER */ + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf); + + /* Check encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; + } + else + { + DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } + } + /* Sending msg */ + if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK) + { + DU_LOG("\nF1AP : Sending F1 Reset Response failed"); + break; + } + + ret = ROK; + break; + }while(true); + + FreeF1ResetAck(f1apMsg); + return ret; +} + /******************************************************************* * * @brief Handles received F1AP message and sends back response @@ -2403,12 +3147,12 @@ void F1APMsgHdlr(Buffer *mBuf) F1AP_PDU_t *f1apMsg = NULLP; asn_dec_rval_t rval; /* Decoder return value */ F1AP_PDU_t f1apasnmsg ; - + DU_LOG("\nF1AP : Received F1AP message buffer"); ODU_PRINT_MSG(mBuf, 0,0); - + /* Copy mBuf into char array to decode it */ - ODU_FIND_MSG_LEN(mBuf, &recvBufLen); + ODU_GET_MSG_LEN(mBuf, &recvBufLen); CU_ALLOC(recvBuf, (Size)recvBufLen); if(recvBuf == NULLP) @@ -2431,10 +3175,10 @@ void F1APMsgHdlr(Buffer *mBuf) /* Decoding flat buffer into F1AP messsage */ f1apMsg = &f1apasnmsg; memset(f1apMsg, 0, sizeof(F1AP_PDU_t)); - + rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0); CU_FREE(recvBuf, (Size)recvBufLen); - + if(rval.code == RC_FAIL || rval.code == RC_WMORE) { DU_LOG("\nF1AP : ASN decode failed"); @@ -2449,7 +3193,14 @@ void F1APMsgHdlr(Buffer *mBuf) { switch(f1apMsg->choice.initiatingMessage->value.present) { - case InitiatingMessage__value_PR_F1SetupRequest: + case InitiatingMessage__value_PR_Reset: + { + DU_LOG("\nF1AP : F1 reset request received "); + BuildAndSendF1ResetAck(); + break; + } + + case InitiatingMessage__value_PR_F1SetupRequest: { DU_LOG("\nF1AP : F1 setup request received"); BuildAndSendF1SetupRsp(); @@ -2460,6 +3211,8 @@ void F1APMsgHdlr(Buffer *mBuf) { DU_LOG("\nF1AP : GNB-DU config update received"); BuildAndSendDUUpdateAck(); + DU_LOG("\nF1AP : Sending F1 reset request"); + BuildAndSendF1ResetReq(); break; } case InitiatingMessage__value_PR_InitialULRRCMessageTransfer: @@ -2472,6 +3225,13 @@ void F1APMsgHdlr(Buffer *mBuf) { DU_LOG("\nF1AP : Received ULRRCMessageTransfer"); procUlRrcMsg(f1apMsg); + break; + } + + case InitiatingMessage__value_PR_RRCDeliveryReport: + { + DU_LOG("\nF1AP : Received RRC delivery report"); + break; } default: { @@ -2481,11 +3241,28 @@ void F1APMsgHdlr(Buffer *mBuf) }/* End of switch(initiatingMessage) */ break; } - + + case F1AP_PDU_PR_successfulOutcome: + { + switch(f1apMsg->choice.successfulOutcome->value.present) + { + case SuccessfulOutcome__value_PR_ResetAcknowledge: + { + DU_LOG("\nF1Reset Acknowledgement is received successfully "); + break; + } + }/* End of switch(successfulOutcome) */ + break; + } + default: + { + DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present); + return; + } }/* End of switch(f1apMsg->present) */ - + } /* End of F1APMsgHdlr */ - + /********************************************************************** End of file **********************************************************************/