VOS_UINT32  NAS_MMC_IsExistCachedUserSearchMsg( VOS_VOID )
{
    VOS_UINT32                          ulCacheMsgIdx;
    VOS_UINT32                          ulExistFlg;

    ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_LIST_REQ),
                                         &ulCacheMsgIdx);
    if ( VOS_TRUE == ulExistFlg )
    {
        return VOS_TRUE;
    }

    /* 收到内部搜网或列表搜网请求,判断是否有指定搜网或列表搜网,不保存该消息*/
    ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_SPECIAL_REQ),
                                         &ulCacheMsgIdx);
    if ( VOS_TRUE == ulExistFlg )
    {
        return VOS_TRUE;
    }

#if (FEATURE_ON == FEATURE_CSG)
    ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_CSG_LIST_SEARCH_REQ),
                                         &ulCacheMsgIdx);
    if ( VOS_TRUE == ulExistFlg )
    {
        return VOS_TRUE;
    }
#endif
    return VOS_FALSE;
}
VOS_VOID NAS_MSCC_MsgProc (struct MsgCB* pstMsg)
{
    MSG_HEADER_STRU                    *pstMsgHeader = VOS_NULL_PTR;
    REL_TIMER_MSG                      *pRcvTimerMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulEventType;
    VOS_UINT32                          usOldStackDepth;
    VOS_UINT32                          usNewStackDepth;

    pstMsgHeader = (MSG_HEADER_STRU *)pstMsg;

    NAS_MSCC_LogMsgInfo(pstMsgHeader);

    /* If the sender pid is timer then stop the timer */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;

        ulEventType  = NAS_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName);

        /* Stop the particular protection timer */
        NAS_MSCC_StopTimer(pRcvTimerMsg->ulName);
    }
    else
    {
        ulEventType  = NAS_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
    }

    if (VOS_TRUE == NAS_MSCC_PreProcessMsg(ulEventType, pstMsg))
    {
        return;
    }

    usOldStackDepth = NAS_MSCC_GetFsmStackDepth();

    /* Process the message in current FSM,if  */
    if (VOS_TRUE == NAS_MSCC_ProcessMsgInFsm(ulEventType, pstMsg))
    {
        /* Process the internal message */
        NAS_MSCC_ProcessMsccIntMsg();

        usNewStackDepth = NAS_MSCC_GetFsmStackDepth();

        /* If there is FSM pop then process the message in buffer message */
        if (usNewStackDepth < usOldStackDepth)
        {
            NAS_MSCC_ProcessBufferMsg();
        }
    }
    else
    {
        (VOS_VOID)NAS_MSCC_PostProcessMsg(ulEventType, pstMsg);
    }

    NAS_MSCC_UpdateMsgExitTime();

    return;
}
NAS_MML_NET_RAT_TYPE_ENUM_UINT8    NAS_MMC_GetSuspendDestinationRatType(
    NAS_MMC_ENTRY_MSG_STRU             *pstEntryMsg
)
{
#if   (FEATURE_ON == FEATURE_LTE)
    LMM_MMC_SUSPEND_IND_STRU           *pstLSuspendMsg      = VOS_NULL_PTR;
#endif
    RRMM_SUSPEND_IND_ST                 stGuSuspendMsg;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enRat;

    enRat   = NAS_MML_NET_RAT_TYPE_BUTT;

    /* 根据消息类型,转换入口消息 */
    switch (pstEntryMsg->ulEventType)
    {
        case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND):
        case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND):
            stGuSuspendMsg   = *(RRMM_SUSPEND_IND_ST*)(pstEntryMsg->aucEntryMsgBuffer);
            break;

#if   (FEATURE_ON == FEATURE_LTE)
        case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND):
            pstLSuspendMsg   = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer);

            /* 转换L的挂起消息为GU的 */
            NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg);
            break;
