+/*******************************************************************
+ *
+ * @brief Fill and send statistics modification response to MAC
+ *
+ * @details
+ *
+ * Function : SchSendStatsRspToMac
+ *
+ * Functionality: Fill and send statistics
+ * modification response to MAC
+ *
+ * @params[in] Inst inst, SchMacRsp result
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t SchSendStatsModificationRspToMac(SchStatsModificationRsp *tmpSchStatsModRsp)
+{
+ Pst rspPst;
+ uint8_t ret = ROK;
+ SchStatsModificationRsp *schStatsModificationRsp=NULLP;
+
+ DU_LOG("\nINFO --> SCH : Filling statistics modification response");
+ SCH_ALLOC(schStatsModificationRsp, sizeof(SchStatsModificationRsp));
+ if(schStatsModificationRsp == NULLP)
+ {
+ DU_LOG("\nERROR --> SCH : Failed to allocate memory in SchSendStatsModificationRspToMac()");
+ return RFAILED;
+ }
+
+ memcpy(schStatsModificationRsp, tmpSchStatsModRsp, sizeof(SchStatsModificationRsp));
+ memset(tmpSchStatsModRsp, 0, sizeof(SchStatsModificationRsp));
+
+ /* Filling response post */
+ memset(&rspPst, 0, sizeof(Pst));
+ FILL_PST_SCH_TO_MAC(rspPst, inst);
+ rspPst.event = EVENT_STATISTICS_MODIFY_RSP_TO_MAC;
+
+ ret = MacMessageRouter(&rspPst, (void *)schStatsModificationRsp);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> SCH : SchSendStatsModificationRspToMac(): Failed to send Statistics Modification Response");
+ return ret;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Rejects all statistics modification group requested by MAC
+ *
+ * @details
+ *
+ * Function : SchRejectAllStatsModification
+ *
+ * Functionality: Add all statistics modification group received in statistics
+ * request from MAC, to Reject-StatsModification-Group-List in statistics
+ * response to MAC
+ *
+ * @params[in] Statistics request from MAC
+ * Cause of rejection
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t SchRejectAllStatsModification(SchStatsModificationReq *statsModificationReq, CauseOfResult cause)
+{
+ uint8_t grpIdx = 0;
+ SchStatsModificationRsp statsModificationRsp;
+
+ memset(&statsModificationRsp, 0, sizeof(SchStatsModificationRsp));
+
+ /* fill the subscriptionId and the rejected list in stats modification rsp */
+ statsModificationRsp.subscriptionId = statsModificationReq->subscriptionId;
+ for(grpIdx = 0; grpIdx < statsModificationReq->numStatsGroup; grpIdx++)
+ {
+ statsModificationRsp.statsGrpRejectedList[grpIdx].groupId = statsModificationReq->statsGrpList[grpIdx].groupId;
+ statsModificationRsp.statsGrpRejectedList[grpIdx].cause = cause;
+ }
+ statsModificationRsp.numGrpRejected = statsModificationReq->numStatsGroup;
+
+ return SchSendStatsModificationRspToMac(&statsModificationRsp);
+}
+
+/****************************************************************************************
+*
+* @brief Processes Statistics modification Request from MAC
+*
+* @details
+*
+* Function :SchProcStatsModificationReq
+*
+* Functionality:
+* This function process the statistics modification request from MAC:
+* [Step -1] Check the stored stats group list empty.
+* [Step - 1.1] If empty Send the rejected group list to MAC as a stats
+* modification response.
+* [Step - 1.2] Else go to step 2.
+* [Step -2] Traverse all stats group and validate each measurement types in
+* each group.
+* [Step -3] Check for any failure and if failed fill the remaining group's
+* info in rejected list.
+* [Step -4] Else Check if the received subscriptionId and groupId match the
+* values with the database node.
+* [Step -4.1] If matches then follow the below mentioned steps.
+* [Step -4.1.1] Stop the timer.
+* [Step -4.1.2] Reconfigure stats group by adding a new entry for this
+* statsGroup with updated configuration in database.
+* [Step -4.1.3] if configured successfully, store stats info into
+* stats mod rsp's accepted list, restart timer and go to step 4.1.4
+* [Step -4.1.4] Delete the old entry of this stats group..
+* [Step -4.2] Else fill the group related info in stats modification rsp's
+* rejected list.
+* [Step -5] Send the stats modification rsp to MAC
+* @params[in] Post structure
+* Statistics modification Request from MAC
+* @return ROK - success
+* RFAILED - failure
+*
+* *******************************************************************************************/
+uint8_t SchProcStatsModificationReq(Pst *pst, SchStatsModificationReq *statsModificationReq)
+{
+ Inst inst;
+ uint8_t reqGrpIdx=0;
+ uint64_t subscriptionId =0;
+ bool allocFailed = false;
+ bool statsGrpFound= false;
+ CmLList *grpNode = NULLP;
+ SchStatsGrp *statsGrpInfo=NULLP;
+ SchStatsGrpInfo statsGrpToModify;
+ SchStatsModificationRsp statsModificationRsp;
+
+ inst=pst->dstInst - SCH_INST_START;
+
+ DU_LOG("\nINFO --> SCH : Received Statistics modification request from MAC");
+
+ if(statsModificationReq == NULLP)
+ {
+ DU_LOG("\nERROR --> SCH : SchProcStatsModificationReq(): Received Null pointer");
+ return RFAILED;
+ }
+ memset(&statsModificationRsp, 0, sizeof(SchStatsRsp));
+
+ /* [Step -1] */
+ if(schCb[inst].statistics.statsGrpList.count)
+ {
+ /* [Step -1.2] */
+ subscriptionId = statsModificationReq->subscriptionId;
+
+ /* [Step - 2] */
+ for(reqGrpIdx=0; reqGrpIdx<statsModificationReq->numStatsGroup; reqGrpIdx++)
+ {
+ /* [Step - 3] */
+ statsGrpToModify = statsModificationReq->statsGrpList[reqGrpIdx];
+ if(allocFailed != true)
+ {
+ CM_LLIST_FIRST_NODE(&schCb[inst].statistics.statsGrpList, grpNode);
+ while(grpNode)
+ {
+ /* [Step - 4] */
+ statsGrpInfo = (SchStatsGrp*)grpNode->node;
+ if((statsGrpInfo->subscriptionId== subscriptionId) && (statsGrpInfo->groupId== statsGrpToModify.groupId))
+ {
+ statsGrpFound= true;
+ break;
+ }
+ grpNode = grpNode->next;
+ }
+
+ /* [Step - 4.1] */
+ if(statsGrpFound== true)
+ {
+ /* [Step - 4.1.1] */
+ if(schChkTmr((PTR)statsGrpInfo, EVENT_STATISTICS_TMR) == true)
+ {
+ schStopTmr(&schCb[inst], (PTR)statsGrpInfo, EVENT_STATISTICS_TMR);
+ }
+
+ /* [Step - 4.1.2] */
+ if(schAddToStatsGrpList(inst, &statsModificationRsp, subscriptionId, &statsGrpToModify) != ROK)
+ {
+ DU_LOG("\nERROR --> SCH : SchProcStatsReq(): Failed to fill the stats group list");
+ if(statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected-1].groupId == statsGrpToModify.groupId)
+ {
+ /* [Step - 4.1.3] */
+ schStartTmr(&schCb[inst], (PTR)(statsGrpInfo), EVENT_STATISTICS_TMR, statsGrpInfo->periodicity);
+ if(statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected-1].cause == RESOURCE_UNAVAILABLE)
+ {
+ allocFailed = true;
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* [Step - 4.1.4] */
+ deleteStatsGrpNode(inst, grpNode);
+ }
+ }
+ else
+ {
+ /* [Step - 4.2] */
+ statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected].groupId = statsGrpToModify.groupId;
+ statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected].cause = STATS_ID_NOT_FOUND;
+ statsModificationRsp.numGrpRejected++;
+ }
+ }
+ else
+ {
+ statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected].groupId = statsGrpToModify.groupId;
+ statsModificationRsp.statsGrpRejectedList[statsModificationRsp.numGrpRejected].cause = RESOURCE_UNAVAILABLE;
+ statsModificationRsp.numGrpRejected++;
+ }
+ }
+
+ statsModificationRsp.subscriptionId = statsModificationReq->subscriptionId;
+ SchSendStatsModificationRspToMac(&statsModificationRsp);
+ }
+ else
+ {
+ /* [Step -1.1] */
+ SchRejectAllStatsModification(statsModificationReq, STATS_ID_NOT_FOUND);
+ }
+ SCH_FREE(statsModificationReq, sizeof(SchStatsModificationReq));
+ return ROK;
+}