Ejemplo n.º 1
0
VOS_UINT32 NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_RESUME_IND_ST                  stResumeIndMsg;

    /* 异常打印 */
    NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp:ENTERED");

    /* 向接入层发送挂起失败 */
    NAS_MMC_SndSuspendRsp(NAS_MML_GetCurrNetRatType(), RRC_NAS_SUSPEND_FAILURE);

    /* 根据挂起的发起方,构造一条恢复消息 */
    NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg);

    /* 向MM/GMM进行恢复 */
    NAS_MMC_SndGmmResumeInd(&stResumeIndMsg);

    NAS_MMC_SndMmResumeInd(&stResumeIndMsg);

    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_FAIL, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出状态机*/
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;

}
VOS_UINT8 NAS_MM_IsNeedDiscardMmcMmSysInfoInd( VOS_VOID )
{
    /* MM在TC状态不处理来自MMC的系统消息。
       GMM中在Gmm_MsgDistribute_GMM_TC_ACTIVE 中已做了限制 */
    if (TEST_CONTROL_ACTIVE == g_MmGlobalInfo.ucState)
    {
        return VOS_TRUE;
    }

    /* 通话和等待建链过程,不处理系统消息,转发后丢弃,等待新的系统消息 */
    if (NAS_MML_NET_RAT_TYPE_GSM == NAS_MML_GetCurrNetRatType())
    {
        if ((WAIT_FOR_OUTGOING_MM_CONNECTION            == g_MmGlobalInfo.ucState)
         || (WAIT_FOR_ADDITIONAL_OUTGOING_MM_CONNECTION == g_MmGlobalInfo.ucState)
         || (MM_CONNECTION_ACTIVE                       == g_MmGlobalInfo.ucState))
        {
            if ( MM_TIMER_RUNNING == NAS_MM_QryTimerStatus(MM_TIMER_CS_HO_WAIT_SYSINFO) )
            {
                Mm_TimerStop(MM_TIMER_CS_HO_WAIT_SYSINFO);

                /* 通知MMC HO SUCC */
                NAS_MM_SndMmcCsRegResultInd(MM_MMC_LU_PROC_FALSE, MM_MMC_LU_RESULT_SUCCESS, NAS_MML_REG_FAIL_CAUSE_HO_SUCC);
            }

            return VOS_TRUE;
        }
    }

    return VOS_FALSE;
}
VOS_UINT32 NAS_MMC_RcvMmResumeRsp_InterSysOos_WaitMmResumeRsp(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{

    NAS_MMC_ClearResumeRspFlag_InterSysOos( NAS_MMC_MM_RESUME_RSP_FLG );

    /* 未收齐GMM的MMCGMM_RESUME_RSP和 MM的MMCMM_RESUEM_RSP,返回继续等待 */
    if ( NAS_MMC_RESUME_RSP_NULL_FLG != NAS_MMC_GetResumeRspFlg_InterSysOos() )
    {
        return VOS_TRUE;
    }

    /* 如果已经收齐,停止MMC_WAIT_MM_RESUME_RSP_TIMER */
    NAS_MMC_StopTimer( TI_NAS_MMC_WAIT_MM_RESUME_RSP );

    /* 向接入发送恢复回复 */
    NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType());

    /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */

    /* 发送suspend状态机完成消息 */
    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出当前状态机 */
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;

}
Ejemplo n.º 4
0
VOS_UINT32  NAS_MMC_IsCurrentRatSetted_SysCfg(
    MMA_MMC_SYS_CFG_SET_REQ_STRU        *pstSysCfgSetParm
)
{
    MMA_MMC_NET_RAT_TYPE_ENUM_UINT8     *pstRatPrio = VOS_NULL_PTR;              /* 接入优先级里列表 index表示优先级次序,0最高,2最低 */
    VOS_UINT8                           ucRatNum;                               /* 当前支持的接入技术个数  */
    VOS_UINT32                          i;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enCurrRat;

    /* 取得当前的接入模式 */
    enCurrRat       = NAS_MML_GetCurrNetRatType();

    /* 取得用户当前设置的接入优先个数 */
    ucRatNum        = pstSysCfgSetParm->stRatPrioList.ucRatNum;

    /* 取得用户当前设置的接入优先级列表 */
    pstRatPrio      = pstSysCfgSetParm->stRatPrioList.aucRatPrio;

    /* 如果当前模在用户设置的接入优先级列表里,返回TRUE,否则返回FALSE */
    for ( i = 0 ; i < ucRatNum; i++ )
    {
        if ( enCurrRat == pstRatPrio[i] )
        {
            return VOS_TRUE;
        }
    }

    return VOS_FALSE;
}
Ejemplo n.º 5
0
VOS_UINT32 NAS_MMC_RcvGmmSuspendRsp_InterSysHo_WaitMmSuspendRsp(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    /* 标记已收到GMM_suspend_RSP */
    NAS_MMC_ClearSuspendRspFlag_InterSysHo( NAS_MMC_GMM_SUSPEND_RSP_FLG );

    /* 未收齐GMM,MM的SUSPNED_RSP,返回继续等待 */
    if ( NAS_MMC_SUSPEND_RSP_NULL_FLG != NAS_MMC_GetSuspendRspFlg_InterSysHo() )
    {
        return VOS_TRUE;
    }

    /* 停止定时器TI_NAS_MMC_WAIT_MM_SUSPEND_RSP */
    NAS_MMC_StopTimer ( TI_NAS_MMC_WAIT_MM_SUSPEND_RSP );

    /* 向接入层发送挂起成功 */
    NAS_MMC_SndSuspendRsp(NAS_MML_GetCurrNetRatType(), RRC_NAS_SUSPEND_SUCCESS);

    NAS_MMC_FSM_SetCurrState( NAS_MMC_INTER_SYS_HO_STA_WAIT_AS_RESUME_IND );

    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND, TI_NAS_MMC_WAIT_AS_RESUME_IND_LEN);

    return VOS_TRUE;

}
Ejemplo n.º 6
0
VOS_UINT32 NAS_MMC_RcvTiWaitAsResumeIndExpired_InterSysHo_WaitAsResumeInd(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enCurRat;

    enCurRat      = NAS_MML_GetCurrNetRatType();

    /* 异常打印 */
    NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitAsResumeIndExpired_InterSysHo_WaitAsResumeInd:ENTERED");

    /* 调用om接口,上电复位: */

    if ( (NAS_UTRANCTRL_UTRAN_MODE_FDD == NAS_UTRANCTRL_GetCurrUtranMode())
      && (NAS_MML_NET_RAT_TYPE_WCDMA == enCurRat) )
    {
        NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_WAS_WAIT_RESUME_IND_EXPIRED);
    }
    else if ( NAS_MML_NET_RAT_TYPE_GSM == enCurRat )
    {
        NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_GAS_WAIT_RESUME_IND_EXPIRED);
    }
    else if ( NAS_MML_NET_RAT_TYPE_LTE == enCurRat )
    {
        NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_LMM_WAIT_RESUME_IND_EXPIRED);
    }
    else
    {
        NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_TD_WAIT_RESUME_IND_EXPIRED);
    }

    return VOS_TRUE;
}
Ejemplo n.º 7
0
VOS_UINT32 NAS_MMC_RcvMmResumeRsp_InterSysHo_WaitMmResumeRsp(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    /* 状态机上下文标记已收到MMCMM_RESUME_RSP */
    NAS_MMC_ClearResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG);

    /* 未收齐GMM的MMCGMM_RESUME_RSP和 MM的MMCMM_RESUEM_RSP,返回继续等待 */
    if ( NAS_MMC_RESUME_RSP_NULL_FLG != NAS_MMC_GetResumeRspFlg_InterSysHo() )
    {
        return VOS_TRUE;
    }

    /* 如果已经收齐,停止TI_NAS_MMC_WAIT_MM_RESUME_RSP */
    NAS_MMC_StopTimer( TI_NAS_MMC_WAIT_MM_RESUME_RSP );

     /* 向接入发送恢复回复 */
    NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType());

    /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */

    /* 发送状态机成功的结果 */
    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出当前状态机: */
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;

}
VOS_UINT32  NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND);

    /* 向当前AS发送 RRMM_SUSPEND_REL_REQ */
    if ( NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
    {
        NAS_MMC_SndAsSuspendRelReq(WUEPS_PID_WRR);
    }
    else
    {
        NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd:could not support current rat!");

        return VOS_FALSE;
    }

    /* 迁移状态到等待SUSPEND_REL_CNF */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_WAS_SUSPEND_REL_CNF);

    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF, TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF_LEN);

    return VOS_TRUE;
}
VOS_UINT8   NAS_MM_RcvMmcMmSysInfoInd_PreProc(
    VOS_VOID                           *pRcvMsg
)
{
    VOS_UINT8                           ucEventID;

    ucEventID       = 5;

    NAS_MM_LogMmCtxInfo();

    /* 停MM_TIMER_HO_WAIT_SYSINFO或MM_TIMER_EMERGENCY_CSFB_HO_WAIT_SYSINFO的处理与原来相同:
       只有在CSFB标志存在时,才停定时器. 如果需要做LAU,等待LAU结果;如果不需要做LAU, MM报注册假流程
       其他情况下不停定时器,等定时器超时 */
    if ( MM_TIMER_RUNNING == NAS_MM_QryTimerStatus(MM_TIMER_CS_HO_WAIT_SYSINFO) )
    {
        Mm_TimerStop(MM_TIMER_CS_HO_WAIT_SYSINFO);

        /* 通知MMC HO SUCC */
        NAS_MM_SndMmcCsRegResultInd(MM_MMC_LU_PROC_FALSE, MM_MMC_LU_RESULT_SUCCESS, NAS_MML_REG_FAIL_CAUSE_HO_SUCC);
    }

    /* 是否需要忽略系统消息 */
    if (VOS_TRUE == NAS_MM_IsNeedDiscardMmcMmSysInfoInd())
    {
        return MM_EVENT_ID_INVALID;
    }

    /* 检查系统消息的合法性 */
    if (VOS_FALSE == NAS_MM_CheckMmcMmSysInfoIE(pRcvMsg))
    {
        return MM_EVENT_ID_INVALID;
    }

    if (NAS_MML_NET_RAT_TYPE_GSM == NAS_MML_GetCurrNetRatType())
    {
        NAS_MM_UpdateNetworkInfo_GasSysInfo(pRcvMsg);
    }
    else
    {
        NAS_MM_UpdateNetworkInfo_WasSysInfo(pRcvMsg);
    }

    if (VOS_TRUE == NAS_MM_IsCsNotSupport(pRcvMsg))
    {
        NAS_MM_ProcMmcMmSysInfoInd_CsNotSupport_PreProc();

        return MM_EVENT_ID_INVALID;
    }

    if (VOS_FALSE == NAS_MML_GetSimCsRegStatus())
    {
        NAS_MM_ProcMmcMmSysInfoInd_NoImsi_PreProc();

        return MM_EVENT_ID_INVALID;
    }


    return ucEventID;
}
/*****************************************************************************
 函 数 名  : NAS_CC_GetMsgUus1Info
 功能描述  : 判断该条消息是否激活UUS1信息
 输入参数  : entityId       :处理该原语的CC实体的ID
             enMsgType      :   消息类型
 输出参数  : pstUuieInfo    :   该消息的UUIE内容
 返 回 值  : VOS_OK         :   UUS1消息激活,需携带UUIE
             VOS_ERR        :   UUS1消息未激活,不携带UUIE
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2010年7月27日
    作    者   : zhoujun /40661
    修改内容   : 新生成函数

*****************************************************************************/
VOS_UINT32  NAS_CC_GetMsgUus1Info(
    NAS_CC_ENTITY_ID_T                  entityId,
    NAS_CC_MSG_TYPE_ENUM_U8             enMsgType,
    NAS_CC_IE_USER_USER_STRU            *pstUuieInfo
)
{
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enCurrMode;
    VOS_UINT32                          i;
    NAS_CC_BC_PARAMS_STRU               stBcParams;

    PS_MEM_SET(pstUuieInfo,0x00,sizeof(NAS_CC_IE_USER_USER_STRU));

    /* 不支持G模下UUS1的隐式激活 */
    enCurrMode = NAS_MML_GetCurrNetRatType();
    if ( TAF_PH_RAT_GSM == enCurrMode )
    {
        return VOS_ERR;
    }

    /*  获取当前电话类型,语音或数据 */
    NAS_CC_GetBcParams(entityId, NAS_CC_BC_PARAM_CURR, &stBcParams);

    if ( ( NAS_CC_ITC_SPEECH != stBcParams.enItc )
      && ( NAS_CC_ITC_AUXILIARY_SPEECH != stBcParams.enItc ))
    {
        return VOS_ERR;
    }

    /* 查找列表中该消息是否激活 */
    for ( i = 0 ; i < NAS_CC_MAX_UUIE_MSG_NUM ; i++ )
    {
        if ( ( enMsgType == f_astUus1MsgBuf[i].enMsgType)
          && (VOS_TRUE == f_astUus1MsgBuf[i].stUuieInfo.IsExist))
        {
            break;
        }
    }

    /* 如果该消息已经激活获取UUIE信息 */
    if ( i < NAS_CC_MAX_UUIE_MSG_NUM )
    {
        PS_MEM_CPY(pstUuieInfo,
                   &(f_astUus1MsgBuf[i].stUuieInfo),
                   sizeof(f_astUus1MsgBuf[i].stUuieInfo));

        return VOS_OK;
    }

    /* 未能找到直接返回未激活 */
    return VOS_ERR;

}
VOS_UINT32  NAS_MMC_RcvWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_RESUME_IND_ST                  stResumeIndMsg;

    /* 停止定时器 */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF);

    /* 根据挂起的发起方,构造一条恢复消息 */
    NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg);

    /* 向MM/GMM进行恢复 */
    NAS_MMC_SndGmmResumeInd(&stResumeIndMsg);

    NAS_MMC_SndMmResumeInd(&stResumeIndMsg);

    NAS_MML_InitCampRai(NAS_MML_GetCurrCampPlmnInfo());

    /* 更新服务状态 */
    NAS_MMC_SetCsServiceStatus(NAS_MMC_NO_SERVICE);
    NAS_MMC_SetPsServiceStatus(NAS_MMC_NO_SERVICE);


    /* 向MM/GMM/TAF报出服务区流程 */
    NAS_MMC_SndMmCoverageLostInd();

    NAS_MMC_SndGmmCoverageLostInd();

    /* 更新服务状态 */
    NAS_MMC_SndMmaCoverageInd( MMA_MMC_COVERAGE_AREA_CHANGE_MODE_LOST );

    /* 通知TAF当前的服务状态 */
    NAS_MMC_SndMmaServiceStatusInd(MMA_MMC_SRVDOMAIN_CS_PS,
                                           MMA_MMC_SERVICE_STATUS_NO_SERVICE);


    /* 更新驻留状态 */
    NAS_MMC_SetAsCellCampOn(NAS_MMC_AS_CELL_NOT_CAMP_ON);

    /* 根据接口约定,当WRR发送RRMM_SUSPEND_REL_CNF时,已经进入了IDLE,但是WRR不会向MM/GMM发送连接释放指示,
       所以MMC需要本地清除连接标志 */
    NAS_MML_SetRrcConnStatusFlg(VOS_FALSE);

    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_ABORTED, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出当前状态机 */
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;
}
VOS_UINT32  NAS_MMC_RcvRrMmRelInd_InterSysOos_WaitAsResumeInd(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_RESUME_IND_ST                  stResumeIndMsg;

    /* 无需判断原因值 */


    /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND);

    if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType())
    {
        /* 清除小区信息以及信号量 */
        NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo());
    }

    NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA);

    /* 生成RESUME消息 */
    NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg);

    /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */
    NAS_MMC_SndGmmResumeInd(&stResumeIndMsg);
    NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_GMM_RESUME_RSP_FLG);

    NAS_MMC_SndMmResumeInd(&stResumeIndMsg);
    NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_MM_RESUME_RSP_FLG);

    /* 迁入到NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP状态 */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP);
    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN);

    return VOS_TRUE;
}
Ejemplo n.º 13
0
VOS_UINT32 NAS_MMC_RcvGasResumeInd_InterSysHo_WaitAsResumeInd(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_RESUME_IND_ST                 *pstResumeIndMsg = VOS_NULL_PTR;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enOldNtType;

    /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND);

    if ( NAS_MML_NET_RAT_TYPE_GSM != NAS_MML_GetCurrNetRatType())
    {
        /* 清除小区信息以及信号量 */
        NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo());
    }


    NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_GSM);


    /* 生成RESUME消息 */
    pstResumeIndMsg                 = (RRMM_RESUME_IND_ST *)pstMsg;

    enOldNtType     = NAS_MMC_GetSuspendOrigenRatType(NAS_MMC_GetCurrEntryMsg());

    /* GU之间的切换,CS信令连接存在 */
    if (NAS_MML_NET_RAT_TYPE_WCDMA == enOldNtType)
    {    
        NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_TRUE);
    }
    
    /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */
    NAS_MMC_SndMmResumeInd_Handover(pstResumeIndMsg, NAS_MMC_GetCsSigExistFlag_InterSysHo());
    NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_GMM_RESUME_RSP_FLG);
    NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_FALSE);

    /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */
    NAS_MMC_SndGmmResumeInd_Handover(pstResumeIndMsg, NAS_MMC_GetPsSigExistFlag_InterSysHo());
    NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG);    
    NAS_MMC_SetPsSigExistFlag_InterSysHo(VOS_FALSE);

    /* 迁入到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP状态 */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP);

    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN);

    return VOS_TRUE;
}
VOS_UINT32  NAS_MMC_RcvTiWaitWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_RESUME_IND_ST                  stResumeIndMsg;

    /* 异常打印 */
    NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf:ENTERED");

    /* 根据挂起的发起方,构造一条恢复消息 */
    NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg);

    /* 向MM/GMM进行恢复 */
    NAS_MMC_SndGmmResumeInd(&stResumeIndMsg);

    NAS_MMC_SndMmResumeInd(&stResumeIndMsg);

    NAS_MML_InitCampRai(NAS_MML_GetCurrCampPlmnInfo());

    /* 更新服务状态 */
    NAS_MMC_SetCsServiceStatus(NAS_MMC_NO_SERVICE);
    NAS_MMC_SetPsServiceStatus(NAS_MMC_NO_SERVICE);


    /* 向MM/GMM/TAF报出服务区流程 */
    NAS_MMC_SndMmCoverageLostInd();

    NAS_MMC_SndGmmCoverageLostInd();

    /* 更新服务状态 */
    NAS_MMC_SndMmaCoverageInd( MMA_MMC_COVERAGE_AREA_CHANGE_MODE_LOST );

    /* 通知TAF当前的服务状态 */
    NAS_MMC_SndMmaServiceStatusInd(MMA_MMC_SRVDOMAIN_CS_PS,
                                           MMA_MMC_SERVICE_STATUS_NO_SERVICE);


    /* 更新驻留状态 */
    NAS_MMC_SetAsCellCampOn(NAS_MMC_AS_CELL_NOT_CAMP_ON);

    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_ABORTED, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出当前状态机 */
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;

}
Ejemplo n.º 15
0
VOS_UINT32 NAS_MMC_RcvRrMmRelInd_InterSysHo_WaitAsResumeInd(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    RRMM_REL_IND_STRU                  *pstRelInd = VOS_NULL_PTR;
    RRMM_RESUME_IND_ST                  stResumeIndMsg;

    pstRelInd      = (RRMM_REL_IND_STRU*)pstMsg;


    /* 释放原因为Utran release时,需要继续HO流程,继续等待resume ind,
       其它认为流程结束,代表WAS恢复,即等同WAS发送了resume ind,但连接已不存在 */
    if (RRC_REL_CAUSE_UTRAN_RELEASE == pstRelInd->ulRelCause)
    {
        return VOS_TRUE;
    }

    if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType())
    {
        /* 清除小区信息以及信号量 */
        NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo());
    }

    NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA);

    /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND);

    /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */
    PS_MEM_SET(&stResumeIndMsg, 0x0, sizeof(stResumeIndMsg));
    NAS_MMC_SndMmResumeInd_Handover(&stResumeIndMsg, NAS_MMC_GetCsSigExistFlag_InterSysHo());
    NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_GMM_RESUME_RSP_FLG);
    NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_FALSE);

    /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */
    NAS_MMC_SndGmmResumeInd_Handover(&stResumeIndMsg, NAS_MMC_GetPsSigExistFlag_InterSysHo());
    NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG);    
    NAS_MMC_SetPsSigExistFlag_InterSysHo(VOS_FALSE);

    /* 迁入到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP状态 */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP);
    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN);

    return VOS_TRUE;
}
VOS_UINT32 NAS_MMC_RcvWasResumeInd_InterSysOos_WaitWasSuspendRelCnf(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    /* 对冲场景的处理:刚给接入层发过RRMM_SUSPEND_REL_REQ就收到接入层的RRMM_RESUME_IND
       按照收到RRMM_RESUME_IND消息处理,后续收到RRMM_SUSPEND_REL_CNF丢弃 */

    RRMM_RESUME_IND_ST                 *pstResumeIndMsg = VOS_NULL_PTR;

    /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */
    NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND);

    if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType())
    {
        /* 清除小区信息以及信号量 */
        NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo());
    }

    NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA);


    /* 生成RESUME消息 */
    pstResumeIndMsg                 = (RRMM_RESUME_IND_ST *)pstMsg;

    /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */
    NAS_MMC_SndGmmResumeInd(pstResumeIndMsg);
    NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_GMM_RESUME_RSP_FLG);

    /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */
    NAS_MMC_SndMmResumeInd(pstResumeIndMsg);
    NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_MM_RESUME_RSP_FLG);

    /* 迁入到NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP状态 */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP);

    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN);

    return VOS_TRUE;
}
Ejemplo n.º 17
0
VOS_UINT32 NAS_MMC_RcvTiWaitMmResumeRspExpired_InterSysHo_WaitMmResumeRsp(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    /* 异常打印 */
    NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitMmResumeRspExpired_InterSysHo_WaitMmResumeRsp:ENTERED");

    /* 向接入发送恢复回复 */
    NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType());

    /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */


    /* 发送状态机成功的结果 */
    NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR);

    /* 退出当前状态机: */
    NAS_MMC_FSM_QuitFsmL2();

    return VOS_TRUE;
}
VOS_UINT8 NAS_UTRANCTRL_IsUtranPsSmcNeeded(VOS_VOID)
{
    VOS_UINT8                           ucIsUtranTddPsSmcNeeded;

    ucIsUtranTddPsSmcNeeded             = NAS_UTRANCTRL_GetUtranTddPsSmcNeededFlg();
    
    /* 当前不在UTRAN模式下,则不需要UTRAN SMC检测 */
    if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType() )
    {
        return VOS_FALSE;
    }

    /* 当前在TDD模式下,且用户配置不需要CS SMC,则返回不需要SMC检测 */
    if ( (NAS_UTRANCTRL_UTRAN_MODE_TDD == NAS_UTRANCTRL_GetCurrUtranMode())
      && (VOS_FALSE                    == ucIsUtranTddPsSmcNeeded) )
    {
        return VOS_FALSE;
    }
    
    /* 当前在FDD模式下或者TDD时需要检测SMC时候,则需要进行SMC */
    return VOS_TRUE;

}
Ejemplo n.º 19
0
NAS_MML_NET_RAT_TYPE_ENUM_UINT8 NAS_MMC_GetDestModeRat_SysCfg(
    MMA_MMC_SYS_CFG_SET_REQ_STRU        *pstSysCfgSetParm
)
{
    VOS_UINT32                          ulFlg;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enDestModeRat;

    /* 若当前的接入技术被设置为无效,则目标模为SYSCFG设置的优先的接入技术 */
    ulFlg             = NAS_MMC_IsCurrentRatSetted_SysCfg(pstSysCfgSetParm);
    if ( VOS_FALSE    == ulFlg )
    {
        /* 若接入技术的改变导致搜网,目标模为SYSCFG设置的优先的接入技术 */
        enDestModeRat = pstSysCfgSetParm->stRatPrioList.aucRatPrio[0];

        return enDestModeRat;
    }

    /* 否则目标模为当前的接入技术类型,若当前的接入技术为BUTT类型,
       则SYSCFG设置的先后顺序为L->W->G */
    enDestModeRat     = NAS_MML_GetCurrNetRatType();

    return enDestModeRat;
}
VOS_VOID GMM_TimReadyExpired(VOS_VOID)
{
    VOS_UINT32                          ulT3311Status;
    VOS_UINT32                          ulT3302Status;

    if (GMM_DEREGISTERED_NORMAL_SERVICE == g_GmmGlobalCtrl.ucState)
    {
        gstGmmCasGlobalCtrl.GmmSrvState     = GMM_IU_PMM_DETACHED;
    }
    else
    {
        gstGmmCasGlobalCtrl.GmmSrvState     = GMM_AGB_GPRS_STANDBY;
    }

    /* WCDMA模式,由HSS 4100 V100R001代码处理 */
    if (NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
    {
        /* 在注册状态,并且服务状态是空闲态时,启动3312 */
        if ((0x20 == (g_GmmGlobalCtrl.ucState & 0xF0))
         && (GMM_FALSE == g_GmmGlobalCtrl.ucSigConFlg)
         && (GMM_TRUE != g_GmmRauCtrl.ucT3312ExpiredFlg ))
        {
#if (FEATURE_LTE == FEATURE_ON)
            if (GMM_TIMER_T3312_FLG != (GMM_TIMER_T3312_FLG & g_GmmTimerMng.ulTimerRunMask))
            {
                NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_START);
            }
#endif
            Gmm_TimerStart(GMM_TIMER_T3312);
        }
        return;     /* 不需处理返回 */
    }

    if (GMM_DEREGISTERED_NORMAL_SERVICE == g_GmmGlobalCtrl.ucState)
    {
        gstGmmCasGlobalCtrl.GmmSrvState     = GMM_IU_PMM_DETACHED;
    }
    else
    {
        ulT3311Status = NAS_GMM_QryTimerStatus(GMM_TIMER_T3311);
        ulT3302Status = NAS_GMM_QryTimerStatus(GMM_TIMER_T3302);

        if ((GMM_REGISTERED_ATTEMPTING_TO_UPDATE_MM == g_GmmGlobalCtrl.ucState)
          || (GMM_REGISTERED_ATTEMPTING_TO_UPDATE == g_GmmGlobalCtrl.ucState))
        {
            if ((VOS_FALSE == ulT3311Status)
             && (VOS_FALSE == ulT3302Status))
            {
#if (FEATURE_LTE == FEATURE_ON)
                if (GMM_TIMER_T3312_FLG != (GMM_TIMER_T3312_FLG & g_GmmTimerMng.ulTimerRunMask))
                {
                    NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_START);
                }
#endif
                Gmm_TimerStart(GMM_TIMER_T3312);
            }
        }
        else
        {
            if ((0x10 != (g_GmmGlobalCtrl.ucState & 0xF0))
             && (GMM_REGISTERED_INITIATED != g_GmmGlobalCtrl.ucState))
                {
#if (FEATURE_LTE == FEATURE_ON)
                if (GMM_TIMER_T3312_FLG != (GMM_TIMER_T3312_FLG & g_GmmTimerMng.ulTimerRunMask))
                {
                    NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_START);
                }
#endif
                Gmm_TimerStart(GMM_TIMER_T3312);
            }
        }

        gstGmmCasGlobalCtrl.GmmSrvState     = GMM_AGB_GPRS_STANDBY;
    }

    NAS_GMM_SndGasInfoChangeReq(NAS_GSM_MASK_GSM_GMM_STATE);


    return;
}
Ejemplo n.º 21
0
VOS_VOID MmMsgProc (struct MsgCB* pMsg)
{
    VOS_VOID                *pRcvMsg = VOS_NULL_PTR;                            /* 接收消息使用的头地址定义                 */
    MSG_HEADER_STRU         *pMsgHeader;                                        /* 定义MSG_HEADER_STRU类型指针              */
    VOS_UINT32               aulRcvTimerMsg[4];                                 /* 接收消息使用的临时内存定义               */
    REL_TIMER_MSG           *pTimerMsg = VOS_NULL_PTR;
    VOS_UINT8                ucEventId = MM_EVENT_ID_INVALID;
    MM_MSG_MM_STATUS_STRU    Msg;

    if (VOS_NULL_PTR == pMsg)
    {
        MM_WARN_LOG( "\nMM:MmMsgProc:MM Msg is null!");

        return;
    }

    NAS_MM_LogMmStateInfo(g_MmGlobalInfo.ucState);

#ifdef __PS_WIN32_RECUR__
    if ((WUEPS_PID_MM == pMsg->ulSenderPid) && (WUEPS_PID_MM == pMsg->ulReceiverPid))
    {
        NAS_MM_RestoreContextData(pMsg);
    }
#endif

    if (g_NasMmImportFunc.ucFuncEnvironment != NAS_MML_GetCurrNetRatType() )
    {
        MM_SndMsgFuncChg();
    }


    /* 等待主Task发来的MM启动消息 */
    switch (gucMmProcessFlg)
    {
    case WAIT_FOR_NORMAL_MSG:                                                   /* 等待处理正常消息:                        */
        pRcvMsg = (VOS_VOID *)pMsg;
        if (PC_PID_TOOL == pMsg->ulSenderPid)
        {
            ucEventId = 78;
        }
        else if (VOS_PID_TIMER == pMsg->ulSenderPid)
        {
            pTimerMsg = (REL_TIMER_MSG *)pMsg;
            aulRcvTimerMsg[1] = pTimerMsg->ulName;
            aulRcvTimerMsg[2] = pTimerMsg->ulPara;


            ucEventId = Mm_Timer_Event_Analy(aulRcvTimerMsg);
        }
        else if ( WUEPS_PID_OM == pMsg->ulSenderPid )
        {
            pMsgHeader = (MSG_HEADER_STRU *)pMsg;
            /*if (AGENT_MM_INQUIRE == ulMsgId )*/
            if (AGENT_MM_INQUIRE == pMsgHeader->ulMsgName)
            {
                ucEventId = 78;
            }
            else
            {
                ucEventId = MM_EVENT_ID_INVALID;
            }
        }
        else if (WUEPS_PID_ADMIN == pMsg->ulSenderPid)
        {
            pMsgHeader = (MSG_HEADER_STRU *)pMsg;
            if (WUEPS_RESET_REQ == pMsgHeader->ulMsgName)
            {
                Mm_TimerStop(MM_TIMER_STOP_ALL);
                if (MM_TIMER_START == gstMmTimerSuspend.ucTimerStatus)
                {
                    if (VOS_OK !=
                        Mm_StopRelTimer(WUEPS_PID_MM, MM_TIMER_PROTECT_SUSPEND, &(gstMmTimerSuspend.stTimer)))
                    {
                        PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: Mm_StopRelTimer VOS_ERRNO_RELTM_STOP_TIMERINVALID.");
                    }
                    gstMmTimerSuspend.ucTimerStatus = MM_TIMER_STOPPED;
                }
                PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: ADMIN Reset order.");
                gucMmProcessFlg = WAIT_FOR_WUEPS_START;                         /* 等待ADMIN发送启动原语                    */
                break;
            }
        }
        else
        {
            pMsgHeader = ( MSG_HEADER_STRU* )pMsg;                              /* 得到消息头                               */
            ucEventId = Mm_Event_Analy(pMsgHeader);
        }

        PS_LOG2(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "MmMsgProc:INFO: MM* Receive Msg,EventId,State:",ucEventId,g_MmGlobalInfo.ucState);

        if ( MM_EVENT_ID_STATUS_95 == ucEventId )
        {
            PS_MEM_SET(&g_MmMsgMmInfo, 0, sizeof(MM_MSG_MM_INFO_STRU));

            Msg.MmIeRjctCause.ucRejCause
                = NAS_MML_REG_FAIL_CAUSE_SEMANTICALLY_INCORRECT_MSG;
            Mm_ComMsgMmStatusSnd(&Msg);
            ucEventId = MM_EVENT_ID_INVALID;
        }
        if ( MM_EVENT_ID_STATUS_96 == ucEventId )
        {
            PS_MEM_SET(&g_MmMsgMmInfo, 0, sizeof(MM_MSG_MM_INFO_STRU));

            Msg.MmIeRjctCause.ucRejCause
                = NAS_MML_REG_FAIL_CAUSE_INVALID_MANDATORY_INF;
            Mm_ComMsgMmStatusSnd(&Msg);
            ucEventId = MM_EVENT_ID_INVALID;
        }
        g_MmSubLyrShare.MmShare.MmSuspendEvent = ucEventId;
        if ( MM_EVENT_ID_INVALID != ucEventId )
        {
            gaMmStateTable[ucEventId - 1][g_MmGlobalInfo.ucState](pRcvMsg);
        }

        /* 收到GU模系统消息后,需要更新MM中保存的net type */
        if ( 5 ==  ucEventId)
        {
            g_MmGlobalInfo.enPreRatType = NAS_MML_GetCurrNetRatType();
        }

        break;
    case WAIT_FOR_WUEPS_START:                                                  /* 等待WUEPS_START_REQ消息                  */

        if (VOS_PID_TIMER == pMsg->ulSenderPid)
        {
        }
        else
        {
            pMsgHeader = ( MSG_HEADER_STRU* )pMsg;                              /* 得到消息头                               */

            if (( WUEPS_START_REQ == pMsgHeader->ulMsgName) &&
                ( WUEPS_PID_ADMIN == pMsgHeader->ulSenderPid ))
            {                                                                   /* 是WUEPS_START_REQ消息 */
                #ifdef __PS_WIN32_RECUR__
                Mm_ComInit();
                #endif

                gucMmProcessFlg = WAIT_FOR_MMCMM_START_REQ;                      /* 状态迁移到"等待MMCMM_START_REQ消息"      */
            }
            else
            {                                                                   /* 无操作;                                  */
            }

        }

        break;
    case WAIT_FOR_MMCMM_START_REQ:                                              /* 等待MMCMM_START_REQ消息:                 */

        if (VOS_PID_TIMER == pMsg->ulSenderPid)
        {
        }
        else
        {
            pRcvMsg = (VOS_VOID *)pMsg;                                             /* 读取消息地址                             */
            pMsgHeader = ( MSG_HEADER_STRU* )pMsg;                              /* 得到消息头                               */

            if (( MMCMM_START_REQ == pMsgHeader->ulMsgName) &&
                 ( WUEPS_PID_MMC == pMsgHeader->ulSenderPid ))
            {                                                                   /* 是MMCGMM_START_REQ消息 */
                Mm_ComInit();
                ucEventId = Mm_Event_Analy(pMsgHeader);

                if ( MM_EVENT_ID_INVALID != ucEventId )
                {
                    gaMmStateTable[ucEventId - 1]
                                    [g_MmGlobalInfo.ucState](pRcvMsg);
                    gucMmProcessFlg = WAIT_FOR_NORMAL_MSG;                       /* 状态迁移到"等待处理正常消息"             */

                    #ifndef __PS_WIN32_RECUR__

                    if ( VOS_TRUE == NAS_MML_IsSndOmPcRecurMsgValid() )
                    {
                        NAS_MM_SndOutsideContextData();
                    }

                    #endif
                }

            }
            /*A32D11534==>*/
            else if ((( MMCC_EST_REQ == pMsgHeader->ulMsgName)
                && ( WUEPS_PID_CC == pMsgHeader->ulSenderPid ))
             ||  (( MMSS_EST_REQ == pMsgHeader->ulMsgName)
                && ( WUEPS_PID_SS == pMsgHeader->ulSenderPid ))
             ||  (( MMSMS_EST_REQ == pMsgHeader->ulMsgName)
                &&( WUEPS_PID_SMS == pMsgHeader->ulSenderPid )))
            {
                ucEventId = Mm_Event_Analy(pMsgHeader);
                if ( MM_EVENT_ID_INVALID != ucEventId )
                {
                    gaMmStateTable[ucEventId - 1][MM_STATE_NULL](pRcvMsg);
                }
            }
            /*<==A32D11534*/
            else
            {                                                                   /* 无操作;                                  */
            }

        }

        break;
     default:
        PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: gucMmProcessFlg is Abnormal");
         break;
    }
/*
#ifndef __PS_WIN32_RECUR__
    NAS_MML_SetUePcRecurFlg(VOS_TRUE);
#endif
*/
}
Ejemplo n.º 22
0
VOS_UINT32 NAS_MM_RestoreContextData(struct MsgCB * pMsg)
{
    NAS_MML_PC_REPLAY_COMPRESS_CONTEXT_STRU                 *pstRcMsg;
    VOS_UINT32                                               ulExpectCount;
    VOS_UINT32                                               ulCount;
    VOS_UINT32                                               ulItemCount;
    VOS_UINT8                                               *pucDest;
    VOS_UINT8                                               *pucSrc;
    VOS_UINT32                                               ulDestLen;

    ulExpectCount = 0;
    ulCount       = 0;
    ulItemCount   = 0;
    ulExpectCount  = sizeof(VOS_UINT8)                     /* gucMmProcessFlg */
                   + sizeof(VOS_UINT8)                     /* g_T3211Flag*/
                   + sizeof(MM_NSD_INFO_ST)                /* g_stMmNsd*/
                   + sizeof(MM_GLOBAL_CTRL_STRU)           /* g_MmGlobalInfo*/
                   + sizeof(MM_TIMER_STRU) * MM_TIMER_NUM; /*gstMmTimer*/

    pstRcMsg = (NAS_MML_PC_REPLAY_COMPRESS_CONTEXT_STRU *)pMsg;
    pucSrc   = pstRcMsg->aucData;

    /* 解析总长度 */
    PS_MEM_CPY(&ulCount, pucSrc, sizeof(VOS_UINT32));
    pucSrc += sizeof(VOS_UINT32);

    if( ulExpectCount != ulCount )
    {
        return VOS_FALSE;
    }

    /* gucMmProcessFlg目标地址 */
    pucDest     = (VOS_UINT8 *)&gucMmProcessFlg;
    ulDestLen   = sizeof(gucMmProcessFlg);

    /* 解压缩 */
    if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) )
    {
        return VOS_FALSE;
    }
    pucSrc += (ulItemCount);

    /* g_T3211Flag目标地址 */
    pucDest     = (VOS_UINT8 *)&g_T3211Flag;
    ulDestLen   = sizeof(g_T3211Flag);

    /* 解压缩 */
    if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) )
    {
        return VOS_FALSE;
    }
    pucSrc += (ulItemCount);

    /* g_stMmNsd目标地址 */
    pucDest     = (VOS_UINT8 *)&g_stMmNsd;
    ulDestLen   = sizeof(MM_NSD_INFO_ST);

    /* 解压缩 */
    if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) )
    {
        return VOS_FALSE;
    }
    pucSrc += (ulItemCount);

    /* g_MmGlobalInfo目标地址 */
    pucDest     = (VOS_UINT8 *)&g_MmGlobalInfo;
    ulDestLen   = sizeof(MM_GLOBAL_CTRL_STRU);

    /* 解压缩 */
    if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) )
    {
        return VOS_FALSE;
    }
    pucSrc += (ulItemCount);


    /* gstMmTimer目标地址 */
    pucDest     = (VOS_UINT8 *)gstMmTimer;
    ulDestLen   = sizeof(MM_TIMER_STRU) * MM_TIMER_NUM;

    /* 解压缩 */
    if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) )
    {
        return VOS_FALSE;
    }
    pucSrc += (ulItemCount);

    NAS_MM_SetMmSigFunc(NAS_MML_GetCurrNetRatType());

    PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "NAS_MM_RestoreContextData - data is restored.");
    return VOS_TRUE;
}
Ejemplo n.º 23
0
VOS_VOID GMM_RcvMmcSuspendInd(VOS_VOID* pRcvMsg)
{
    MMCGMM_SUSPEND_IND_ST              *pSuspendIndMsg;
    NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enCurUtranMode;

#if (FEATURE_ON == FEATURE_LTE)
    VOS_UINT32                          ulGprsSuspendFlg;


    ulGprsSuspendFlg    = VOS_FALSE;
#endif

    /* GSM模式处理过程 */
    pSuspendIndMsg      = (MMCGMM_SUSPEND_IND_ST *)pRcvMsg;

    GMM_LOG_INFO("GMM_RcvMmcSuspendInd:Receive MMC_SUSPEND_IND");

    NAS_MML_SetPsTbfStatusFlg(VOS_FALSE);

    NAS_GMM_FreeGsmSysInfo();
    
    NAS_GMM_FreeWasSysInfo();

    /* 指示RABM当前系统模式, 并挂起RABM, bRatChangeFlg为TRUE */
    NAS_GMM_SndRabmSysSrvChgInd(pSuspendIndMsg->ucSuspendOrigen,
                                VOS_TRUE,
                                VOS_TRUE,
                                VOS_TRUE);



    if ( NAS_MML_NET_RAT_TYPE_GSM == pSuspendIndMsg->ucSuspendDestination)
    {
        NAS_GMM_SndGasInfoChangeReq(RRC_NAS_MASK_PTMSI_RAI | RRC_NAS_MASK_ATTACH);
    }

    switch (g_GmmGlobalCtrl.ucState)
    {
        case GMM_GPRS_SUSPENSION:
            gstGmmCasGlobalCtrl.GmmSrvState       = gstGmmSuspendCtrl.ucPreSrvState;

#if (FEATURE_ON == FEATURE_LTE)
            ulGprsSuspendFlg    = VOS_TRUE;
#endif

            break;

        case GMM_SUSPENDED_GPRS_SUSPENSION:
        case GMM_SUSPENDED_WAIT_FOR_SYSINFO:
            Gmm_TimerStop(GMM_TIMER_SUSPENDED);
            GMM_ResumeFailure();
            break;

        case GMM_SUSPENDED_NORMAL_SERVICE:
            GMM_LOG_WARN("GMM_RcvGasSuspensionInd:Receive RRMM_GPRS_SUSPENSION_IND in abnormal state.");
            return;
        case GMM_ROUTING_AREA_UPDATING_INITIATED:
            if (GMM_RAU_FOR_NORMAL != gstGmmSuspendCtrl.ucRauCause)
            {
                GMM_BufferMsgDump();
            }
            break;
        case GMM_DEREGISTERED_INITIATED:
            if (GMM_AGENT_USIM_AUTHENTICATION_CNF_FLG
                == (g_GmmReqCnfMng.ucCnfMask
                & GMM_AGENT_USIM_AUTHENTICATION_CNF_FLG))
            {
                Gmm_TimerStop(GMM_TIMER_PROTECT);
                g_GmmReqCnfMng.ucCnfMask
                    &= ~GMM_AGENT_USIM_AUTHENTICATION_CNF_FLG;
            }
            /*异系统改变时,如果RA发生改变,则RAU完成后继续Detach流程,
            如果RA没有改变,则通过Detach定时器超时保证Detach流程继续。异系统不改变时
            直接重新开始Detach流程*/
            g_GmmGlobalCtrl.ucFollowOnFlg = GMM_TRUE;
            NAS_MML_SetPsServiceBufferStatusFlg(VOS_TRUE);

            g_GmmGlobalCtrl.ucSpecProcHold = g_GmmGlobalCtrl.ucSpecProc;
            break;
        default:
            break;
    }

    /*保存切换之前的状态和网络模式*/
    if ((GMM_GPRS_SUSPENSION != g_GmmGlobalCtrl.ucState)
     && (GMM_SUSPENDED_NORMAL_SERVICE != g_GmmGlobalCtrl.ucState)
     && (GMM_SUSPENDED_GPRS_SUSPENSION != g_GmmGlobalCtrl.ucState)
     && (GMM_SUSPENDED_WAIT_FOR_SYSINFO != g_GmmGlobalCtrl.ucState))
    {
        gstGmmSuspendCtrl.ucPreState                  = g_GmmGlobalCtrl.ucState;
    }

    gstGmmSuspendCtrl.ucPreRat                    = NAS_MML_GetCurrNetRatType();
    gstGmmSuspendCtrl.ucSuspendCause              = pSuspendIndMsg->ucSuspendCause;

    /* 获取切换之前的服务状态 */
    if (NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
    {
        if (VOS_TRUE == NAS_GMM_IsDeregisterState(g_GmmGlobalCtrl.ucState))
        {
            gstGmmSuspendCtrl.ucPreSrvState       = GMM_IU_PMM_DETACHED;
        }
        else if (GMM_TRUE == g_GmmGlobalCtrl.ucSigConFlg)
        {
            gstGmmSuspendCtrl.ucPreSrvState       = GMM_IU_PMM_CONNECTED;
        }
        else
        {
            gstGmmSuspendCtrl.ucPreSrvState       = GMM_IU_PMM_IDLE;
        }
    }
    else if (NAS_MML_NET_RAT_TYPE_GSM == NAS_MML_GetCurrNetRatType())
    {
        gstGmmSuspendCtrl.ucPreSrvState           = gstGmmCasGlobalCtrl.GmmSrvState;
    }
    else
    {
        ;
    }

    if (MMC_SUSPEND_CAUSE_CELLCHANGE == pSuspendIndMsg->ucSuspendCause)
    {
        /* 备份GMM的全局变量,用于CCO回退时使用 */
        NAS_GMM_BackupCcoFallbackCtx();
    }


    GMM_SuspendTimer();

    Gmm_ComStaChg(GMM_SUSPENDED_NORMAL_SERVICE);

    /* HO过程中,L进行挂起请求时,需要向L获取安全上下文 */
#if   (FEATURE_ON == FEATURE_LTE)
    /* 3GPP 24008 4.7.5.1.1章节描述:
       If the routing area updating procedure is not initiated by the MS due to
       an S1 mode to Iu mode or S1 mode to A/Gb mode intersystem change,
       or if it is initiated due to such an intersystem change and the TIN
       indicates "RAT related TMSI", the MS shall use the existing UMTS
       security context for the PS domain. The ROUTING AREA UPDATE REQUEST
       message shall contain the P-TMSI signature when received in a previous
       ATTACH ACCEPT or ROUTING AREA UPDATE ACCEPT message.
       If the MS has a valid UMTS security context, the MS shall indicate
       it in the GPRS ciphering key sequence number IE.*/

    if ((MMC_SUSPEND_CAUSE_HANDOVER == pSuspendIndMsg->ucSuspendCause)
     && (NAS_MML_NET_RAT_TYPE_LTE == pSuspendIndMsg->ucSuspendOrigen))
    {
        /* 备份PS的安全上下文,由于HO失败的回退 */
        PS_MEM_CPY(&(g_GmmGlobalCtrl.stBackupShare.stSimPsSecurity),
                   NAS_MML_GetSimPsSecurity(), sizeof(NAS_MML_SIM_PS_SECURITY_INFO_STRU));           

    
        /* 给L模发送GMM_LMM_HO_SECU_INFO_REQ */
        NAS_GMM_SndLmmHoSecuInfoReq();

        gstGmmSuspendCtrl.ucGetLteSecContext = VOS_TRUE;

        /* 启动定时器 */
        Gmm_TimerStart(GMM_TIMER_WAIT_GET_HO_SECU_INFO_CNF);

        return;
    }
    /* 如果挂起目的方为LTE,通知LMM模块Gmm的连接状态 */
    if ((NAS_MML_NET_RAT_TYPE_LTE == pSuspendIndMsg->ucSuspendDestination)
     && (NAS_MML_NET_RAT_TYPE_LTE != pSuspendIndMsg->ucSuspendOrigen))
    {
        /* 只带G模的连接状态,不带PS域状态是挂起还是正常,在收到gas的gprs suspend ind消息时通知 */
        NAS_GMM_SndLmmInfoChangeNotifyReq(NAS_MML_GetCurrNetRatType(),
                                          VOS_TRUE,
                                          VOS_FALSE,
                                          gstGmmSuspendCtrl.ucPreSrvState,
                                          ulGprsSuspendFlg);
    }

#endif

#if (defined(__PS_WIN32_RECUR__)) || ( VOS_WIN32 == VOS_OS_VER )
    if (1 == g_ulGmmDelaySuspendRsp)
    {
        Gmm_TimerStart(GMM_TIMER_TC_DELAY_SUSPEND_RSP);
        return;
    }
#endif


    /* 由于GCF测试原因,TC状态下,在W2G的异系统切换情况下,需要延迟一定时间再回复
       挂起结果。于是启动定时器,待定时器超时后再回复挂起结果。
       由于此处状态已迁移,故使用切换之前GMM状态进行判断。
       W2L挂起时,此处不知道挂起的目的方,故也会做此处理,但只会延迟上报挂起结果,没有其它影响 */
    /* 挂起目的方为GSM,启动定时器,为LTE时不启动定时器 */
    enCurUtranMode = NAS_UTRANCTRL_GetCurrUtranMode();

    if ((NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
     && (GMM_TC_ACTIVE == gstGmmSuspendCtrl.ucPreState)
     && (NAS_UTRANCTRL_UTRAN_MODE_FDD == enCurUtranMode)
     && (NAS_MML_NET_RAT_TYPE_GSM == pSuspendIndMsg->ucSuspendDestination))
    {
        Gmm_TimerStart(GMM_TIMER_TC_DELAY_SUSPEND_RSP);
        return;
    }


    Gmm_TimerStart(GMM_TIMER_SUSPENDED);

    GMM_SndMmcSuspendRsp();
}
Ejemplo n.º 24
0
VOS_VOID NAS_GMM_ResumeCcoFallbackCtx(VOS_VOID)
{

    /* 对g_GmmGlobalCtrl的成员变量赋值,赋值的来源
       来自于g_GmmGlobalCtrl.stBackupShare */

    NAS_MML_EQUPLMN_INFO_STRU          *pstBackupEplmnList;
    NAS_MML_EQUPLMN_INFO_STRU          *pstCurrentEplmnList;

#if (FEATURE_ON == FEATURE_LTE)
    NAS_MML_RPLMN_CFG_INFO_STRU        *pstRplmnCfgInfo = VOS_NULL_PTR;

    pstRplmnCfgInfo = NAS_MML_GetRplmnCfg();
#endif


    g_GmmGlobalCtrl.ucState                                 = g_GmmGlobalCtrl.stBackupShare.ucState;

    g_GmmGlobalCtrl.ucNetMod                                = g_GmmGlobalCtrl.stBackupShare.ucNtMod;

    g_GmmGlobalCtrl.ucSigConFlg                             = g_GmmGlobalCtrl.stBackupShare.ucPsSigConnFlg;

    g_MmSubLyrShare.GmmShare.ucPsIntegrityProtect           = g_GmmGlobalCtrl.stBackupShare.enPsIntegrityProtect;

    g_GmmRauCtrl.ucRauAttmptCnt                             = g_GmmGlobalCtrl.stBackupShare.ucRauAttmptCnt;

    gstGmmCasGlobalCtrl.GmmSrvState                         = g_GmmGlobalCtrl.stBackupShare.ucSrvState;

    /* PS域的security information */
    g_GmmGlobalCtrl.PsSecutityInfo = g_GmmGlobalCtrl.stBackupShare.stPsSecutityInfo;

    /* 上次驻留的系统信息  */
    g_GmmGlobalCtrl.SysInfo = g_GmmGlobalCtrl.stBackupShare.stSysInfo;

    /* UE 信息 */
    g_GmmGlobalCtrl.UeInfo = g_GmmGlobalCtrl.stBackupShare.stUeInfo;

    NAS_MML_SetPsUpdateStatus(g_GmmGlobalCtrl.stBackupShare.stUeInfo.ucUpdateSta);


    NAS_GMM_LogGmmStateInfo(g_GmmGlobalCtrl.ucState);

    GMM_ResumeTimer(GMM_TIMER_NOT_RESUME);

    pstBackupEplmnList  = &(g_GmmGlobalCtrl.stBackupShare.stBackupEquPlmnInfo);

    pstCurrentEplmnList = NAS_MML_GetEquPlmnList();

    if (VOS_TRUE == NAS_MML_IsEquPlmnInfoChanged(pstBackupEplmnList))
    {
        /* 将EPLMN保存到MML全局变量 */
        PS_MEM_CPY(pstCurrentEplmnList, pstBackupEplmnList, sizeof(NAS_MML_EQUPLMN_INFO_STRU));

        /* 将EPLMN更新到NV中 */
        NAS_GMM_WriteEplmnNvim(pstCurrentEplmnList);
    }


 #if (FEATURE_ON == FEATURE_LTE)
    NAS_GMM_WriteTinInfoNvim(g_GmmGlobalCtrl.stBackupShare.enTinType, pstRplmnCfgInfo->aucLastImsi);
    if (NAS_MML_TIN_TYPE_RAT_RELATED_TMSI != g_GmmGlobalCtrl.stBackupShare.enTinType)
    {
        Gmm_TimerStop(GMM_TIMER_T3323);

        /* ISR去激活,需要更新pdp激活是在ISR激活前激活的 */
        NAS_MML_UpdateAllPsBearIsrFlg(NAS_MML_PS_BEARER_EXIST_BEFORE_ISR_ACT);
    }

 #endif

    /* 根据备份前的3311定时器状态恢复启动 */
    if (0 != (g_GmmGlobalCtrl.stBackupShare.ucT3311Status & (0x00000001 << GMM_TIMER_T3311)))
    {
        Gmm_TimerStart(GMM_TIMER_T3311);
    }
	
	    
#if (defined(__PS_WIN32_RECUR__)) || ( VOS_WIN32 == VOS_OS_VER )
#else
{
    /* W下PMM-CONNECTED态需要停止3312 */
    if ((NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
     && (GMM_TRUE == g_GmmGlobalCtrl.ucSigConFlg))
    {
#if (FEATURE_LTE == FEATURE_ON)
        NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_STOP);
#endif
        Gmm_TimerStop(GMM_TIMER_T3312);
    }

    /* G下ready timer在运行则停止3312 */
    if ((NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType())
     && (GMM_TIMER_T3314_FLG == (g_GmmTimerMng.ulTimerRunMask & GMM_TIMER_T3314_FLG)))
    {
#if (FEATURE_LTE == FEATURE_ON)
        NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_STOP);
#endif
        Gmm_TimerStop(GMM_TIMER_T3312);
    }
}
    
#endif
}
Ejemplo n.º 25
0
VOS_UINT32  NAS_MMC_RcvMmaSysCfgSetReq_SysCfg_Init(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    MMA_MMC_SYS_CFG_SET_REQ_STRU        *pstSysCfgMsg        = VOS_NULL_PTR;

    VOS_UINT32                          ulRrcConnExistFlag;
    VOS_UINT32                          ulNeedSyscfgPlmnSrch;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enCurrRat;
    VOS_UINT32                          ulFlg;
    VOS_UINT32                          ulUsimStausFlg;
    NAS_MMC_PLMN_SELECTION_MODE_ENUM_UINT8 enPlmnSelectionMode;

    NAS_MML_PLMN_RAT_PRIO_STRU         *pstPrePrioRatList;
    NAS_MML_PLMN_RAT_PRIO_STRU          stSyscfgPrioRatList;

    pstPrePrioRatList = NAS_MML_GetMsPrioRatList();

    /* 取得当前的SYSCFG消息 */
    pstSysCfgMsg         = (MMA_MMC_SYS_CFG_SET_REQ_STRU *)pstMsg;


    /* 若用户设置的SYSCFG消息只有漫游特性改变,则不需要通知接入层 */
    if ( VOS_TRUE == pstSysCfgMsg->ucOnlyRoamParaChanged )
    {
        /* 向MMA回复SYSCFG设置成功原语 */
        NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_SUCCESS);

        /* 默认漫游设置不需要进行搜网 */
        ulNeedSyscfgPlmnSrch = VOS_FALSE;

        /* 判断SYSCFG对ROAM特性的设置是否需要导致搜网 */
        ulUsimStausFlg = NAS_MML_IsUsimStausValid();
        ulFlg          = NAS_MMC_CheckRoamSettingPlmnSelection_SysCfg(pstSysCfgMsg);
        if ( (VOS_TRUE == ulUsimStausFlg)
          && (VOS_TRUE == ulFlg) )
        {
            ulNeedSyscfgPlmnSrch = VOS_TRUE;
            /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */
            enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode();
            if ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode)
            {
                /* 保存指定搜网前驻留的PlmnID及接入技术 */
                NAS_MMC_SaveUserReselPlmnInfo();
            }
        }

        /* 保存用户设置的漫游信息 */
        NAS_MML_SetRoamCapability(pstSysCfgMsg->enRoamCapability);

        /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置成功 */
        NAS_MMC_SndSysCfgRslt(VOS_TRUE, ulNeedSyscfgPlmnSrch);

        /* 退出SYSCFG状态机 */
        NAS_MMC_FSM_QuitFsmL2();

        return VOS_TRUE;
    }


    /* 保存入口消息 */
    NAS_MMC_SaveCurEntryMsg(ulEventType, pstMsg);


    /* 根据当前模信息,完成向接入层下发SYSCFG顺序表的设置  */
    NAS_MMC_SetSysCfgSendingOrder_SysCfg( NAS_MMC_GetDestModeRat_SysCfg(pstSysCfgMsg) );

    /* 判断SYSCFG设置是否需要发起搜网 */
    ulNeedSyscfgPlmnSrch = NAS_MMC_IsPlmnSelectionNeeded_SysCfg(pstSysCfgMsg);

    /* 保存搜网信息到状态机上下文中 */
    NAS_MMC_SetPlmnSearchFlag_SysCfg(ulNeedSyscfgPlmnSrch);

    /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */
    enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode();
    if ( ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode)
      && (VOS_TRUE == ulNeedSyscfgPlmnSrch))
    {
        /* 保存指定搜网前驻留的PlmnID及接入技术 */
        NAS_MMC_SaveUserReselPlmnInfo();
    }

    /* 保持syscfg设置前的接入技术和优先级 */
    NAS_MMC_SetPrePrioRatList_SysCfg(pstPrePrioRatList);

    /* 赋值用户设置的接入技术优先级 */
    PS_MEM_CPY(&stSyscfgPrioRatList,
               &(pstSysCfgMsg->stRatPrioList),
               sizeof(NAS_MML_PLMN_RAT_PRIO_STRU) );
    NAS_MML_SetMsSysCfgPrioRatList(&stSyscfgPrioRatList);

    /* 获取当前模的信令链接存在信息 */
    ulRrcConnExistFlag   = NAS_MML_IsRrcConnExist();

    if ( (VOS_TRUE == ulNeedSyscfgPlmnSrch) && (VOS_FALSE == ulRrcConnExistFlag) )
    {
        /* 向GMM发送搜网指示 */
        NAS_MMC_SndGmmPlmnSchInit();

        /* 向MM发送搜网指示 */
        NAS_MMC_SndMmPlmnSchInit();
    }

    /* 当前不需要搜网或不存在信令链接 */
    if ( (VOS_FALSE == ulNeedSyscfgPlmnSrch)
      || (VOS_FALSE == ulRrcConnExistFlag) )
    {
        /* 获取需要设置SYSCFG的接入技术 */
        enCurrRat             = NAS_MMC_GetNextSettingRat_SysCfg();
        NAS_MMC_SetRatModeSysCfgReq_SysCfg(enCurrRat, pstSysCfgMsg);

        return VOS_TRUE;
    }

    /* 当前SYSCFG设置完后需要搜网,且当前有信令链接存在,则进行如下设置 */
