X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_cfg_hdl.c;h=3544c12dbbfeb8ba6936542d696c55ca3e1db6b3;hb=6dc8a4c17da24847b3a3aee91b37151f77a8a5bc;hp=fee5f4f77b54f112e14efba3c2a347239d10d4c5;hpb=47a15faec02b721d3e466815eb388fea0a209e3c;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_cfg_hdl.c b/src/5gnrmac/mac_cfg_hdl.c index fee5f4f77..3544c12db 100644 --- a/src/5gnrmac/mac_cfg_hdl.c +++ b/src/5gnrmac/mac_cfg_hdl.c @@ -63,6 +63,20 @@ MacDuSliceRecfgRspFunc macDuSliceRecfgRspOpts[] = packDuMacSliceRecfgRsp /* packing for light weight loosly coupled */ }; +MacDuStatsRspFunc macDuStatsRspOpts[] = +{ + packDuMacStatsRsp, /* packing for loosely coupled */ + DuProcMacStatsRsp, /* packing for tightly coupled */ + packDuMacStatsRsp /* packing for light weight loosly coupled */ +}; + +MacDuStatsDeleteRspFunc macDuStatsDeleteRspOpts[] = +{ + packDuMacStatsDeleteRsp, /* packing for loosely coupled */ + DuProcMacStatsDeleteRsp, /* packing for tightly coupled */ + packDuMacStatsDeleteRsp /* packing for light weight loosly coupled */ +}; + /** * @brief Layer Manager Configuration request handler for Scheduler * @@ -1014,6 +1028,445 @@ uint8_t MacProcDlBroadcastReq(Pst *pst, MacDlBroadcastReq *dlBroadcastReq) } return ret; } + +/** + * @brief Fill and send statistics response to DU APP + * + * @details + * + * Function : MacSendStatsRspToDuApp + * + * Fill and send statistics response to DU APP + * + * @param[in] Response + * @param[in] Cause of response + * @return int + * -# ROK + **/ +uint8_t MacSendStatsRspToDuApp(MacStatsRsp *statsRsp) +{ + uint8_t ret = ROK; + Pst pst; + MacStatsRsp *macStatsRsp = NULLP; + + DU_LOG("\nINFO --> MAC : MacSendStatsRspToDuApp: Sending Statistics Response to DU APP"); + + /* Workaround : To skip corrupted memory, allocating a pointer that will + * remain unused */ + uint8_t *dummyPtr = NULLP; + MAC_ALLOC_SHRABL_BUF(dummyPtr, sizeof(uint8_t)); + + MAC_ALLOC_SHRABL_BUF(macStatsRsp, sizeof(MacStatsRsp)); + if(macStatsRsp == NULLP) + { + DU_LOG("\nERROR --> MAC : Failed to allocate memory in MacProcSchStatsRsp"); + ret = RFAILED; + } + else + { + memcpy(macStatsRsp, statsRsp, sizeof(MacStatsRsp)); + memset(statsRsp, 0, sizeof(MacStatsRsp)); + + memset(&pst, 0, sizeof(Pst)); + FILL_PST_MAC_TO_DUAPP(pst, EVENT_MAC_STATISTICS_RSP); + if(((*macDuStatsRspOpts[pst.selector])(&pst, macStatsRsp))!= ROK) + { + DU_LOG("\nERROR --> MAC : Failed to send statistics response to DU APP"); + MAC_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, macStatsRsp, sizeof(MacStatsRsp)); + ret = RFAILED; + } + } + + /* Workaround : Freeing the dummy pointer */ + MAC_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, dummyPtr, sizeof(uint8_t)); + return ret; +} + +/******************************************************************* + * + * @brief Rejects all statistics group requested by DU APP + * + * @details + * + * Function : MacRejectAllStats + * + * Functionality: Add all statistics group received in statistics + * request from DU APP, to Reject-Stats-Group-List in statistics + * response to DU APP + * + * @params[in] Statistics request from DU APP + * Cause of rejection + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t MacRejectAllStats(MacStatsReq *macStatsReq, CauseOfResult cause) +{ + uint8_t grpIdx = 0; + MacStatsRsp macStatsRsp; + + memset(&macStatsRsp, 0, sizeof(MacStatsRsp)); + + /* Copying all stats group from stats request to stats response */ + macStatsRsp.subscriptionId = macStatsReq->subscriptionId; + for(grpIdx = 0; grpIdx < macStatsReq->numStatsGroup; grpIdx++) + { + macStatsRsp.statsGrpRejectedList[grpIdx].groupId = macStatsReq->statsGrpList[grpIdx].groupId; + macStatsRsp.statsGrpRejectedList[grpIdx].cause = cause; + } + macStatsRsp.numGrpRejected = macStatsReq->numStatsGroup; + + return MacSendStatsRspToDuApp(&macStatsRsp); +} + +/** + * @brief Mac process the statistics Req received from DUAPP + * + * @details + * + * Function : MacProcStatsReq + * + * This function process the statistics request from duapp: + * [Step 1] Basic validation. If fails, all stats group in stats request are + * rejected. + * [Step 2] If basic validations passed, traverse all stats group and + * validate each measurement types in each group. + * [Step 3] If any measurement type validation fails in a group, that group + * is not configured and it is added to stats-group-rejected-list in + * mac-stats-response message. + * [Step 4] Even if one group passes all validation, it is sent to SCH in + * statistics request. The mac-stats-response message is added to + * pending-response list. This will be sent to DU APP after stats response + * is received from SCH. + * [Step 5] If none of the groups passes all validation, mac-stats-response + * is sent to du app with all group as part of stats-group-rejected-list. + * + * @param[in] Pst *pst + * @param[in] StatsReq *statsReq + * @return int + * -# ROK + **/ +uint8_t MacProcStatsReq(Pst *pst, MacStatsReq *macStatsReq) +{ + uint8_t macStatsGrpIdx = 0, macStatsIdx = 0, schStatsGrpIdx = 0, schStatsIdx = 0; + uint8_t ret = RFAILED; + bool measTypeInvalid = false; + Pst schPst; + MacStatsGrpInfo *macStatsGrp = NULLP; + SchStatsReq *schStatsReq = NULLP; + MacStatsRsp *macStatsRsp = NULLP; + + DU_LOG("\nINFO --> MAC : Received Statistics Request from DU_APP"); + + if(macStatsReq == NULLP) + { + DU_LOG("\nERROR --> MAC : MacProcStatsReq(): Received Null pointer"); + return RFAILED; + } + + /* [Step 1] Basic validation. If fails, statistics response is sent to DU APP + * that rejectes all stats */ + + /* If number of statistics request for which response is still pending + * towards DU APP has reached its maximum limit */ + if(macCb.statistics.numPendingStatsRsp >= MAX_PENDING_STATS_RSP) + { + DU_LOG("\nERROR --> MAC : MacProcStatsReq: Maximum number of statistics response is pending. \ + Cannot process new request."); + MacRejectAllStats(macStatsReq, RESOURCE_UNAVAILABLE); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, macStatsReq, sizeof(MacStatsReq)); + return RFAILED; + } + + /* If memory resources are unavailable */ + MAC_ALLOC(schStatsReq, sizeof(SchStatsReq)); + if(schStatsReq == NULLP) + { + DU_LOG("\nERROR --> MAC : MacProcStatsReq: Failed to allocate memory"); + MacRejectAllStats(macStatsReq, RESOURCE_UNAVAILABLE); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, macStatsReq, sizeof(MacStatsReq)); + return RFAILED; + } + + /* Add stats response to pending response list */ + macStatsRsp = &macCb.statistics.pendingStatsRsp[macCb.statistics.numPendingStatsRsp]; + memset(macStatsRsp, 0, sizeof(MacStatsRsp)); + + /* [Step 2] Traverse all stats group and validate each measurement types in each group */ + schStatsReq->subscriptionId = macStatsReq->subscriptionId; + schStatsReq->numStatsGroup = 0; + for(macStatsGrpIdx = 0; macStatsGrpIdx < macStatsReq->numStatsGroup; macStatsGrpIdx++) + { + measTypeInvalid = false; + schStatsIdx = 0; + macStatsGrp = &macStatsReq->statsGrpList[macStatsGrpIdx]; + + for(macStatsIdx=0; macStatsIdx < macStatsGrp->numStats; macStatsIdx++) + { + /* Validate each measurement type */ + switch(macStatsGrp->statsList[macStatsIdx]) + { + case MAC_DL_TOTAL_PRB_USAGE: + { + schStatsReq->statsGrpList[schStatsGrpIdx].statsList[schStatsIdx] = SCH_DL_TOTAL_PRB_USAGE; + break; + } + case MAC_UL_TOTAL_PRB_USAGE: + { + schStatsReq->statsGrpList[schStatsGrpIdx].statsList[schStatsIdx] = SCH_UL_TOTAL_PRB_USAGE; + break; + } + default: + { + DU_LOG("\nERROR --> MAC : MacProcStatsReq: Invalid measurement type [%d]", \ + macStatsGrp->statsList[macStatsIdx]); + measTypeInvalid = true; + } + } + + /* Even if one measurement type is invalid, this group is rejected */ + if(measTypeInvalid) + { + memset(&schStatsReq->statsGrpList[schStatsGrpIdx], 0, sizeof(SchStatsGrpInfo)); + break; + } + + schStatsIdx++; + } + + /* If all measurement type is valid, add group info to send to SCH */ + if(!measTypeInvalid) + { + schStatsReq->statsGrpList[schStatsGrpIdx].groupId = macStatsGrp->groupId; + schStatsReq->statsGrpList[schStatsGrpIdx].periodicity = macStatsGrp->periodicity; + schStatsReq->statsGrpList[schStatsGrpIdx].numStats = schStatsIdx; + schStatsGrpIdx++; + } + else + { + /* [Step 3] If any measurement type validation fails in a group, that group + * is not configured and it is added to stats-group-rejected-list in + * mac-stats-response message */ + macStatsRsp->statsGrpRejectedList[macStatsRsp->numGrpRejected].groupId = macStatsGrp->groupId; + macStatsRsp->statsGrpRejectedList[macStatsRsp->numGrpRejected].cause = PARAM_INVALID; + macStatsRsp->numGrpRejected++; + } + } + schStatsReq->numStatsGroup = schStatsGrpIdx; + + macStatsRsp->subscriptionId = macStatsReq->subscriptionId; + + if(schStatsReq->numStatsGroup) + { + /* [Step 4] Even if one group passes all validation, it is sent to SCH in + * statistics request. The mac-stats-response message is added to + * pending-response list. */ + macCb.statistics.numPendingStatsRsp++; + + FILL_PST_MAC_TO_SCH(schPst, EVENT_STATISTICS_REQ_TO_SCH); + ret = SchMessageRouter(&schPst, (void *)schStatsReq); + } + else + { + /* [Step 5] If none of the groups passes all validation, mac-stats-response + * is sent to du app with all group as part of stats-group-rejected-list. */ + DU_LOG("\nERROR --> MAC : MacProcStatsReq: All statistics group found invalid"); + MAC_FREE(schStatsReq, sizeof(SchStatsReq)); + ret = MacSendStatsRspToDuApp(macStatsRsp); + } + + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, macStatsReq, sizeof(MacStatsReq)); + return ret; +} + +/** + * @brief Mac process the statistics rsp received from sch. + * + * @details + * + * Function : MacProcSchStatsRsp + * + * This function process the statistics response received from sch + * + * @param[in] Pst *pst + * @param[in] SchStatsRsp *schStatsRsp + * @return int + * -# ROK + **/ +uint8_t MacProcSchStatsRsp(Pst *pst, SchStatsRsp *schStatsRsp) +{ + uint8_t idx = 0, accptdIdx = 0, rjctdIdx = 0; + uint8_t ret = RFAILED; + MacStatsRsp *macStatsRsp = NULLP; + + if(schStatsRsp) + { + /* Fetch pointer to statistics response from pending list saved at MAC + * during processing statistics request from DU APP */ + for(idx = 0; idx < macCb.statistics.numPendingStatsRsp; idx++) + { + if(macCb.statistics.pendingStatsRsp[idx].subscriptionId == schStatsRsp->subscriptionId) + { + macStatsRsp = &macCb.statistics.pendingStatsRsp[idx]; + break; + } + } + + if(macStatsRsp == NULLP) + { + MAC_FREE(schStatsRsp, sizeof(SchStatsRsp)); + return RFAILED; + } + + /* Copy Stats-group-accpeted list received from SCH */ + for(accptdIdx = 0; accptdIdxnumGrpAccepted && macStatsRsp->numGrpAcceptedstatsGrpAcceptedList[macStatsRsp->numGrpAccepted++] = schStatsRsp->statsGrpAcceptedList[accptdIdx]; + } + + /* List together all stats group rejected by MAC and by SCH */ + for(rjctdIdx = 0; rjctdIdx < schStatsRsp->numGrpRejected && macStatsRsp->numGrpRejectedstatsGrpRejectedList[macStatsRsp->numGrpRejected].groupId = \ + schStatsRsp->statsGrpRejectedList[rjctdIdx].groupId; + macStatsRsp->statsGrpRejectedList[macStatsRsp->numGrpRejected].cause = \ + schStatsRsp->statsGrpRejectedList[rjctdIdx].cause; + macStatsRsp->numGrpRejected++; + } + + /* Send statistics response to DU APP */ + ret = MacSendStatsRspToDuApp(macStatsRsp); + } + MAC_FREE(schStatsRsp, sizeof(SchStatsRsp)); + return ret; +} + +/** + * @brief Fill and send statistics delete response to DU APP + * + * @details + * + * Function : MacSendStatsDeleteRspToDuApp + * + * Fill and send statistics delete response to DU APP + * + * @param[in] Response + * @param[in] Cause of response + * @return int + * -# ROK + **/ +uint8_t MacSendStatsDeleteRspToDuApp(uint64_t subscriptionId, MacRsp result, CauseOfResult status) +{ + uint8_t ret = ROK; + Pst pst; + MacStatsDeleteRsp *macStatsDeleteRsp = NULLP; + + DU_LOG("\nINFO --> MAC : MacSendStatsDeleteRspToDuApp: Sending Delete Statistics Response to DU APP"); + + MAC_ALLOC_SHRABL_BUF(macStatsDeleteRsp, sizeof(MacStatsDeleteRsp)); + if(macStatsDeleteRsp == NULLP) + { + DU_LOG("\nERROR --> MAC : Failed to allocate memory in MacSendStatsDeleteRspToDuApp"); + ret = RFAILED; + } + else + { + macStatsDeleteRsp->subscriptionId= subscriptionId; + macStatsDeleteRsp->result = result; + macStatsDeleteRsp->status = status; + memset(&pst, 0, sizeof(Pst)); + FILL_PST_MAC_TO_DUAPP(pst, EVENT_MAC_STATS_DELETE_RSP); + if(((*macDuStatsDeleteRspOpts[pst.selector])(&pst, macStatsDeleteRsp))!= ROK) + { + DU_LOG("\nERROR --> MAC : Failed to send statistics delete response to DU APP"); + MAC_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, macStatsDeleteRsp, sizeof(MacStatsDeleteRsp)); + ret = RFAILED; + } + } + + return ret; +} + +/** + * @brief Mac process the statistics delete rsp received from sch. + * + * @details + * + * Function : MacProcSchStatsDeleteRsp + * + * This function process the statistics delete response received from sch + * + * @param[in] Pst *pst + * @param[in] SchStatsDeleteRsp *schStatsDeleteRsp + * @return int + * -# ROK + **/ +uint8_t MacProcSchStatsDeleteRsp(Pst *pst, SchStatsDeleteRsp *schStatsDeleteRsp) +{ + uint8_t ret = RFAILED; + + if(schStatsDeleteRsp) + { + if(schStatsDeleteRsp->rsp == RSP_OK) + ret = MacSendStatsDeleteRspToDuApp(schStatsDeleteRsp->subscriptionId,MAC_DU_APP_RSP_OK,schStatsDeleteRsp->cause); + else + ret = MacSendStatsDeleteRspToDuApp(schStatsDeleteRsp->subscriptionId,MAC_DU_APP_RSP_NOK,schStatsDeleteRsp->cause); + + } + MAC_FREE(schStatsDeleteRsp, sizeof(SchStatsDeleteRsp)); + return ret; +} + +/** + * @brief Mac process the statistics delete Req received from DUAPP + * + * @details + * + * Function : MacProcStatsDeleteReq + * + * Functionality: Process the statistics delete request from duapp + * @param[in] Pst *pst + * @param[in] StatsDeleteReq *statsReq + * @return int + * -# ROK + **/ + +uint8_t MacProcStatsDeleteReq(Pst *pst, MacStatsDeleteReq *macStatsDeleteReq) +{ + Pst schPst; + uint8_t ret = RFAILED; + SchStatsDeleteReq *schStatsDeleteReq = NULLP; + + DU_LOG("\nINFO --> MAC : Received Statistics delete Request from DU_APP"); + + if(macStatsDeleteReq == NULLP) + { + DU_LOG("\nERROR --> MAC : MacProcStatsDeleteReq(): Received Null pointer"); + return RFAILED; + } + + MAC_ALLOC(schStatsDeleteReq, sizeof(SchStatsDeleteReq)); + if(schStatsDeleteReq == NULLP) + { + DU_LOG("\nERROR --> MAC : MacProcStatsDeleteReq: Failed to allocate memory"); + } + else + { + schStatsDeleteReq->subscriptionId = macStatsDeleteReq->subscriptionId; + FILL_PST_MAC_TO_SCH(schPst, EVENT_STATISTICS_DELETE_REQ_TO_SCH); + ret = SchMessageRouter(&schPst, (void *)schStatsDeleteReq); + } + + if(ret != ROK) + { + MAC_FREE(schStatsDeleteReq, sizeof(SchStatsDeleteReq)); + ret = MacSendStatsDeleteRspToDuApp(macStatsDeleteReq->subscriptionId , MAC_DU_APP_RSP_NOK, RESOURCE_UNAVAILABLE); + } + + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, macStatsDeleteReq, sizeof(MacStatsDeleteReq)); + return ret; +} + /********************************************************************** End of file **********************************************************************/