#endif
        default:
            NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Invalid Event Type!");
            return enRat;
    }

    /* 根据挂起目的方,获取挂起前的网络类型 */
    switch(stGuSuspendMsg.ucSuspendDestination)
    {
        case MMC_SUSPEND_DESTINATION_GSM:
            enRat = NAS_MML_NET_RAT_TYPE_GSM;
            break;

        case MMC_SUSPEND_DESTINATION_WCDMA:
            enRat = NAS_MML_NET_RAT_TYPE_WCDMA;
            break;

#if (FEATURE_ON == FEATURE_LTE)
        case MMC_SUSPEND_DESTINATION_LTE:
            enRat = NAS_MML_NET_RAT_TYPE_LTE;
            break;
#endif
        default:
            NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Unexpected Rat Type!");
            return enRat;
    }

    return enRat;
}
VOS_UINT32  NAS_MMC_IsNeedCacheMsg(
    VOS_UINT32                          ulEventType,
    VOS_VOID                           *pstMsg
)
{
    VOS_UINT32                          ulExistFlg;
    VOS_UINT32                          ulCacheEventType;

    switch (ulEventType)
    {
        /* 收到关机请求,清除所有缓存消息,返回消息需要保存*/
        case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_POWER_OFF_REQ):
            NAS_MMC_ClearAllCacheMsg();
            break;

        /* 收到MSCC发生的指定搜网和列表搜网*/
        case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_SPECIAL_REQ):
        case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_LIST_REQ):
        case NAS_BuildEventType(VOS_PID_TIMER, TI_NAS_MMC_PERIOD_TRYING_USER_PLMN_LIST):
#if (FEATURE_ON == FEATURE_CSG)
        case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_CSG_LIST_SEARCH_REQ):
		case NAS_BuildEventType(VOS_PID_TIMER, TI_NAS_MMC_PERIOD_TRYING_USER_CSG_LIST_SEARCH):
#endif

            /* 清除缓存内部指定搜网 */
            ulCacheEventType = NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ);
            NAS_MMC_ClearCacheMsg(ulCacheEventType);

            break;

        case NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ):

            /* 收到内部搜网请求,判断是否有指定搜网,不保存该消息*/
            ulExistFlg = NAS_MMC_IsExistCachedUserSearchMsg();
            if ( VOS_TRUE == ulExistFlg)
            {
                return VOS_FALSE;
            }

            /* 收到内部搜网请求,判断是否有内部搜网,清除以前保存的搜网*/

            /* 清除缓存内部指定搜网 */
            ulCacheEventType = NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ);
            NAS_MMC_ClearCacheMsg(ulCacheEventType);

            break;

        default:
            break;
    }

    /* 默认返回保存该消息 */
    return VOS_TRUE;
}
LOCAL VOS_VOID  NAS_CC_ProcMnccSrvccCallInfoNtf(
    MNCC_SRVCC_CALL_INFO_NOTIFY_STRU   *pstSrvccCallInfoNtf
)
{
    VOS_UINT8                           aucTi[MNCC_MAX_ENTITY_NUM];
    VOS_UINT8                           ucTiNum;

    PS_MEM_SET(aucTi, 0x00, sizeof(aucTi));

    if (0 != pstSrvccCallInfoNtf->ucCallNum)
    {
        /* 构造CC实体信息 */
        NAS_CC_CreateCcEntityWithCallEntityInfo((VOS_VOID*)pstSrvccCallInfoNtf);

        /* 构造通知MM模块的TI数组信息 */
        NAS_CC_GetEntityTiInfo(&ucTiNum, aucTi);

        /* 通知MM模块MMCC_SRVCC_CALL_INFO_NOTIFY消息 */
        NAS_CC_SendMmccSrvccCallInfoNtf(ucTiNum, aucTi);
    }
    else
    {
        NAS_CC_SendMmccRelReq(NAS_CC_INVALID_TI_VALUE, MMCC_RELEASE_ALL);
    }
	
    NAS_CC_ProcessSpecTypeBufferMsg(NAS_BuildEventType(WUEPS_PID_MM, MMCC_SYNC_IND));
    
    return;
}
예제 #6
0
VOS_UINT32  NAS_MMC_IsExistCachedUserSearchMsg( VOS_VOID )
{
    VOS_UINT32                          ulCacheMsgIdx;
    VOS_UINT32                          ulExistFlg;

    ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(WUEPS_PID_MMA, ID_MMA_MMC_PLMN_LIST_REQ),
                                         &ulCacheMsgIdx);
    if ( VOS_TRUE == ulExistFlg )
    {
        return VOS_TRUE;
    }

    /* 收到内部搜网或列表搜网请求,判断是否有指定搜网或列表搜网,不保存该消息*/
    ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(WUEPS_PID_MMA, ID_MMA_MMC_PLMN_SPECIAL_REQ),
                                         &ulCacheMsgIdx);
    if ( VOS_TRUE == ulExistFlg )
    {
        return VOS_TRUE;
    }

    return VOS_FALSE;
}
VOS_UINT32 NAS_MMC_IsInterSysReselectToHrpd(
    NAS_MMC_ENTRY_MSG_STRU             *pstEntryMsg
)
{
#if   (FEATURE_ON == FEATURE_LTE)
    LMM_MMC_SUSPEND_IND_STRU           *pstLSuspendMsg      = VOS_NULL_PTR;
#endif
    RRMM_SUSPEND_IND_ST                 stGuSuspendMsg;

    /* 根据消息类型,转换入口消息 */
    switch (pstEntryMsg->ulEventType)
    {
        case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND):
        case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND):
            return VOS_FALSE;