#if (FEATURE_ON == FEATURE_LTE)

    /* 取得当前的接入模式 */
    enCurrRat            = NAS_MML_GetCurrNetRatType();
    if ( NAS_MML_NET_RAT_TYPE_LTE == enCurrRat )
    {
        /* 当前为L模,向lmm下发链接释放请求  */
        NAS_MMC_SndLmmRelReq();

        NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE);

        /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */
        NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_EPS_CONN_REL_IND);

        /* 启动等待L模回复定时器 */
        NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_EPS_CONN_REL_IND, TI_NAS_MMC_WAIT_EPS_CONN_REL_IND_LEN);

        return VOS_TRUE;
    }
#endif

    /* 当前在GU模下,主动请求释放链接 */
    NAS_MMC_SndMmRelReq();
    NAS_MMC_SndGmmRelReq();

    NAS_MMC_SetSpecPlmnSearchState(NAS_MMC_SPEC_PLMN_SEARCH_RUNNING);

    NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE);

    /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */
    NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_RRC_CONN_REL_IND);

    /* 启动等待回复定时器 */
    NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_RRC_CONN_REL, TI_NAS_MMC_WAIT_RRC_CONN_REL_LEN);

    return VOS_TRUE;
}
Ejemplo n.º 26
0
VOS_VOID GMM_RcvMmcResumeInd(VOS_VOID* pRcvMsg)
{
    MMCGMM_RESUME_IND_ST                *pResumeIndMsg;
    RRMM_REL_IND_STRU                    stRrMmRelIndMsg;
    NAS_MML_NET_RAT_TYPE_ENUM_UINT8      enCurrNetType;

    VOS_UINT8                            ulFallBackFlg;

#if (FEATURE_ON == FEATURE_LTE)
    VOS_UINT32                           ulIsNeedDeactiveIsrFlg;
    NAS_MML_RPLMN_CFG_INFO_STRU         *pstRplmnCfgInfo;

    pstRplmnCfgInfo = NAS_MML_GetRplmnCfg();
#endif

    ulFallBackFlg = VOS_FALSE;

    enCurrNetType = NAS_MML_GetCurrNetRatType();
    /* GSM模式处理过程 */
    pResumeIndMsg = (MMCGMM_RESUME_IND_ST *)pRcvMsg;

    /* 如果在W下指示RABM当前系统模式, 根据PsResumeResult挂起或恢复RABM, bRatChangeFlg为TRUE,
       如果在G下等到收到系统消息后恢复RABM */
    if (NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType)
    {
        /* L到W的HO成功, 需通知 RABM 等待等待W接入层RAB的恢复; */
        /* CCO回退过程中, 接入层会上报RAB SETUP和SUCCESS, 也需通知 RABM 等待等待W接入层RAB的恢复; */
        if ( MMC_SUSPEND_CAUSE_CELLCHANGE_FALLBACK == gstGmmSuspendCtrl.ucSuspendCause
#if   (FEATURE_ON == FEATURE_LTE)
          || ( (MMC_SUSPEND_CAUSE_HANDOVER == gstGmmSuspendCtrl.ucSuspendCause)
             &&(NAS_MML_NET_RAT_TYPE_LTE   == gstGmmSuspendCtrl.ucPreRat) )
#endif
        )
        {
            NAS_GMM_SndRabmSysSrvChgInd(enCurrNetType,
                                        VOS_TRUE,
                                        VOS_FALSE,
                                        VOS_FALSE);
        }
        else
        {
            NAS_GMM_SndRabmSysSrvChgInd(enCurrNetType,
                                        VOS_TRUE,
                                        VOS_FALSE,
                                        VOS_TRUE);
        }
    }
    else
    {
        NAS_GMM_SndRabmSysSrvChgInd(enCurrNetType,
                                        VOS_TRUE,
                                        VOS_TRUE,
                                        VOS_TRUE);
    }

    /* 接入技术发生改变 删除PS信令链接 */
    if ((gstGmmSuspendCtrl.ucPreRat != enCurrNetType)
     && (MMC_SUSPEND_CAUSE_HANDOVER != gstGmmSuspendCtrl.ucSuspendCause))
    {
        NAS_MML_SetPsSigConnStatusFlg(VOS_FALSE);

        g_GmmGlobalCtrl.ucSigConFlg = VOS_FALSE;
    }

    if ((VOS_TRUE                   == pResumeIndMsg->ucPsSigExistFlg)
     && (MMC_SUSPEND_CAUSE_HANDOVER == gstGmmSuspendCtrl.ucSuspendCause))
    {
        NAS_MML_SetPsSigConnStatusFlg(VOS_TRUE);
        g_GmmGlobalCtrl.ucSigConFlg = GMM_TRUE;
    }


    /* GMM向mmc发送resume rsp */
    NAS_GMM_SndMmcResumeRsp();


    if (GMM_SUSPENDED_NORMAL_SERVICE != g_GmmGlobalCtrl.ucState)
    {
        GMM_LOG_WARN("GMM_RcvMmcResumeInd:Receive MMCGMM_RESUME_IND in abnormal State.");
        return;
    }

    if (MMC_SUSPEND_CAUSE_CELLCHANGE_FALLBACK == gstGmmSuspendCtrl.ucSuspendCause )
    {
        NAS_GMM_ResumeCcoFallbackCtx();

        /* 在CCO过程中T3314可能超时,所以需要根据T3314的运行状态调整服务状态 */
        if ((VOS_FALSE == NAS_GMM_QryTimerStatus(GMM_TIMER_T3314))
         && (0xffffffff != gstGmmCasGlobalCtrl.ulReadyTimerValue)
         && (GMM_AGB_GPRS_READY == gstGmmCasGlobalCtrl.GmmSrvState))
        {
            gstGmmCasGlobalCtrl.GmmSrvState = GMM_AGB_GPRS_STANDBY;
        }

        if (GMM_REGISTERED_NORMAL_SERVICE == g_GmmGlobalCtrl.stBackupShare.ucState)
        {
            gstGmmSuspendCtrl.ucPreState = GMM_REGISTERED_NORMAL_SERVICE;
        }

        ulFallBackFlg = VOS_TRUE;

    }

    /*如果发生过系统间改变,需要通知接入层PTMSI信息*/
    if ( ( gstGmmSuspendCtrl.ucPreRat != enCurrNetType )
      && ( ( NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType )
        || ( NAS_MML_NET_RAT_TYPE_GSM == enCurrNetType ) ) )
    {

        /* 因为在进行TC测试发生系统间切换时,媒体无法进行声码器切换,
           在发生系统间切换时,并且切换成功时,需要通知TC切换事件,以便TC可以通知媒体.
           L to G时 不需要发此消息 */
        if ( (GMM_TC_ACTIVE == gstGmmSuspendCtrl.ucPreState)
          && (gstGmmSuspendCtrl.ucPreRat != NAS_MML_NET_RAT_TYPE_LTE) )
        {
            NAS_GMM_SndTcHandoverInd();
        }

#if (FEATURE_ON == FEATURE_LTE)
        ulIsNeedDeactiveIsrFlg = NAS_GMM_IsNeedDeactiveIsr_InterSys(gstGmmSuspendCtrl.ucPreRat, enCurrNetType);
        if (VOS_TRUE == ulIsNeedDeactiveIsrFlg)
        {
            NAS_GMM_WriteTinInfoNvim(NAS_MML_TIN_TYPE_GUTI, pstRplmnCfgInfo->aucLastImsi);
            Gmm_TimerStop(GMM_TIMER_T3323);

            /* ISR去激活,需要更新pdp激活是在ISR激活前激活的 */
            NAS_MML_UpdateAllPsBearIsrFlg(NAS_MML_PS_BEARER_EXIST_BEFORE_ISR_ACT);
        }
#endif

        /* 发生W到G异系统切换 */
        if (NAS_MML_NET_RAT_TYPE_GSM == enCurrNetType)
        {
            g_MmSubLyrShare.GmmShare.ucPsIntegrityProtect = NAS_MML_RRC_INTEGRITY_PROTECT_DEACTIVE;
            if ((0x10 != (gstGmmSuspendCtrl.ucPreState & 0xF0))
             && (GMM_REGISTERED_INITIATED != gstGmmSuspendCtrl.ucPreState))
            {
#if (FEATURE_LTE == FEATURE_ON)
                if (GMM_TIMER_T3312_FLG != (GMM_TIMER_T3312_FLG & g_GmmTimerMng.ulTimerRunMask))
                {
                    NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_START);
                }
#endif

                Gmm_TimerStart(GMM_TIMER_T3312);
            }
        }

        if ( (NAS_MML_NET_RAT_TYPE_GSM == enCurrNetType)
          || (NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType))
        {
            Gmm_SndRrmmNasInfoChangeReq(RRC_NAS_MASK_PTMSI_RAI);
        }

        if ((NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType)
         && (GMM_TRUE == gstGmmCasGlobalCtrl.ucTlliAssignFlg))
        {
            NAS_GMM_SuspendLlcForInterSys();

            if (MMC_SUSPEND_CAUSE_CELLCHANGE != gstGmmSuspendCtrl.ucSuspendCause)
            {
                gstGmmCasGlobalCtrl.GmmSrvState = GMM_AGB_GPRS_STANDBY;

                Gmm_TimerStop(GMM_TIMER_T3314);
            }

            if ((0x10 != (gstGmmSuspendCtrl.ucPreState & 0xF0))
             && (GMM_REGISTERED_INITIATED != gstGmmSuspendCtrl.ucPreState))
            {
#if (FEATURE_LTE == FEATURE_ON)
                if (GMM_TIMER_T3312_FLG != (GMM_TIMER_T3312_FLG & g_GmmTimerMng.ulTimerRunMask))
                {
                    NAS_GMM_SndLmmTimerInfoNotify(GMM_TIMER_T3312, GMM_LMM_TIMER_START);
                }
#endif
                Gmm_TimerStart(GMM_TIMER_T3312);
            }
        }

        /* 发生异系统切换从W到G,如果存在建链请求则清除 */
        if ((NAS_MML_NET_RAT_TYPE_WCDMA == gstGmmSuspendCtrl.ucPreRat)
         && ((GMM_RRC_RRMM_EST_CNF_FLG == (g_GmmReqCnfMng.ucCnfMask & GMM_RRC_RRMM_EST_CNF_FLG))
           || (GMM_SERVICE_REQUEST_INITIATED == gstGmmSuspendCtrl.ucPreState)))
        {
            Gmm_TimerStop(GMM_TIMER_PROTECT_FOR_SIGNALING);

            g_GmmReqCnfMng.ucCnfMask &= ~GMM_RRC_RRMM_EST_CNF_FLG;

            Gmm_ComStaChg(gstGmmSuspendCtrl.ucPreState);
            stRrMmRelIndMsg.ulCnDomainId              = RRC_NAS_PS_DOMAIN;
            stRrMmRelIndMsg.ulRelCause                = RRC_REL_CAUSE_RR_NORM_EVENT;
            stRrMmRelIndMsg.ulRrcConnStatus           = RRC_RRC_CONN_STATUS_ABSENT;
            Gmm_RcvRrmmRelInd(&stRrMmRelIndMsg);

            gstGmmSuspendCtrl.ucPreState = g_GmmGlobalCtrl.ucState;
        }
    }

    if (NAS_MML_NET_RAT_TYPE_GSM == enCurrNetType)
    {
        g_GmmGlobalCtrl.ucSigConFlg = GMM_TRUE;

        /* GMM_TIMER_PROTECT_FOR_SIGNALING 不需要恢复 */
        gstGmmSuspendCtrl.ulTimerRunMask &= ~(VOS_UINT32)(0x00000001 << GMM_TIMER_PROTECT_FOR_SIGNALING);

        g_GmmReqCnfMng.ucCnfMask &= ~GMM_RRC_RRMM_EST_CNF_FLG;

        /* T3340不需要恢复 */
        gstGmmSuspendCtrl.ulTimerRunMask &= ~(VOS_UINT32)(GMM_TIMER_T3340_FLG);

        /*如果PS域有短消息待发送,则通知SMS模块发送失败*/
        if (GMM_TRUE == g_GmmServiceCtrl.ucSmsFlg)
        {                                                                         /* SMS在等待响应                            */
            Gmm_SndSmsErrorInd(GMM_SMS_SIGN_NO_EXIST);                              /* 发送PMMSMS_ERROR_IND                     */
            g_GmmServiceCtrl.ucSmsFlg = GMM_FALSE;
        }
        /*add,sunxibo,2007-10-12,for intersystem end*/
    }
    /* ==>A32D12436 */
    else if (NAS_MML_NET_RAT_TYPE_GSM == gstGmmSuspendCtrl.ucPreRat)
    {
        if (VOS_FALSE == ulFallBackFlg)
		{
            g_GmmGlobalCtrl.ucSigConFlg = GMM_FALSE;
        }

        Gmm_TimerStop(GMM_TIMER_T3314);
        gstGmmSuspendCtrl.ulTimerRunMask &= ~(VOS_UINT32)(0x00000001 << GMM_TIMER_PROTECT_OLD_TLLI);

    }
    else
    {
    }
    /* <==A32D12436 */
    Gmm_TimerStop(GMM_TIMER_SUSPENDED);

