+/*******************************************************************
+ *
+ * @brief Fill and send statistics response to MAC
+ *
+ * @details
+ *
+ * Function : SchSendStatsRspToMac
+ *
+ * Functionality: Fill and send statistics response to MAC
+ *
+ * @params[in] Inst inst, SchMacRsp result
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t SchSendStatsRspToMac(SchStatsRsp *statsRsp)
+{
+ Pst rspPst;
+ uint8_t ret = ROK;
+ SchStatsRsp *schStatsRsp;
+
+ DU_LOG("\nINFO --> SCH : Filling statistics response");
+ SCH_ALLOC(schStatsRsp, sizeof(SchStatsRsp));
+ if(schStatsRsp == NULLP)
+ {
+ DU_LOG("\nERROR --> SCH : Failed to allocate memory in SchSendStatsRspToMac()");
+ return RFAILED;
+ }
+
+ memcpy(schStatsRsp, statsRsp, sizeof(SchStatsRsp));
+ memset(statsRsp, 0, sizeof(SchStatsRsp));
+
+ /* Filling response post */
+ memset(&rspPst, 0, sizeof(Pst));
+ FILL_PST_SCH_TO_MAC(rspPst, inst);
+ rspPst.event = EVENT_STATISTICS_RSP_TO_MAC;
+
+ ret = MacMessageRouter(&rspPst, (void *)schStatsRsp);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> SCH : SchSendStatsRspToMac(): Failed to send Statistics Response");
+ return ret;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Rejects all statistics group requested by MAC
+ *
+ * @details
+ *
+ * Function : SchRejectAllStats
+ *
+ * Functionality: Add all statistics group received in statistics
+ * request from MAC, to Reject-Stats-Group-List in statistics
+ * response to MAC
+ *
+ * @params[in] Statistics request from MAC
+ * Cause of rejection
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t SchRejectAllStats(SchStatsReq *schStatsReq, CauseOfResult cause)
+{
+ uint8_t grpIdx = 0;
+ SchStatsRsp schStatsRsp;
+
+ memset(&schStatsRsp, 0, sizeof(SchStatsRsp));
+
+ /* Copying all stats group from stats request to stats response */
+ schStatsRsp.subscriptionId = schStatsReq->subscriptionId;
+ for(grpIdx = 0; grpIdx < schStatsReq->numStatsGroup; grpIdx++)
+ {
+ schStatsRsp.statsGrpRejectedList[grpIdx].groupId = schStatsReq->statsGrpList[grpIdx].groupId;
+ schStatsRsp.statsGrpRejectedList[grpIdx].cause = cause;
+ }
+ schStatsRsp.numGrpRejected = schStatsReq->numStatsGroup;
+
+ return SchSendStatsRspToMac(&schStatsRsp);
+}
+
+/*******************************************************************
+ *
+ * @brief Add active KPI pointers to KPI-Active-List
+ *
+ * @details
+ *
+ * Function : schAddToKpiActiveList
+ *
+ * Functionality: For each active statistics group for which timer
+ * is running, add its KPI pointer to KPI-Active-List.
+ * Use case :
+ * When it is needed to update a KPI parameters, we need not
+ * traverse all statistics group and all KPIs within a group
+ * to get the specific KPI pointer to be updated.
+ * Instead, we can traverse through KPI-Active-List and update
+ * all entries in this list.
+ *
+ * @params[in] Statistics request from MAC
+ * Cause of rejection
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t schAddToKpiActiveList(Inst inst, SchStatsGrp *grpInfo)
+{
+ CmLList *node = NULLP;
+
+ /* If DL Total PRB Usage configured for this stats group, add to list */
+ if(grpInfo->kpiStats.dlTotalPrbUsage)
+ {
+ SCH_ALLOC(node, sizeof(CmLList));
+ if(node)
+ {
+ node->node = (PTR)grpInfo->kpiStats.dlTotalPrbUsage;
+ cmLListAdd2Tail(&schCb[inst].statistics.activeKpiList.dlTotPrbUseList, node);
+ }
+ }
+
+ /* If UL Total PRB Usage configured for this stats group, add to list */
+ node = NULLP;
+ if(grpInfo->kpiStats.ulTotalPrbUsage)
+ {
+ SCH_ALLOC(node, sizeof(CmLList));
+ if(node)
+ {
+ node->node = (PTR)grpInfo->kpiStats.ulTotalPrbUsage;
+ cmLListAdd2Tail(&schCb[inst].statistics.activeKpiList.ulTotPrbUseList, node);
+ }
+ }
+
+ return ROK;
+}
+