#if   (FEATURE_ON == FEATURE_LTE)
        case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND):
            pstLSuspendMsg   = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer);

            /* 转换L的挂起消息为GU的 */
            NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg);
            break;
#endif

        default:
            NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendOrigenRatType:Invalid Event Type!");
            return VOS_FALSE;
    }

    if (MMC_SUSPEND_DESTINATION_HRPD == stGuSuspendMsg.ucSuspendDestination)
    {
        return VOS_TRUE;
    }
    else
    {
        return VOS_FALSE;
    }
}
MMC_SUSPEND_CAUSE_ENUM_UINT8    NAS_MMC_GetSuspendCause(
    NAS_MMC_ENTRY_MSG_STRU             *pstEntryMsg
)
{
#if   (FEATURE_ON == FEATURE_LTE)
    LMM_MMC_SUSPEND_IND_STRU           *pstLSuspendMsg      = VOS_NULL_PTR;
#endif
    RRMM_SUSPEND_IND_ST                 stGuSuspendMsg;
    MMC_SUSPEND_CAUSE_ENUM_UINT8        enSuspendCause;

    enSuspendCause = MMC_SUSPEND_CAUSE_BUTT;

    /* 根据消息类型,转换入口消息 */
    switch (pstEntryMsg->ulEventType)
    {
        case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND):
        case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND):
            stGuSuspendMsg   = *(RRMM_SUSPEND_IND_ST*)(pstEntryMsg->aucEntryMsgBuffer);
            enSuspendCause   = stGuSuspendMsg.ucSuspendCause;
            break;

#if   (FEATURE_ON == FEATURE_LTE)
        case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND):
            pstLSuspendMsg   = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer);

            /* 转换L的挂起消息为GU的 */
            NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg);
            enSuspendCause   = stGuSuspendMsg.ucSuspendCause;
            break;
