VOS_VOID TAF_SPM_UpdateServiceCtrlEntryMsg( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { TAF_SPM_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; VOS_UINT32 ulLen; /* 获得当前缓存的发送给SS的请求消息的缓冲区地址 */ pstEntryMsg = TAF_SPM_GetServiceCtrlEntryMsgAddr(); pstMsgHeader = (MSG_HEADER_STRU*)pstMsg; ulLen = pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH; /* 消息长度超过了缓存的长度,则不保存, 防止数组越界 */ if ( ulLen > TAF_SPM_MAX_MSG_BUFFER_LEN ) { TAF_ERROR_LOG(WUEPS_PID_TAF, "TAF_SPM_UpdateServiceCtrlEntryMsg:Msg too big to save "); return ; } /* 将当前处理的入口消息拷贝到Context对应的缓冲区 */ PS_MEM_CPY( pstEntryMsg->aucEntryMsgBuffer, pstMsg, ulLen ); /* 填写Context中的参数 */ pstEntryMsg->ulEventType = ulEventType; return; }
VOS_UINT32 TAF_SPM_MsgProc( struct MsgCB *pstSrcMsg, struct MsgCB **ppstDestMsg ) { VOS_UINT32 ulEventType; VOS_UINT32 ulRet; TAF_SPM_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; REL_TIMER_MSG *pstRcvTimerMsg = VOS_NULL_PTR; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; pstMsgHeader = (MSG_HEADER_STRU *)pstSrcMsg; /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分 所以此处进行分别处理 */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pstRcvTimerMsg = (REL_TIMER_MSG *)pstSrcMsg; /* 只停止SPM自己的定时器,其它模块定时器在其内部自己停止 */ if (MN_TIMER_CLASS_SPM == (pstRcvTimerMsg->ulName & MN_TIMER_CLASS_MASK)) { TAF_SPM_StopTimer(pstRcvTimerMsg->ulName,(VOS_UINT16)pstRcvTimerMsg->ulPara); } } ulEventType = TAF_SPM_BuildEventType(pstSrcMsg); /* 如果已经预处理完成则直接返回 */ if (VOS_TRUE == TAF_SPM_PreProcessMsg(ulEventType, pstSrcMsg)) { return VOS_TRUE; } /* 如果已经处理完成则直接返回 */ ulRet = TAF_SPM_ProcessMsgInFsm(ulEventType, pstSrcMsg); /* 判断是否需要替换入口消息 */ if (VOS_TRUE == TAF_SPM_GetUpdateEntryMsgFlg()) { pstEntryMsg = TAF_SPM_GetServiceCtrlEntryMsgAddr(); *ppstDestMsg = (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer; /* 消息已经使用,回复设置标记位,但不能清除消息。 */ TAF_SPM_SetUpdateEntryMsgFlg(VOS_FALSE); } else { *ppstDestMsg = pstSrcMsg; } /* 继续处理处理 */ return ulRet; }