VOS_UINT32 NAS_EMM_SomeStateRcvSmsMsgCommProc(VOS_VOID) { VOS_UINT32 ulCurEmmStat; LMM_SMS_ERR_CAUSE_ENUM_UINT32 enErrCause = LMM_SMS_ERR_CAUSE_OTHERS; /* 获取当前状态 */ ulCurEmmStat = NAS_LMM_PUB_COMP_EMMSTATE(NAS_EMM_CUR_MAIN_STAT, NAS_EMM_CUR_SUB_STAT); /* 各状态的处理 */ switch(ulCurEmmStat) { case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI): enErrCause = LMM_SMS_ERR_CAUSE_USIM_PS_INVALID; break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG, EMM_SS_DEREG_ATTACH_NEEDED): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_WAIT_ACCESS_GRANT_IND): enErrCause = LMM_SMS_ERR_CAUSE_ACCESS_BARRED; break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG, EMM_SS_DEREG_ATTEMPTING_TO_ATTACH): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_ATTEMPTING_TO_UPDATE): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_ATTEMPTING_TO_UPDATE_MM): /* 3402运行上报LMM_SMS_ERR_CAUSE_T3402_RUNNING ,其它情况报LMM_SMS_ERR_CAUSE_OTHERS*/ if (NAS_LMM_TIMER_RUNNING == NAS_LMM_IsPtlTimerRunning(TI_NAS_EMM_PTL_T3402)) { enErrCause = LMM_SMS_ERR_CAUSE_T3402_RUNNING; } break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_RRC_CONN_EST_INIT, EMM_SS_RRC_CONN_WAIT_EST_CNF): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_RRC_CONN_REL_INIT, EMM_SS_RRC_CONN_WAIT_REL_CNF): return NAS_LMM_STORE_HIGH_PRIO_MSG; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_AUTH_INIT, EMM_SS_AUTH_WAIT_CN_AUTH): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_TAU_INIT, EMM_SS_TAU_WAIT_CN_TAU_CNF): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF): return NAS_LMM_STORE_LOW_PRIO_MSG; default: /* 其它所有状态一律上报原因值LMM_SMS_ERR_CAUSE_OTHERS */ break; } NAS_LMM_SndLmmSmsErrInd(enErrCause); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_TAU_TAUReqRejectOtherCause ( const NAS_EMM_CN_CAUSE_ENUM_UINT8 ucTAUrejcause ) { /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO( "Nas_Emm_Tau_TAUReqRejectCasueOthers is entered."); if( (NAS_LMM_CAUSE_SEMANTICALLY_INCORRECT_MSG == ucTAUrejcause)|| (NAS_LMM_CAUSE_INVALID_MANDATORY_INF == ucTAUrejcause)|| (NAS_LMM_CAUSE_MSG_NONEXIST_NOTIMPLEMENTE == ucTAUrejcause)|| (NAS_LMM_CAUSE_IE_NONEXIST_NOTIMPLEMENTED == ucTAUrejcause)|| (NAS_LMM_CAUSE_PROTOCOL_ERROR == ucTAUrejcause)|| (VOS_TRUE == NAS_MML_IsRoamingRejectNoRetryFlgActived(ucTAUrejcause))) { NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_MAX); } else { NAS_EMM_TAU_GetEmmTAUAttemptCnt()++; } NAS_EMM_TAU_ProcAbnormal(); /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_TAUReqRejectOtherCause:CAUSE_ESM_EMC_PDN_REQ"); NAS_EMM_EmcPndReqTauAbnormalCommProc( NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, EMM_SS_DEREG_NORMAL_SERVICE); } else { NAS_EMM_TAU_RelIndCollisionProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR); } /* lihong00150010 emergency tau&service end */ #if 0 /* 如果启动了3402,清空TAU计数 */ if(NAS_LMM_TIMER_RUNNING == NAS_LMM_IsPtlTimerRunning(TI_NAS_EMM_PTL_T3402)) { NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); } #endif /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return; }
VOS_VOID NAS_EMM_TAU_TAUReqRejectCasue8( ) { MMC_LMM_TAU_TYPE_ENUM_UINT32 enEmmTauType = MMC_LMM_TAU_TYPE_BUTT; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO("Nas_Emm_Tau_TAUReqRejectCasue8 is entered."); enEmmTauType = NAS_EMM_TAU_GetTAUtype(); if ((NAS_EMM_CN_TAU_TYPE_COMBINED_TA_LA_UPDATING != enEmmTauType) && (NAS_EMM_CN_TAU_TYPE_COMBINED_TA_LA_WITH_IMSI != enEmmTauType)) { /* 非联合TAU的处理分支 */ NAS_EMM_TAU_ProcAbnormal(); /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue8:CAUSE_ESM_EMC_PDN_REQ"); NAS_EMM_EmcPndReqTauAbnormalCommProc( NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, EMM_SS_DEREG_NORMAL_SERVICE); } else { /* 上报TAU结果在冲突处理中执行 */ NAS_EMM_TAU_RelIndCollisionProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR); } /* lihong00150010 emergency tau&service end */ #if 0 /*如果启动了T3402定时器,清零TAU计数*/ if(NAS_LMM_TIMER_RUNNING == NAS_LMM_IsPtlTimerRunning(TI_NAS_EMM_PTL_T3402)) { NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); } #endif /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return ; } /* 联合TAU的处理分支 */ /*设置EU3 ROAMING NOT ALLOWED,并设置到NVIM中*/ NAS_LMM_GetMmAuxFsmAddr()->ucEmmUpStat = EMM_US_ROAMING_NOT_ALLOWED_EU3; /*删除GUTI,KSIasme,TAI list,GUTI*/ NAS_EMM_ClearRegInfo(NAS_EMM_DELETE_RPLMN); NAS_LMM_SetPsSimValidity(NAS_LMM_SIM_INVALID); /*USIM无效,直到关机或拔卡*/ /*暂不处理*/ /*删除equivalent PLMNs由MMC模块完成*/ /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { /* 记录ATTACH触发原因值 */ NAS_EMM_GLO_AD_GetAttCau() = EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER; NAS_EMM_TAU_SendEsmStatusInd(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { NAS_EMM_TAU_SendEsmStatusInd(EMM_ESM_ATTACH_STATUS_DETACHED); } /* lihong00150010 emergency tau&service end */ /*转换EMM状态机MS_DEREG+SS_DEREG_NO_IMSI*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI, TI_NAS_EMM_STATE_NO_TIMER); /****检查冲突标志并做相应的处理********************************************/ /* 上报TAU结果在冲突中处理 */ NAS_EMM_TAU_SpecialRelCauseCollisionProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR); /*向LRRC发送LRRC_LMM_NAS_INFO_CHANGE_REQ携带USIM卡状态*/ NAS_EMM_SendUsimStatusToRrc(LRRC_LNAS_USIM_PRESENT_INVALID); /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return; }
VOS_UINT32 NAS_EMM_MsRegSsRegNmlSrvMsgIntraDetReq(VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { MMC_LMM_TAU_RSLT_ENUM_UINT32 ulTauRslt = MMC_LMM_TAU_RSLT_BUTT; NAS_LMM_INTRA_DETACH_REQ_STRU *pRcvEmmMsg; pRcvEmmMsg = (NAS_LMM_INTRA_DETACH_REQ_STRU *) pMsgStru; /*打印进入该函数*/ NAS_EMM_DETACH_LOG1_INFO("NAS_EMM_MsRegSsRegNmlSrvMsgTauIntraMsgDetReq is entered", ulMsgId); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_REG,EMM_SS_REG_NORMAL_SERVICE)) { /*打印出错信息*/ NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsRegSsRegNmlSrvMsgTauIntraMsgDetReq: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*消息内容检查,若有错,打印并退出*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_IntraDetReqChk(pRcvEmmMsg)) { NAS_EMM_DETACH_LOG_ERR("NAS_EMM_MsRegSsRegNmlSrvMsgTauIntraMsgDetReq: MMC_MM_SYS_INFO_IND_STRU para err!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /* 如果是IMSI DETACH类型,则发起IMSI DETACH流程 */ if (MMC_LMM_MO_DET_CS_ONLY == NAS_EMM_GLO_AD_GetDetTypeMo()) { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_MsRegSsRegNmlSrvMsgTauIntraMsgDetReq:Proceed Imsi Detach"); /* IMSI detach被TAU打断,如果TAU ACCEPT是Ta Updated Only,原因值为#2或者#18 也会进入NORMAL_SERVICE,发送内部DETACH请求,这时不应该再发起IMSI DETACH流程*/ if (NAS_LMM_REG_DOMAIN_PS == NAS_LMM_GetEmmInfoRegDomain()) { /*向APP发送DETACH成功*/ NAS_EMM_AppSendDetCnf(MMC_LMM_DETACH_RSLT_SUCCESS); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); return NAS_LMM_MSG_HANDLED; } /* 发起IMSI DETACH流程 */ NAS_EMM_SendImsiDetachReqMo(); return NAS_LMM_MSG_HANDLED; } NAS_EMM_DETACH_LOG_INFO("NAS_EMM_MsRegSsRegNmlSrvMsgTauIntraMsgDetReq:Proceed EPS Detach or EPS/IMSI Detach"); /* 如果3411在运行,需要给MMC报TAU结果,以让MMC退出搜网状态机;3402定时器在 运行无需通知,MMC收到TAU结果尝试次数为5时,已退出搜网状态机 */ if (NAS_LMM_TIMER_RUNNING == NAS_LMM_IsPtlTimerRunning(TI_NAS_EMM_PTL_T3411)) { NAS_EMM_SetTauTypeNoProcedure(); ulTauRslt = MMC_LMM_TAU_RSLT_MO_DETACH_FAILURE; NAS_EMM_MmcSendTauActionResultIndOthertype((VOS_VOID*)&ulTauRslt); } /*停止定时器*/ NAS_LMM_StopPtlTimer( TI_NAS_EMM_PTL_T3411); NAS_LMM_StopPtlTimer( TI_NAS_EMM_PTL_T3402); /*发送DETACH REQUEST消息*/ NAS_EMM_SendDetachReqMo(); return NAS_LMM_MSG_HANDLED; }