#endif
        default:
            NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendOrigenRatType:Invalid Event Type!");
            return enSuspendCause;
    }

    return enSuspendCause;
}
VOS_UINT32 NAS_UTRANCTRL_GetBufferedPlmnSearchReqType(VOS_VOID)
{
    RRMM_PLMN_SEARCH_REQ_STRU           stPlmnSearchReqMsg;
    VOS_UINT32                          ulEventType;

    ulEventType = NAS_UTRANCTRL_GetBufferedSndUtranReqMsgAddr()->ulEventType;


    /* 当期缓存的UTRAN的请求消息如果不是指定搜网请求消息则说明有异常 */
    if (ulEventType != NAS_BuildEventType(WUEPS_PID_MMC, RRMM_PLMN_SEARCH_REQ))
    {
        NAS_WARNING_LOG( WUEPS_PID_MMC, "NAS_UTRANCTRL_GetBufferedPlmnSearchReqType Invalid Event type!" );

        return RRC_PLMN_SEARCH_TYPE_BUTT;
    }

    stPlmnSearchReqMsg = *(RRMM_PLMN_SEARCH_REQ_STRU*)(NAS_UTRANCTRL_GetBufferedSndUtranReqMsgAddr()->aucEntryMsgBuffer);

    return stPlmnSearchReqMsg.ulSearchType;
}
VOS_VOID NAS_MSCC_ProcessMsccIntMsg(VOS_VOID)
{
    MSG_HEADER_STRU                    *pstIntMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulEventType;

    pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg();

    while (VOS_NULL_PTR != pstIntMsg)
    {
        NAS_MSCC_MNTN_TraceIntMsg(pstIntMsg->ulSenderPid,
                                  pstIntMsg->ulLength + VOS_MSG_HEAD_LENGTH,
                                  (VOS_VOID *)pstIntMsg);

        ulEventType  = NAS_BuildEventType(pstIntMsg->ulSenderPid, (VOS_UINT16)pstIntMsg->ulMsgName);

        /* Preprocess the message if it in preproc table */
        if (VOS_TRUE == NAS_MSCC_PreProcessMsg(ulEventType, (struct MsgCB*)pstIntMsg))
        {
            /* If the message is processed then free Msg pointer */
            PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg);

            /* Get next internal message */
            pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg();

            continue;
        }
        /* There is no entry in Pre process table then process in current FSM */
        /* Send the message to process in current FSM */
        (VOS_VOID)NAS_MSCC_ProcessMsgInFsm(ulEventType, (struct MsgCB *)pstIntMsg);

        /* Free the message */
        PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg);

        /* Get next internal message  */
        pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg();
    }

    return;
}
VOS_VOID  NAS_MMC_MsgProc(
    struct MsgCB                       *pstMsg
)
{
    MSG_HEADER_STRU                    *pstMsgHeader;
    REL_TIMER_MSG                      *pRcvTimerMsg;
    VOS_UINT32                          ulEventType;
    VOS_UINT32                          ulRet;
    VOS_UINT32                          usOldStackDepth;
    VOS_UINT32                          usNewStackDepth;

    if ( VOS_NULL_PTR == pstMsg )
    {
        NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_MsgProc:null pointer");
        return;
    }

    pstMsgHeader = (MSG_HEADER_STRU *)pstMsg;

    /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
       所以此处进行分别处理
    */
    if ( VOS_PID_TIMER == pstMsgHeader->ulSenderPid )
    {
        pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;

        ulEventType  = NAS_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName);

        /* 停止对应的定时器,更新定时器的状态 */
        NAS_MMC_StopTimer((NAS_MMC_TIMER_ID_ENUM_UINT16)(pRcvTimerMsg->ulName));
    }
    else
    {
        ulEventType  = NAS_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
    }

    /* 如果已经处理完成则直接返回 */
    if ( VOS_TRUE == NAS_MMC_PreProcessMsg(ulEventType, pstMsg))
    {
        return;
    }


    /* 获取当前MMC的栈深度 */
    usOldStackDepth    = NAS_MMC_GetFsmStackDepth();

    /* 进入状态机处理 */
    ulRet  = NAS_MMC_ProcessMsgInFsm(ulEventType, pstMsg);

    /* 状态机中会收到连接释放、状态机退出等消息,所以不能直接返回
    还需要判断能否处理缓存*/
    usNewStackDepth    = NAS_MMC_GetFsmStackDepth();

    /* 如果栈的深度减少,说明肯定进行了退栈操作,需要优先处理该状态机的结果消息,直接返回 */
    if ( usNewStackDepth < usOldStackDepth )
    {
        /* 记录退栈操作,只要发生了退栈后续就可以处理缓存 */
        NAS_MMC_SetFsmStackPopFlg(VOS_TRUE);
        return;
    }

    /* 该消息在状态机中已经处理完成,可尝试处理一下缓存 */
    if ( VOS_TRUE == ulRet)
    {
        /* 当前仅收到状态机的退出消息才能够处理缓存 */
        if (VOS_TRUE == NAS_MMC_GetFsmStackPopFlg())
        {
            (VOS_VOID)NAS_MMC_ProcessBufferMsg();
            NAS_MMC_SetFsmStackPopFlg(VOS_FALSE);
        }
    }
    /* 在当前状态机中未处理完毕,判断消息是否需要打断当前的L2状态机,后处理 */
    else
    {
        (VOS_VOID)NAS_MMC_PostProcessMsg(ulEventType, pstMsg);
    }



    return;
}