#if   (FEATURE_ON == FEATURE_LTE)

    if ( NAS_MML_NET_RAT_TYPE_LTE == enCurrNetType )
    {
        NAS_GMM_ProcResumeToLTE();

        return ;
    }
#endif

#if (FEATURE_ON == FEATURE_CL_INTERWORK)
    /* 异系统变换到EHRPD下的处理 */
    if ( MMC_RESUME_ORIGEN_HRPD == pResumeIndMsg->ucResumeOrigen )
    {
        NAS_GMM_ProcResumeToHRPD(pResumeIndMsg);

        return;
    }
#endif

    switch (pResumeIndMsg->ucPsResumeResult)
    {
        case MMC_RESUME_RESULT_SUCCESS:
            if (gstGmmSuspendCtrl.ucPreRat == enCurrNetType)
            {
                GMM_LOG_INFO("GMM_RcvMmcResumeInd:Switch back,PS resume successfully.");
                /*回退成功处理函数*/
                GMM_ResumeTimer(GMM_TIMER_RESUME);
                Gmm_ComStaChg(gstGmmSuspendCtrl.ucPreState);
                GMM_ResumeSuccess();

                if ((GMM_TRUE == g_GmmGlobalCtrl.ucFollowOnFlg)
                 && (GMM_SERVICE_REQUEST_INITIATED != gstGmmSuspendCtrl.ucPreState))
                {
                    g_GmmGlobalCtrl.ucFollowOnFlg = GMM_FALSE;
                    NAS_MML_SetPsServiceBufferStatusFlg(VOS_FALSE);

                    Gmm_RoutingAreaUpdateHandleFollowOn();
                }
            }
            else if ((0x10 == (gstGmmSuspendCtrl.ucPreState & 0xF0))
                  || (GMM_REGISTERED_INITIATED == gstGmmSuspendCtrl.ucPreState))
            {
                GMM_LOG_INFO("GMM_RcvMmcResumeInd:PS not register.");
                /*回退成功处理函数*/
                GMM_ResumeTimer(GMM_TIMER_RESUME);
                Gmm_TimerStop( GMM_TIMER_T3310 );
                Gmm_ComStaChg(gstGmmSuspendCtrl.ucPreState);
                /*  在注册过程中,说明原来在去注册正常服务状态 */
                if (GMM_REGISTERED_INITIATED == gstGmmSuspendCtrl.ucPreState)
                {
                    Gmm_ComStaChg(GMM_DEREGISTERED_NORMAL_SERVICE);
                }

                GMM_ResumeFailure();
                
                /* resume成功时清除缓存 */
                NAS_GMM_ProcBufferSmMsg_ResumeSuccess();
            }
            /*  rau init状态cco回退没有恢复t3330,需要重新启动,状态不变还是GMM_ROUTING_AREA_UPDATING_INITIATED,
                t3330超时重新发起rau或网络释放连接,停t3330,启动t3311,t3311超时再进行rau */
            else if ((GMM_ROUTING_AREA_UPDATING_INITIATED == g_GmmGlobalCtrl.ucState)
                  && (MMC_SUSPEND_CAUSE_CELLCHANGE_FALLBACK == gstGmmSuspendCtrl.ucSuspendCause))
            {
                Gmm_TimerStart(GMM_TIMER_T3330);
            }
            else if ((MMC_SUSPEND_CAUSE_HANDOVER == gstGmmSuspendCtrl.ucSuspendCause)
                  && (NAS_MML_NET_RAT_TYPE_LTE == gstGmmSuspendCtrl.ucPreRat)
                  && (NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType))
            {
                Gmm_ComStaChg(GMM_REGISTERED_NORMAL_SERVICE);

                Gmm_TimerStop(GMM_TIMER_T3312);

                NAS_MML_SetEpsSigConnStatusFlg(VOS_FALSE);

                NAS_MML_SetEpsServiceConnStatusFlg(VOS_FALSE);

                /* PS信令连接的更新依赖于MMC转发的resume ind指示 */
            }
            else
            {
                GMM_LOG_INFO("GMM_RcvMmcResumeInd:Intersystem change,PS resume successfully.");
                if ( MMC_SUSPEND_CAUSE_HANDOVER != gstGmmSuspendCtrl.ucSuspendCause )
                {
                    Gmm_TimerStart(GMM_TIMER_SUSPENDED);
                }
                Gmm_ComStaChg(GMM_SUSPENDED_WAIT_FOR_SYSINFO);
            }

            if ( gstGmmSuspendCtrl.ucPreRat != enCurrNetType )
            {
                if ( NAS_MML_NET_RAT_TYPE_WCDMA == enCurrNetType)
                {
                    /* 异重选,cco,cco回退恢复时需要用此全局变量记录,便于后续建链的原因值填写 */
                    if ((MMC_SUSPEND_CAUSE_CELLRESELECT == gstGmmSuspendCtrl.ucSuspendCause)
                        ||(MMC_SUSPEND_CAUSE_REDIRECTION == gstGmmSuspendCtrl.ucSuspendCause)
                        ||(MMC_SUSPEND_CAUSE_CELLCHANGE == gstGmmSuspendCtrl.ucSuspendCause))
                    {
                        g_GmmInterRatCellReselect = 1;
                    }
                }
            }

            break;
        case MMC_RESUME_RESULT_FAILURE:
            GMM_LOG_INFO("GMM_RcvMmcResumeInd:PS resume failure.");
            GMM_ResumeTimer(GMM_TIMER_RESUME);
            Gmm_ComStaChg(gstGmmSuspendCtrl.ucPreState);
            GMM_ResumeFailure();
            break;
        case MMC_RESUME_GPRS_SUSPENSION:
            if (NAS_MML_NET_RAT_TYPE_GSM != enCurrNetType)
            {
                GMM_LOG_WARN("GMM_RcvMmcResumeInd:PS resume result of MMCGMM_RESUME_IND is abnormal.");
                GMM_ResumeTimer(GMM_TIMER_RESUME);
                Gmm_ComStaChg(gstGmmSuspendCtrl.ucPreState);
                GMM_ResumeFailure();
                return;
            }
            GMM_LOG_INFO("GMM_RcvMmcResumeInd:PS resume result is GPRS_SUSPENSION.");
            if (gstGmmSuspendCtrl.ucPreRat == enCurrNetType)
            {
                GMM_BufferMsgDump();
                Gmm_HoldBufferFree();                                           /* 清除保留消息                             */
                Gmm_ComCnfHandle();
                Gmm_ComStaChg(GMM_GPRS_SUSPENSION);
                /*add,sunxibo,2007-10-05,for intersystem begin*/
                if (GMM_REGISTERED_NORMAL_SERVICE == gstGmmSuspendCtrl.ucPreState)
                {
                    g_GmmGlobalCtrl.ucSuspendProc                = GMM_TRUE;
                }
                /*add,sunxibo,2007-10-05,for intersystem end*/
            }
            else
            {
                Gmm_ComStaChg(GMM_SUSPENDED_GPRS_SUSPENSION);
            }
            break;
        default:
            GMM_LOG_WARN("GMM_RcvMmcResumeInd:Receive MMCGMM_RESUME_IND in abnormal State.");
            break;
    }
}
Ejemplo n.º 27
0
VOS_UINT32  NAS_MMC_IsCurrentBandSetted_SysCfg(
    MMA_MMC_SYS_CFG_SET_REQ_STRU        *pstSysCfgSetParm
)
{
    NAS_MML_MS_BAND_INFO_STRU          *pstBandInfo         = VOS_NULL_PTR;
#if (FEATURE_ON == FEATURE_LTE)
    LTE_BAND_STRU                       stCurrentLteBand;
    LTE_BAND_STRU                       stSetLteBand;
#endif
    VOS_UINT32                          ulCurrentWcdmaBand;
    VOS_UINT32                          ulSetWcdmaBand;
    VOS_UINT32                          ulCurrentGsmBand;
    VOS_UINT32                          ulSetGsmBand;

    NAS_MML_NET_RAT_TYPE_ENUM_UINT8     enCurrNetRatType;

    /* 取得当前的接入技术类型 */
    enCurrNetRatType                    = NAS_MML_GetCurrNetRatType();

    /* 获取当前的频段信息 */
    pstBandInfo                         = NAS_MML_GetCurrBandInfo();
#if (FEATURE_ON == FEATURE_LTE)

    /* 获取当前的LTE的频段 */
    PS_MEM_CPY( &(stCurrentLteBand),
                &(pstBandInfo->stLteBand),
                sizeof(LTE_BAND_STRU) );

#endif

    /* 获取当前的WCDMA的频段 */
    ulCurrentWcdmaBand                  = pstBandInfo->unWcdmaBand.ulBand;

    /* 获取当前的GSM的频段 */
    ulCurrentGsmBand                    = pstBandInfo->unGsmBand.ulBand;

#if (FEATURE_ON == FEATURE_LTE)

    /* 获取当前用户SYSCFG设置的LTE的频段 */
    PS_MEM_CPY( &(stSetLteBand),
                &(pstSysCfgSetParm->stBand.stLteBand),
                sizeof(LTE_BAND_STRU) );
#endif

    /* 获取当前用户SYSCFG设置的WCDMA的频段 */
    ulSetWcdmaBand                      = pstSysCfgSetParm->stBand.unWcdmaBand.ulBand;

    /* 获取当前用户SYSCFG设置的GSM的频段 */
    ulSetGsmBand                        = pstSysCfgSetParm->stBand.unGsmBand.ulBand;

#if (FEATURE_ON == FEATURE_LTE)

    /* 当前LTE的频段在用户设置频段中 */
    if ( (0 != (stCurrentLteBand.aulLteBand[0] & stSetLteBand.aulLteBand[0]))
      || (0 != (stCurrentLteBand.aulLteBand[1] & stSetLteBand.aulLteBand[1])) )
    {
        /* 当前LTE频段在用户设置的相应频段中,表明当前频段有效 */
        return VOS_TRUE;
    }
#endif


    /* 当驻留在TD模式下,由于频段信息肯定是被支持的,直接返回VOS_TRUE */
    if ( (NAS_UTRANCTRL_UTRAN_MODE_TDD == NAS_UTRANCTRL_GetCurrUtranMode())
      && (NAS_MML_NET_RAT_TYPE_WCDMA   == enCurrNetRatType) )
    {
        return VOS_TRUE;
    }


    /* 当前GU频段在用户设置频段中 */
    if ( (0 != (ulCurrentGsmBand & ulSetGsmBand))
      || (0 != (ulCurrentWcdmaBand & ulSetWcdmaBand)) )
    {
        /* 当前GU频段在用户设置的相应频段中,表明当前频段有效 */
        return VOS_TRUE;
    }

    /* 当前频段在不用户设置的相应频段中,表明当前频段无效 */
    return VOS_FALSE;
}