X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_f1ap_msg_hdl.c;h=edc1afef57546a5f93cc72d8587e868086c53f68;hb=3364273455756ae289662a274d5bcbf391ecd58e;hp=2ef72011477120c9c06e5aa9fcc860d2297b006a;hpb=0f864d401fa6a384c15b983828afcff96a8b0c8a;p=o-du%2Fl2.git diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 2ef720114..edc1afef5 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -109,6 +109,49 @@ extern StartupConfig g_cfg; DuCfgParams duCfgParam; +/****************************************************************** + * + * @brief Function to fetch lcId based on DRB Id + * + * @details + * + * Function : fetchLcId + * + * @params[in] drbId + * + * Functionality: Function to fetch lcId based on DRB Id + * + * Returns: lcId - SUCCESS + * RFAILED - FAILURE + *****************************************************************/ + +uint8_t fetchLcId(uint8_t drbId) +{ + uint8_t cellIdx = 0, ueIdx = 0, lcIdx = 0, numLcs = 0, lcId = 0; + + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) + { + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + { + if(duCb.actvCellLst[cellIdx] != NULLP) + { + numLcs = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.numLcs; + for(lcIdx = 0; lcIdx < numLcs; lcIdx++) + { + if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbId == drbId && \ + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbType == RB_TYPE_DRB) + { + lcId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].lcId; + return lcId; + } + } + } + } + } + DU_LOG("\nERROR --> DU_APP: fetchLcId() failed for drbId %d", drbId); + return RFAILED; +} + /************************************************************************ * * @brief Converts enum values into actual value of Poll retransmit timer @@ -956,95 +999,107 @@ uint8_t BuildNrMode(NR_Mode_Info_t *mode) * ****************************************************************/ uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend) { - uint8_t idx; - uint8_t plmnidx; - uint8_t extensionCnt=1; - uint8_t sliceId=0; - uint8_t sdId; + uint8_t idx=0, plmnidx=0, sliceLstIdx=0; + uint8_t elementCnt=0, extensionCnt=0; + + extensionCnt=IE_EXTENSION_LIST_COUNT; DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t)); if((*ieExtend) == NULLP) { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); return RFAILED; } (*ieExtend)->list.count = extensionCnt; (*ieExtend)->list.size = \ - extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *); + extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *); DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size); if((*ieExtend)->list.array == NULLP) { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); return RFAILED; } for(plmnidx=0;plmnidxlist.array[plmnidx],\ - sizeof(ServedPLMNs_ItemExtIEs_t)); + sizeof(ServedPLMNs_ItemExtIEs_t)); if((*ieExtend)->list.array[plmnidx] == NULLP) { - return RFAILED; + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); + return RFAILED; } } + + elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices; idx = 0; (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList; (*ieExtend)->list.array[idx]->criticality = Criticality_ignore; (*ieExtend)->list.array[idx]->extensionValue.present = \ - ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList; + ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList; (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.count = 1; + list.count = elementCnt; (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.size = sizeof(SliceSupportItem_t *); - DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array,sizeof(SliceSupportItem_t *)); - if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array == NULLP) - { - return RFAILED; - } - DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId],sizeof(SliceSupportItem_t)); - if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId] == NULLP) - { - return RFAILED; - } - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t); - DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\ - .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\ - extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sST.size); - if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\ - .list.array[sliceId]->sNSSAI.sST.buf == NULLP) - { - return RFAILED; - } - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sST.buf[0] = 3; + list.size = (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.count * sizeof(SliceSupportItem_t *); + DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t)); + list.array, elementCnt * sizeof(SliceSupportItem_t *)); if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD == NULLP) + list.array == NULLP) { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); return RFAILED; } - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t); - DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\ - SliceSupportList.list.array[sliceId]->sNSSAI.sD->size); - if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->buf == NULLP) + + for(sliceLstIdx =0; sliceLstIdxlist.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx],sizeof(SliceSupportItem_t)); + if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx] == NULLP) + { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); + return RFAILED; + } + (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t); + DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\ + .list.array[sliceLstIdx]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\ + extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.size); + if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\ + .list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP) + { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); + return RFAILED; + } + (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.\ + cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sst; + + DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t)); + if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD == NULLP) + { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); + return RFAILED; + } + (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t); + DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf, (*ieExtend)->list.array[idx]->extensionValue.choice.\ + SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size); + if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP) + { + DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed"); + return RFAILED; + } + memcpy((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[0].duCellInfo.\ + cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sd, (*ieExtend)->list.array[idx]->\ + extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size); } - sdId = 0; - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3; - sdId++; - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6; - sdId++; - (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9; return ROK; } /******************************************************************* @@ -1406,10 +1461,9 @@ void FreeRrcVer(RRC_Version_t *rrcVer) * ****************************************************************/ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) { - uint8_t plmnCnt=1; - uint8_t sliceId=0; - uint8_t extensionCnt=1; - uint8_t plmnIdx=0; + uint8_t plmnCnt=MAX_PLMN; + uint8_t extensionCnt=IE_EXTENSION_LIST_COUNT; + uint8_t plmnIdx=0, sliceIdx=0; GNB_DU_Served_Cells_Item_t *srvCellItem; ServedPLMNs_Item_t *servedPlmnItem; SliceSupportItem_t *sliceSupportItem; @@ -1437,7 +1491,7 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx] != NULLP) { servedPlmnItem = srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx]; - DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size * sizeof(uint8_t)); + DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size); if(servedPlmnItem->iE_Extensions != NULLP) { @@ -1445,38 +1499,48 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) { if(servedPlmnItem->iE_Extensions->list.array[0] != NULLP) { - if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\ - array != NULLP) + if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ + SliceSupportList.list.array != NULLP) { - if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\ - array[sliceId] != NULLP) + for(sliceIdx =0; sliceIdxiE_Extensions->list.array[0]->\ + extensionValue.choice.SliceSupportList.list.count; sliceIdx++) { - sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ - SliceSupportList.list.array[sliceId]; + if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ + SliceSupportList.list.array[sliceIdx] != NULLP) + { + sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->\ + extensionValue.choice.SliceSupportList.list.array[sliceIdx]; - DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t)); + DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t)); - if(sliceSupportItem->sNSSAI.sD != NULLP) - { - DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size); - DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t)); - } + if(sliceSupportItem->sNSSAI.sD != NULLP) + { + DU_FREE(sliceSupportItem->sNSSAI.sD->buf,\ + sliceSupportItem->sNSSAI.sD->size); + DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t)); + } - DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[sliceId], sizeof(SliceSupportItem_t)); + DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.\ + choice.SliceSupportList.list.array[sliceIdx], sizeof(SliceSupportItem_t)); + } } - DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array, sizeof(SliceSupportItem_t*)); + DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ + SliceSupportList.list.array, servedPlmnItem->iE_Extensions->list.array[0]->\ + extensionValue.choice.SliceSupportList.list.size); } - DU_FREE(servedPlmnItem->iE_Extensions->list.array[0], sizeof(ServedPLMNs_ItemExtIEs_t)); + DU_FREE(servedPlmnItem->iE_Extensions->list.array[0],\ + sizeof(ServedPLMNs_ItemExtIEs_t)); } - DU_FREE(servedPlmnItem->iE_Extensions->list.array, extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*)); + DU_FREE(servedPlmnItem->iE_Extensions->list.array,\ + extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*)); } DU_FREE(servedPlmnItem->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P3_t)); } - DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx], sizeof(ServedPLMNs_Item_t)); + DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx],\ + sizeof(ServedPLMNs_Item_t)); } - DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array, sizeof(ServedPLMNs_Item_t *)); + DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\ + sizeof(ServedPLMNs_Item_t *)); } if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP) @@ -1484,10 +1548,10 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\ freqBandListNr.list.array != NULLP) { - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\ - list.array[0],sizeof(FreqBandNrItem_t)); - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\ - list.array,sizeof(FreqBandNrItem_t*)); + DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\ + uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t)); + DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\ + uL_NRFreqInfo.freqBandListNr.list.array,sizeof(FreqBandNrItem_t*)); } if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\ @@ -1796,7 +1860,7 @@ uint8_t BuildAndSendF1SetupReq() void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) { - uint8_t arrIdx=0,i=0; + uint8_t arrIdx=0, servedPlmnIdx=0, sliceLstIdx=0; ServedPLMNs_Item_t *servedPlmnItem = NULLP; SliceSupportItem_t *sliceSupportItem = NULLP; @@ -1822,41 +1886,50 @@ void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) { if(servedPlmnItem->iE_Extensions->list.array[arrIdx] != NULLP) { - if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array != NULLP) + if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array != NULLP) { - if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx] != NULLP) + for(sliceLstIdx =0; sliceLstIdxiE_Extensions->list.array[arrIdx]->\ + extensionValue.choice.SliceSupportList.list.count; sliceLstIdx++) { - sliceSupportItem = modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->iE_Extensions->\ - list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx]; - - DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size); - if(sliceSupportItem->sNSSAI.sD != NULLP) + if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx] != NULLP) { - DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size); - DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t)); + + sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.list.array[sliceLstIdx]; + + DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size); + if(sliceSupportItem->sNSSAI.sD != NULLP) + { + DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size); + DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t)); + } + DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.list.array[sliceLstIdx], sizeof(SliceSupportItem_t)); } - DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ - list.array[arrIdx], sizeof(SliceSupportItem_t)); } - DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array, - servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.size); + DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.\ + choice.SliceSupportList.list.array,\ + servedPlmnItem->iE_Extensions->list.array[arrIdx]->\ + extensionValue.choice.SliceSupportList.list.size); } } - for(i=0; i < servedPlmnItem->iE_Extensions->list.count ; i++) + for(servedPlmnIdx=0; servedPlmnIdx< servedPlmnItem->iE_Extensions->list.count ; servedPlmnIdx++) { - DU_FREE(servedPlmnItem->iE_Extensions->list.array[i], sizeof(ServedPLMNs_ItemExtIEs_t )); + DU_FREE(servedPlmnItem->iE_Extensions->list.array[servedPlmnIdx], sizeof(ServedPLMNs_ItemExtIEs_t )); } DU_FREE(servedPlmnItem->iE_Extensions->list.array, servedPlmnItem->iE_Extensions->list.size); } DU_FREE(servedPlmnItem->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t)); } } - for(i=0;iserved_Cell_Information.servedPLMNs.list.count;i++) + for(servedPlmnIdx=0; servedPlmnIdxserved_Cell_Information.servedPLMNs.list.count; servedPlmnIdx++) { - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i], sizeof(ServedPLMNs_Item_t)); + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[servedPlmnIdx], sizeof(ServedPLMNs_Item_t)); } DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\ - modifyItem->served_Cell_Information.servedPLMNs.list.size); + modifyItem->served_Cell_Information.servedPLMNs.list.size); } if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP) @@ -2006,119 +2079,135 @@ void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg) uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn) { - uint8_t ieIdx, ieListCnt; + uint8_t ieIdx=0, arrayIdx=0, ieListCnt=0, elementCnt=0, sliceLstIdx=0; - servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t); - DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\ - array[0]->pLMN_Identity.size); - if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP) + servedPlmn->list.array[arrayIdx]->pLMN_Identity.size = 3*sizeof(uint8_t); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf, servedPlmn->list.\ + array[arrayIdx]->pLMN_Identity.size); + if(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf == NULLP) { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); return RFAILED; } - buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\ - servedPlmn->list.array[0]->pLMN_Identity.buf); - DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t)); - if(servedPlmn->list.array[0]->iE_Extensions == NULLP) + buildPlmnId(duCfgParam.srvdCellLst[arrayIdx].duCellInfo.cellInfo.srvdPlmn[arrayIdx].plmn,\ + servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t)); + if(servedPlmn->list.array[arrayIdx]->iE_Extensions == NULLP) { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); return RFAILED; } ieListCnt=1; - servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt; - servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *); - DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\ - iE_Extensions->list.size); - if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP) + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.count = ieListCnt; + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array,servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.size); + if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array == NULLP) { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); return RFAILED; } - for(ieIdx=0;ieIdxlist.array[0]->iE_Extensions->list.array[ieIdx],\ - sizeof(ServedPLMNs_ItemExtIEs_t)); - if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP) + DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx],\ + sizeof(ServedPLMNs_ItemExtIEs_t)); + if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx] == NULLP) { - return RFAILED; + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; + } + } + + ieIdx = 0; + elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices; + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->id =ProtocolIE_ID_id_TAISliceSupportList; + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->criticality = Criticality_ignore; + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.present = \ + ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList; + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.count = elementCnt; + servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.size = elementCnt * sizeof(SliceSupportItem_t *); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array,servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.size); + if(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array == NULLP) + { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; + } + + for(sliceLstIdx =0; sliceLstIdx< elementCnt; sliceLstIdx++) + { + DU_ALLOC(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx],sizeof( SliceSupportItem_t)); + if(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx] == NULLP) + { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; + } + + servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.buf,servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->\ + sNSSAI.sST.size); + + if(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP) + { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; } + servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sST.buf[arrayIdx] = duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\ + cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sst; + + DU_ALLOC(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t)); + if(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD == NULLP) + { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; + } + servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t); + DU_ALLOC(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf,servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->size); + if(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP) + { + DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed"); + return RFAILED; + } + memcpy(servedPlmn->list.array[arrayIdx]->\ + iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\ + cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sd,\ + servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\ + list.array[sliceLstIdx]->sNSSAI.sD->size); } - //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions; - servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList; - servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore; - servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \ - ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList; - servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.count = 1; - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.size = sizeof(SliceSupportItem_t *); - DU_ALLOC(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array,servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size); - if(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array == NULLP) - { - return RFAILED; - } - - DU_ALLOC(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0],sizeof( SliceSupportItem_t)); - if(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0] == NULLP) - { - return RFAILED; - } - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sST.size = sizeof(uint8_t); - DU_ALLOC(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size); - if(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sST.buf == NULLP) - { - return RFAILED; - } - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sST.buf[0] = 3; - DU_ALLOC(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t)); - if(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD == NULLP) - { - return RFAILED; - } - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t); - DU_ALLOC(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->size); - if(servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->buf == NULLP) - { - return RFAILED; - } - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->buf[0] = 3; - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->buf[1] = 6; - servedPlmn->list.array[0]->\ - iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\ - list.array[0]->sNSSAI.sD->buf[2] = 9; return ROK; } @@ -3366,7 +3455,7 @@ uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddMod coreset1StartPrb = coreset0EndPrb + 6; coreset1NumPrb = CORESET1_NUM_PRB; /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); controlRSet->frequencyDomainResources.bits_unused = bitsUnused; @@ -6284,6 +6373,7 @@ void freeRlcLcCfg(RlcBearerCfg *lcCfg) DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode); break; } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai)); } /******************************************************************* @@ -7327,6 +7417,48 @@ void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg) } } +/******************************************************************* +* +* @brief Function to extract Snssai Cfg Info from CU +* +* @details +* +* Function : extractDrbSnssaiCfg +* +* Functionality: Function to extract Drb Snssai Cfg Info from CU +* +* @params[in] DRB_Information_t *drbInfo, Snssai *snssai +* @return ROK/RFAILED +* +* ****************************************************************/ + +uint8_t extractDrbSnssaiCfg(SNSSAI_t *RecvSnssai, Snssai **snssaiToBeShared) +{ + if(!(*snssaiToBeShared)) + { + DU_ALLOC_SHRABL_BUF((*snssaiToBeShared), sizeof(Snssai)); + if(snssaiToBeShared == NULLP) + { + DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Memory failed at allocating for SNSSAI "); + return RFAILED; + } + } + if(RecvSnssai) + { + memcpy(&(*snssaiToBeShared)->sst, RecvSnssai->sST.buf, RecvSnssai->sST.size); + if(RecvSnssai->sD) + { + memcpy((*snssaiToBeShared)->sd, RecvSnssai->sD->buf, RecvSnssai->sD->size); + } + else + { + DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Received Null pointer of Snssai->SD"); + return RFAILED; + } + } + return ROK; +} + /******************************************************************* * * @brief Function to procRlcLcCfg @@ -7344,8 +7476,9 @@ void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg) * ****************************************************************/ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ - uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg) + uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg, QoSInformation_t *qoSInformation) { + DRB_Information_t *drbInfo; lcCfg->rbId = rbId; lcCfg->configType = configType; @@ -7368,10 +7501,24 @@ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ { extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg); } + if(qoSInformation != NULLP) + { + if(qoSInformation->present == QoSInformation_PR_choice_extension) + { + if(qoSInformation->choice.choice_extension->value.present ==\ + QoSInformation_ExtIEs__value_PR_DRB_Information) + { + drbInfo = &qoSInformation->choice.choice_extension->value.choice.DRB_Information; + if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &lcCfg->snssai) != ROK) + { + DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at procRlcLcCfg()"); + return RFAILED; + } + } + } + } } - - /******************************************************************* * * @brief Fills DrbQos Info received by CU @@ -7390,43 +7537,59 @@ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg) { + uint8_t qosCntIdx = 0; + ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP; + qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present; qosToAdd->u.nonDyn5Qi.fiveQi =\ - qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI; + qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI; if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) { qosToAdd->u.nonDyn5Qi.avgWindow = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow); + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow); } qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume); + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume); if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel) { qosToAdd->u.nonDyn5Qi.priorLevel = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel); + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel); } qosToAdd->ngRanRetPri.priorityLevel = \ - qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; + qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; qosToAdd->ngRanRetPri.preEmptionCap = \ - qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability; + qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability; qosToAdd->ngRanRetPri.preEmptionVul = \ - qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability; + qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability; if(qosFlowCfg->gBR_QoS_Flow_Information) { memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size); + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size); memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size); + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size); memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size); + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size); memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size); + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size); + } + /*Extracting PDU_SESSION_ID*/ + qosIeExt = (ProtocolExtensionContainer_4624P74_t *)qosFlowCfg->iE_Extensions; + if(qosIeExt) + { + for(qosCntIdx = 0; qosCntIdx < qosIeExt->list.count; qosCntIdx++) + { + if(qosIeExt->list.array[qosCntIdx]->extensionValue.present == \ + QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID) + { + qosToAdd->pduSessionId = qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID; + DU_LOG("\nDEBUG --> DU_F1AP : extractQosInfo: PDU SessionID:%d",qosToAdd->pduSessionId); + } + } } - qosToAdd->pduSessionId = 0; qosToAdd->ulPduSessAggMaxBitRate = 0; } @@ -7485,6 +7648,7 @@ uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\ } return ROK; } + /******************************************************************* * * @brief Function to extract Drb Qos Cfg Info from CU @@ -7507,7 +7671,7 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo)); if(macLcToAdd->drbQos == NULLP) { - DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()"); + DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbQosCfg()"); return RFAILED; } @@ -7517,21 +7681,10 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS); macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel; } - if(!macLcToAdd->snssai) - { - DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai)); - if(macLcToAdd->snssai == NULLP) - { - DU_LOG("\nERROR --> DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()"); - return RFAILED; - } - } - memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \ - drbInfo->sNSSAI.sST.size); - if(drbInfo->sNSSAI.sD) + if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &macLcToAdd->snssai) != ROK) { - memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \ - drbInfo->sNSSAI.sD->size); + DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at extractDrbQosCfg()"); + return RFAILED; } return ROK; } @@ -7549,8 +7702,8 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) * @return void * * ****************************************************************/ -uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem,DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\ -LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) +uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\ +DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) { DRB_Information_t *drbInfo = NULLP; @@ -7597,7 +7750,32 @@ LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) } } } + else if(drbModItem != NULLP) + { + if(extractUpTnlInfo(drbModItem->dRBID, CONFIG_MOD, &drbModItem->uLUPTNLInformation_ToBeSetup_List,\ + upTnlInfo) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()"); + return RFAILED; + } + if(drbModItem->qoSInformation != NULLP) + { + if(drbModItem->qoSInformation->present == QoSInformation_PR_choice_extension) + { + if(drbModItem->qoSInformation->choice.choice_extension->value.present ==\ + QoSInformation_ExtIEs__value_PR_DRB_Information) + { + drbInfo = &drbModItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information; + if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()"); + return RFAILED; + } + } + } + } + } return ROK; } @@ -7617,11 +7795,11 @@ LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) * ****************************************************************/ uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo) +DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo) { if(drbCfg != NULLP) { - if(extractDrbCfg(drbCfg, NULL, lcCfg, upTnlInfo) != ROK) + if(extractDrbCfg(drbCfg, NULL, NULL, lcCfg, upTnlInfo) != ROK) { DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); return RFAILED; @@ -7629,7 +7807,15 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCf } else if(drbSetupModCfg != NULLP) { - if(extractDrbCfg(NULL, drbSetupModCfg, lcCfg, upTnlInfo) != ROK) + if(extractDrbCfg(NULL, drbSetupModCfg, NULL, lcCfg, upTnlInfo) != ROK) + { + DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); + return RFAILED; + } + } + else if(drbModCfg != NULLP) + { + if(extractDrbCfg(NULL, NULL, drbModCfg, lcCfg, upTnlInfo) != ROK) { DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); return RFAILED; @@ -7669,8 +7855,8 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCf * * ****************************************************************/ -uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\ -DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LogicalChannelConfig_t *ulLcCfg,\ +uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType, DRBs_ToBeSetup_Item_t *drbItem,\ +DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LogicalChannelConfig_t *ulLcCfg,\ LcCfg *lcCfg, UpTnlCfg *upTnlInfo) { uint8_t ret = ROK; @@ -7679,14 +7865,16 @@ LcCfg *lcCfg, UpTnlCfg *upTnlInfo) lcCfg->configType = configType; if(rbType == RB_TYPE_SRB) { - ret = extractMacRbCfg(lcId, NULL,NULL, ulLcCfg, lcCfg, NULL); + ret = extractMacRbCfg(lcId, NULL, NULL, NULL, ulLcCfg, lcCfg, NULL); } else if(rbType == RB_TYPE_DRB) { if(drbItem != NULL) - ret = extractMacRbCfg(lcId, drbItem, NULL, ulLcCfg, lcCfg, upTnlInfo); + ret = extractMacRbCfg(lcId, drbItem, NULL, NULL, ulLcCfg, lcCfg, upTnlInfo); else if(drbSetupModItem != NULL) - ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, ulLcCfg, lcCfg, upTnlInfo); + ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, NULL, ulLcCfg, lcCfg, upTnlInfo); + else if(drbModItem != NULL) + ret = extractMacRbCfg(lcId, NULL, NULL, drbModItem, ulLcCfg, lcCfg, upTnlInfo); } return ret; } @@ -7757,14 +7945,16 @@ uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList /* Filling RLC/MAC Config*/ memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg)); memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg)); - procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx])); - if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK) + procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]), NULLP); + if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK) { DU_LOG("\nERROR --> DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()"); return RFAILED; } (ueCfgDb->numRlcLcs)++; (ueCfgDb->numMacLcs)++; + DU_LOG("\nDEBUG -> DUAPP: extractRlcCfgToAddMod:RBType:%d, DrbID: %d,lcId:%d, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + rbType, rbId, lcId, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); } //TODO: To send the failure cause in UeContextSetupRsp return ROK; @@ -8006,31 +8196,34 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToAddModList->list.count) { macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ - cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; - bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ - macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ + cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; + //freqDomRsrcBitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ + macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + memcpy(macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc, \ + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.buf, + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.size); + macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \ - cRsetToAddModList->list.array[cRsetIdx]->duration; + cRsetToAddModList->list.array[cRsetIdx]->duration; - macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ - cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; + macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ + cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED) - { - //TODO: handle the case for Interleaved + { + //TODO: handle the case for Interleaved } macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \ - cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; - if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ - *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); - } + cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; + if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ + *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); + } } } - } /* Control Resource Set To Release List */ if(cuPdcchCfg->controlResourceSetToReleaseList) @@ -8039,10 +8232,10 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToRelList->list.count) { macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) - { + for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) + { macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]); - } + } } } @@ -8053,49 +8246,49 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToAddModList->list.count) { macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\ - *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); - if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) - { + *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); + if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\ - srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; + srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; } if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot) { - bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); + bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); } - if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) + if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; - } + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; + } if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; - if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; - } - - } - } + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; + if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; + } + + } + } } } /* Search space To Rel List */ @@ -8105,11 +8298,11 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToRelList->list.count) { macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\ - *(srchSpcToRelList->list.array[srchSpcIdx]); - } + *(srchSpcToRelList->list.array[srchSpcIdx]); + } } } } @@ -9061,7 +9254,21 @@ ServCellCfgInfo *storedSrvCellCfg) if(dlBwp->pdcch_Config->choice.setup) { macSrvCellCfg->initDlBwp.pdcchPresent = true; - extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + if(storedSrvCellCfg) + { + if(!storedSrvCellCfg->initDlBwp.pdcchPresent) + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } } } if(dlBwp->pdsch_Config) @@ -9885,19 +10092,18 @@ CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *p * ****************************************************************/ uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd) { - uint8_t ret = ROK; /* Filling RLC INFO */ - procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd, NULL); /* Filling MAC INFO */ - ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, macLcToAdd, NULL); - if(ret == RFAILED) + if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, macLcToAdd, NULL) != ROK) { DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()"); - return ret; + return RFAILED; } - return ret; + + return ROK; } @@ -9947,6 +10153,8 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]); ueCfgDb->numRlcLcs++; ueCfgDb->numMacLcs++; + DU_LOG("\nDEBUG --> DUAPP: extractSrbListToSetup: SRBID: %d [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + srbItem->sRBID, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); if(ret == RFAILED) { DU_LOG("\nERROR --> F1AP: Failed at extractSrbListToSetup()"); @@ -9966,41 +10174,68 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) * * @details * - * Function : procDrbListToSetup + * Function : procDrbListToSetupMod * * Functionality: Fills Drb List received by CU * for both MAC and RLC * - * @params[in] SRBs_ToBeSetup_Item_t pointer - * LcCfg pointer, - * RlcBearerCfg pointer + * @params[in] DRBs_ToBeSetup_Item_t , DRBs_ToBeSetupMod_Item_t, + * DRBs_ToBeModified_Item_t , lcId, LcCfg pointer, + * RlcBearerCfg , UpTnlCfg, RlcUeCfg * @return void * * ****************************************************************/ -uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo) +uint8_t procDrbListToSetupMod(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\ +DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, RlcUeCfg *storedRlcUeCfg) { + uint8_t cfgIdx = 0; + RlcMode rlcModeInfo; if(drbItem != NULLP) { /* Filling RLC INFO */ - procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd, &drbItem->\ + qoSInformation); /* Filling MAC INFO */ - if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) { - DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); return RFAILED; } } else if(drbSetupModItem != NULLP) { - procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd, + &drbSetupModItem->qoSInformation); - if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, macLcToAdd, upTnlInfo) != ROK) + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) { - DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); + return RFAILED; + } + } + else if(drbModItem != NULLP) + { + /* Drb to Mod IEs doesnot have rlcMode to be modified + * in ASN. Hence no change in RLC configurations */ + if(storedRlcUeCfg != NULLP) + { + for(cfgIdx = 0; cfgIdx < storedRlcUeCfg->numLcs; cfgIdx++) + { + if(storedRlcUeCfg->rlcLcCfg[cfgIdx].lcId == lcId) + { + rlcModeInfo = storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcMode; + break; + } + } + } + + procRlcLcCfg(drbModItem->dRBID, lcId, RB_TYPE_DRB, rlcModeInfo, CONFIG_MOD, NULL, rlcLcToAdd, drbModItem->qoSInformation); + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_MOD, NULL, NULL, drbModItem, NULL, macLcToAdd, upTnlInfo) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); return RFAILED; } } @@ -10013,7 +10248,7 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcL * * @details * - * Function : extractDrbListToSetup + * Function : extractDrbListToSetupMod * * Functionality: extract Drb List received by CU * for both MAC and RLC @@ -10024,12 +10259,13 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcL * * ****************************************************************/ -uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\ -uint8_t drbCount, DuUeCfg *ueCfgDb) +uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\ + DRBs_ToBeModified_List_t *drbModCfg, uint8_t drbCount, DuUeCfg *ueCfgDb, uint32_t *drbBitMap, RlcUeCfg *rlcUeCfg) { - uint8_t ret, drbIdx; + uint8_t ret, drbIdx, lcId = 0; DRBs_ToBeSetup_Item_t *drbItem = NULLP; DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP; + DRBs_ToBeModified_ItemIEs_t *drbModItem = NULLP; ret = ROK; if(drbCount > 0) @@ -10038,48 +10274,80 @@ uint8_t drbCount, DuUeCfg *ueCfgDb) { if(ueCfgDb->numMacLcs > MAX_NUM_LC) { - DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetupMod()"); ret = RFAILED; break; } if(ueCfgDb->numRlcLcs > MAX_NUM_LC) { - DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetupMod()"); ret = RFAILED; break; } memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); - - if(drbCfg != NULL) + + if(drbModCfg != NULLP) { - drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item; - ret = procDrbListToSetup(lcId, drbItem, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\ - &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]); + drbModItem = (DRBs_ToBeModified_ItemIEs_t *) drbModCfg->list.array[drbIdx]; + lcId = fetchLcId(drbModItem->value.choice.DRBs_ToBeModified_Item.dRBID); + if(lcId < MIN_DRB_LCID) + { + DU_LOG("\nERROR --> F1AP : Failed fetching LCID %d in extractDrbListToSetupMod() for Modified List", lcId); + break; + } + ret = procDrbListToSetupMod(lcId, NULL, NULL, &(drbModItem->value.choice.DRBs_ToBeModified_Item),\ + &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\ + &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); if(ret == RFAILED) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for Modified List"); break; } + } - else if(drbSetupModCfg != NULL) + else { - drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx]; - ret = procDrbListToSetup(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item) ,\ - &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\ - &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]); - if(ret == RFAILED) + lcId = getDrbLcId(drbBitMap); + if(lcId == RFAILED) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : InCorrect LCID extractDrbListToSetupMod()"); + ret = RFAILED; break; } + if(drbCfg != NULL) + { + drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item; + ret = procDrbListToSetupMod(lcId, drbItem, NULL, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\ + &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetup List"); + break; + } + } + else if(drbSetupModCfg != NULL) + { + drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx]; + ret = procDrbListToSetupMod(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item), NULL,\ + &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\ + &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetupMod List"); + break; + } + } } ueCfgDb->numRlcLcs++; ueCfgDb->numMacLcs++; ueCfgDb->numDrb++; + + DU_LOG("\nDEBUG --> DUAPP: extractDrbListToSetupMod:lcId:%x ,BitMap:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + lcId,*drbBitMap, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); if(ret == RFAILED) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod()"); break; } } @@ -10310,7 +10578,7 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq) * ****************************************************************/ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) { - uint8_t ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0; + uint8_t ret=0, ieIdx=0, ueIdx=0, cellIdx=0; bool ueCbFound = false; uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0; DuUeCb *duUeCb = NULL; @@ -10412,19 +10680,14 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) } case ProtocolIE_ID_id_DRBs_ToBeSetup_List: { - lcId = getDrbLcId(&duUeCb->drbBitMap); - if(lcId != RFAILED) - { drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List; - if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg)) + + if(extractDrbListToSetupMod(drbCfg, NULL, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULLP)) { - DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod()"); //TODO: Update the failure cause in ue context Setup Response ret = RFAILED; } - } - else - ret = RFAILED; break; } case ProtocolIE_ID_id_RRCContainer: @@ -11931,7 +12194,7 @@ void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck) uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) { uint8_t ieIdx=0, arrIdx=0,ret=ROK; - uint8_t ueId =0 , ueIdx =0; + uint8_t ueId =0 , ueIdx =0, totalActiveUe = 0; uint16_t cellId =0, cellIdx =0, crnti=0; CmLList *f1apPduNode = NULLP; ReservedF1apPduInfo *f1apPduInfo =NULLP; @@ -11983,28 +12246,38 @@ uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) ret = duSendCellDeletReq(cellId); if(ret == RFAILED) { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\ + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\ request for cellId[%d]", cellId); } } else { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + totalActiveUe = duCb.actvCellLst[cellIdx]->numActvUes; + while(totalActiveUe) { + if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState != UE_ACTIVE) + { + ueIdx++; + continue; + } + crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti; GET_UE_IDX(crnti,ueId); + /* Sending Ue Context release request only for maximum supporting UEs */ ret = BuildAndSendUeContextReleaseReq(cellId, ueId); if(ret == RFAILED) { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\ + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\ request for cellId[%d]", cellId); } + ueIdx++; + totalActiveUe--; } } } else { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); ret = RFAILED; } break; @@ -12778,9 +13051,10 @@ void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *U uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) { UEContextModificationRequest_t *ueContextModifyReq = NULLP; - uint8_t ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0; + uint8_t ret = ROK, ieIdx = 0, cellIdx=0, ueIdx=0; DuUeCb *duUeCb = NULLP; DRBs_ToBeSetupMod_List_t *drbSetupModCfg; + DRBs_ToBeModified_List_t *drbModifiedCfg; uint32_t gnbCuUeF1apId, gnbDuUeF1apId; ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; @@ -12799,6 +13073,7 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) break; } case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: + case ProtocolIE_ID_id_DRBs_ToBeModified_List: { for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) { @@ -12809,19 +13084,37 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) { duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - lcId = getDrbLcId(&duUeCb->drbBitMap); - if(lcId != RFAILED) + if(duUeCb->f1UeDb == NULLP) { DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); - if(duUeCb->f1UeDb) + } + if(duUeCb->f1UeDb) + { + duUeCb->f1UeDb->actionType = UE_CTXT_MOD; + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List) { - duUeCb->f1UeDb->actionType = UE_CTXT_MOD; drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ choice.DRBs_ToBeSetupMod_List; - if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \ - &duUeCb->f1UeDb->duUeCfg)) + + if(extractDrbListToSetupMod(NULL, drbSetupModCfg, NULL, drbSetupModCfg->list.count,\ + &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULL)) + { + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbSetupModList"); + ret = RFAILED; + } + } + + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List) + + { + drbModifiedCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ + choice.DRBs_ToBeModified_List; + if(extractDrbListToSetupMod(NULL, NULL, drbModifiedCfg, drbSetupModCfg->list.count,\ + &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, &duUeCb->rlcUeCfg)) { - DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList"); ret = RFAILED; } } @@ -13195,7 +13488,7 @@ uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1 break; }while(true); - if(ret == ROK) + if(ret == ROK && (duCb.actvCellLst[cellId-1]->numActvUes == 0)) { duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; ret = duSendCellDeletReq(cellId); @@ -13320,7 +13613,7 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) { for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) @@ -13369,7 +13662,7 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) } if(!ueIdxFound) { - DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()"); + DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextReleaseCommand()"); ret = RFAILED; }