VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgSerRej( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { (VOS_VOID)(ulMsgId); (VOS_VOID)(pMsgStru); NAS_EMM_SECU_LOG_INFO( "NAS_EMM_MsAuthInitSsWtCnAuthMsgSerRej entered."); /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); /*状态出栈之后相当于在ser_init+wait_cn_ser_cnf状态下处理ser rej消息, 如果有转义处理,则根据相应的分支进行处理即可 */ NAS_EMM_MsSerInitSsWaitCNSerCnfMsgServiceReject(ulMsgId, pMsgStru); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_SER_AbnormalOver(VOS_VOID) { NAS_EMM_SER_LOG_INFO( "NAS_EMM_SER_AbnormalOver is entered."); /*停止T3417定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*停止T3440定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_T3440); /*停止T3417ext定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*如果SR流程是由于SMS触发,需要回复SMS建链失败,并且清除SR的发起原因,*/ if(NAS_EMM_SER_START_CAUSE_SMS_EST_REQ == NAS_EMM_SER_GetSerStartCause()) { /* SER异常的原因值上报暂时报LMM_SMS_ERR_CAUSE_OTHERS, 以后可能要根据相应的原因值进行具体细分处理,上报准确的原因值 此处作为遗留问题 */ NAS_LMM_SndLmmSmsErrInd(LMM_SMS_ERR_CAUSE_OTHERS); NAS_EMM_SER_SaveEmmSERStartCause(NAS_EMM_SER_START_CAUSE_BUTT); } if (VOS_TRUE != NAS_EMM_SER_IsCsfbProcedure()) { /*Inform RABM that SER fail*/ NAS_EMM_SER_SendRabmReestInd(EMM_ERABM_REEST_STATE_FAIL); } /*清空ESM_DATA缓存*/ NAS_EMM_SerClearEsmDataBuf(); return; }
VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgCnAuthRej( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { VOS_UINT32 ulCurEmmStat; (VOS_VOID)(pMsgStru); (VOS_VOID)ulMsgId; NAS_EMM_SECU_LOG_INFO( "NAS_EMM_MsAuthInitSsWtCnAuthMsgCnAuthRej entered."); /* 鉴权拒绝优化处理 */ if (NAS_EMM_YES == NAS_EMM_IsNeedIgnoreHplmnAuthRej()) { return NAS_LMM_MSG_HANDLED; } /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); 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_REG_INIT, EMM_SS_ATTACH_WAIT_CN_ATTACH_CNF): NAS_EMM_MsRegInitSsWtCnAttCnfProcMsgAuthRej(NAS_EMM_AUTH_REJ_INTRA_CAUSE_NORMAL); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_LIMITED_SERVICE): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_ATTEMPTING_TO_UPDATE_MM): NAS_EMM_MsRegSsNmlSrvProcMsgAuthRej(NAS_EMM_AUTH_REJ_INTRA_CAUSE_NORMAL); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG_INIT, EMM_SS_DETACH_WAIT_CN_DETACH_CNF): NAS_EMM_ProcDetachAuthRej(NAS_EMM_AUTH_REJ_INTRA_CAUSE_NORMAL); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_TAU_INIT, EMM_SS_TAU_WAIT_CN_TAU_CNF): NAS_EMM_MsTauInitSsWaitCnTauCnfProcMsgAuthRej(NAS_EMM_AUTH_REJ_INTRA_CAUSE_NORMAL); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF): NAS_EMM_MsSerInitSsWaitCnSerCnfProcMsgAuthRej(NAS_EMM_AUTH_REJ_INTRA_CAUSE_NORMAL); break; default: break; } return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgRrcRelInd( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { LRRC_LMM_REL_IND_STRU *pRrcRelInd = VOS_NULL_PTR; VOS_UINT32 ulCause; VOS_UINT32 ulCurEmmStat; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgRrcRelInd entered."); (VOS_VOID)(ulMsgId); (VOS_VOID)(pMsgStru); pRrcRelInd = (LRRC_LMM_REL_IND_STRU*)(pMsgStru); ulCause = pRrcRelInd->enRelCause; /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); 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_REG_INIT, EMM_SS_ATTACH_WAIT_CN_ATTACH_CNF): NAS_EMM_MsRegInitSsWtCnAttCnfProcMsgRrcRelInd(ulCause); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_LIMITED_SERVICE): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_ATTEMPTING_TO_UPDATE_MM): NAS_EMM_MsRegSsNmlSrvProcMsgRrcRelInd(ulCause); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG, EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF): NAS_EMM_ProcMsRegImsiDetachInitMsgRrcRelInd(ulCause); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_TAU_INIT, EMM_SS_TAU_WAIT_CN_TAU_CNF): NAS_EMM_MsTauInitSsWaitCNCnfProcMsgRrcRelInd(ulCause); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF): NAS_EMM_MsSerInitSsWaitCnSerCnfProcMsgRrcRelInd(ulCause); break; case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG_INIT, EMM_SS_DETACH_WAIT_CN_DETACH_CNF): NAS_EMM_MsDrgInitSsWtCnDetCnfProcMsgRrcRelInd(ulCause); break; default: break; } return NAS_LMM_MSG_HANDLED; }
/***************************************************************************** Function Name : NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp Description : 在AuthInit等待CN消息时DETACH ACCPET消息 Input : ulMsgId,pMsgStru Output : None Return : VOS_UINT32 History : 1.lihong00150010 2012-10-19 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { VOS_UINT32 ulStaAtStackTop = NAS_EMM_NULL; VOS_UINT32 ulCurEmmStat = NAS_EMM_NULL; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp entered."); if ( NAS_EMM_NULL_PTR == pMsgStru) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp:input ptr null!"); return NAS_LMM_ERR_CODE_PTR_NULL; } /* 栈顶的状态如果不为TAU_INIT态,则丢弃 */ ulStaAtStackTop = NAS_LMM_FSM_GetStaAtStackTop(NAS_LMM_PARALLEL_FSM_EMM); if ((ulStaAtStackTop != NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG_INIT,EMM_SS_DETACH_WAIT_CN_DETACH_CNF)) && (ulStaAtStackTop != NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG,EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF))) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp:not dereg_init+wait_cn_detach_cnf and not reg+wait_imsi_detach_cnf state!"); return NAS_LMM_MSG_DISCARD; } /* 如果当前没有紧急承载,则丢弃 */ if ((NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_EMC_REGED) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_NORM_REGED_AND_EMC_BEAR)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgCnDetachAcp:no emergency bearer"); return NAS_LMM_MSG_DISCARD; } /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); ulCurEmmStat = NAS_LMM_PUB_COMP_EMMSTATE( NAS_EMM_CUR_MAIN_STAT, NAS_EMM_CUR_SUB_STAT); if (ulCurEmmStat == NAS_LMM_PUB_COMP_EMMSTATE( EMM_MS_DEREG_INIT, EMM_SS_DETACH_WAIT_CN_DETACH_CNF)) { return NAS_EMM_MsDrgInitSsWtCnDetCnfMsgCnDetachAcp(ulMsgId, pMsgStru); } else { return NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgCnDetachAcp(ulMsgId, pMsgStru); } }
/***************************************************************************** Function Name : NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd Description : 在AuthInit等待CN消息时处理DRB建立消息 Input : ulMsgId,pMsgStru Output : None Return : VOS_UINT32 History : 1.lihong00150010 2012-10-19 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { VOS_UINT32 ulStaAtStackTop = NAS_EMM_NULL; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd entered."); if ( NAS_EMM_NULL_PTR == pMsgStru) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd:input ptr null!"); return NAS_LMM_ERR_CODE_PTR_NULL; } (VOS_VOID)ulMsgId; /* 栈顶的状态如果不为SERVICE_INIT态,则丢弃 */ ulStaAtStackTop = NAS_LMM_FSM_GetStaAtStackTop(NAS_LMM_PARALLEL_FSM_EMM); if (ulStaAtStackTop != NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_SER_INIT,EMM_SS_SER_WAIT_CN_SER_CNF)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd:not service_init+wait_cn_ser_cnf state!"); return NAS_LMM_MSG_DISCARD; } /* 如果当前没有正在建立紧急承载且没有紧急承载,则丢弃 */ if ((VOS_TRUE != NAS_LMM_GetEmmInfoIsEmerPndEsting()) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_EMC_REGED) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_NORM_REGED_AND_EMC_BEAR)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgRabmDrbSetupInd:no emergency bearer and not esting emergency bearer"); return NAS_LMM_MSG_DISCARD; } /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); NAS_EMM_SER_RcvRabmDrbSetupInd(pMsgStru); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_AbortAuthProcedure(VOS_VOID) { NAS_EMM_SECU_LOG_INFO("NAS_EMM_AbortAuthProcedure entered!"); /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); return; }
VOS_VOID NAS_EMM_DetProcEnterForbTA(VOS_VOID) { /* 终止DETACH流程*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*向ESM发送ID_EMM_ESM_STATUS_IND消息*/ NAS_EMM_EsmSendStatResult( EMM_ESM_ATTACH_STATUS_DETACHED); /* lihong00150010 emergency tau&service begin */ if (VOS_TRUE == NAS_EMM_GLO_AD_GetUsimPullOutFlag()) { /*状态转换,通知MMC卡无效*/ NAS_EMM_ProcLocalNoUsim(); }/* lihong00150010 emergency tau&service end */ else { /* 状态迁移:Dereg.Limite_Service*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 本地DETACH*/ NAS_LMM_DeregReleaseResource(); } /*向MMC发送LMM_MMC_DETACH_CNF消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); return; }
VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgCnAuthReq( VOS_UINT32 ulMsgId, VOS_VOID *pMsg ) { VOS_UINT32 ulAuthRslt; (VOS_VOID)ulMsgId; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgCnAuthReq entered!"); /*停止3418,T3420 */ NAS_LMM_StopStateTimer(TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer(TI_NAS_EMM_T3420); ulAuthRslt = NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq(ulMsgId, pMsg); return ulAuthRslt; }
/***************************************************************************** Function Name : NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept Description : 在AuthInit等待CN消息时TAU ACCPET消息 Input : ulMsgId,pMsgStru Output : None Return : VOS_UINT32 History : 1.lihong00150010 2012-10-19 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { VOS_UINT32 ulStaAtStackTop = NAS_EMM_NULL; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept entered."); if ( NAS_EMM_NULL_PTR == pMsgStru) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept:input ptr null!"); return NAS_LMM_ERR_CODE_PTR_NULL; } /* 栈顶的状态如果不为TAU_INIT态,则丢弃 */ ulStaAtStackTop = NAS_LMM_FSM_GetStaAtStackTop(NAS_LMM_PARALLEL_FSM_EMM); if (ulStaAtStackTop != NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_TAU_INIT,EMM_SS_TAU_WAIT_CN_TAU_CNF)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept:not tau_init+wait_cn_tau_cnf state!"); return NAS_LMM_MSG_DISCARD; } /* 如果当前没有正在建立紧急承载且没有紧急承载,则丢弃 */ if ((VOS_TRUE != NAS_LMM_GetEmmInfoIsEmerPndEsting()) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_EMC_REGED) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_NORM_REGED_AND_EMC_BEAR)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgTauAccept:no emergency bearer and not esting emergency bearer"); return NAS_LMM_MSG_DISCARD; } /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); return NAS_EMM_MsTauInitSsWaitCNCnfMsgTAUAcp(ulMsgId, pMsgStru); }
VOS_UINT32 NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgIntraConnectFailInd ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { NAS_EMM_MRRC_CONNECT_FAIL_IND_STRU *pMrrcConnectFailInd = NAS_EMM_NULL_PTR; NAS_EMM_DETACH_LOG2_INFO("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgIntraConnectFailInd is entered", ulMsgId, pMsgStru); pMrrcConnectFailInd = (NAS_EMM_MRRC_CONNECT_FAIL_IND_STRU *)pMsgStru; /*check the input ptr*/ if (NAS_EMM_NULL_PTR == pMsgStru) { NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgIntraConnectFailInd: NULL PTR!"); return NAS_LMM_MSG_DISCARD; } /*check current state*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_REG,EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF)) { NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgIntraConnectFailInd: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*停止定时器T3421*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /* 设置注册域为PS */ NAS_LMM_SetEmmInfoRegDomain(NAS_LMM_REG_DOMAIN_PS); /*修改状态:进入主状态REG子状态EMM_SS_REG_NORMAL_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); if ((LRRC_EST_ACCESS_BARRED_MO_SIGNAL == pMrrcConnectFailInd->enEstResult) || (LRRC_EST_ACCESS_BARRED_ALL == pMrrcConnectFailInd->enEstResult)) { /*向MMC发送LMM_MMC_DETACH_CNF消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_ACCESS_BARED); } else { /*向MMC发送本地LMM_MMC_DETACH_IND消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); } /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); /*send INTRA_CONN2IDLE_REQ,更新连接状态*/ NAS_EMM_CommProcConn2Ilde(); return NAS_LMM_MSG_HANDLED; }
/***************************************************************************** Function Name : NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept Description : 在AuthInit等待CN消息时ATTACH ACCPET消息 Input : ulMsgId,pMsgStru Output : None Return : VOS_UINT32 History : 1.lihong00150010 2012-10-19 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { VOS_UINT32 ulStaAtStackTop = NAS_EMM_NULL; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept entered."); if ( NAS_EMM_NULL_PTR == pMsgStru) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept:input ptr null!"); return NAS_LMM_ERR_CODE_PTR_NULL; } /* 栈顶的状态如果不为REG_INIT态,则丢弃 */ ulStaAtStackTop = NAS_LMM_FSM_GetStaAtStackTop(NAS_LMM_PARALLEL_FSM_EMM); if (ulStaAtStackTop != NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_REG_INIT,EMM_SS_ATTACH_WAIT_CN_ATTACH_CNF)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept:not reg_init+wait_cn_attach_cnf state!"); return NAS_LMM_MSG_DISCARD; } /* 如果当前不是紧急注册过程中,则丢弃 */ if ((VOS_TRUE != NAS_LMM_GetEmmInfoIsEmerPndEsting()) && (NAS_LMM_GetEmmInfoRegStatus() != NAS_LMM_REG_STATUS_EMC_REGING)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_MsAuthInitSsWtCnAuthMsgAttachAccept:not emergency attach"); return NAS_LMM_MSG_DISCARD; } /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); return NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachAcp(ulMsgId, pMsgStru); }
VOS_UINT32 NAS_EMM_SndDetachReqFailProc(VOS_VOID* pMsg,VOS_UINT32 *pulIsDelBuff) { LRRC_LMM_DATA_CNF_STRU *pstRrcMmDataCnf = VOS_NULL_PTR; *pulIsDelBuff = VOS_TRUE; pstRrcMmDataCnf = (LRRC_LMM_DATA_CNF_STRU*) pMsg; if ((EMM_MS_DEREG_INIT != NAS_LMM_GetEmmCurFsmMS()) && ((EMM_MS_REG != NAS_LMM_GetEmmCurFsmMS()) && (EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF != NAS_LMM_GetEmmCurFsmSS()))) { /*打印出错信息*/ NAS_EMM_SER_LOG_INFO("NAS_EMM_SndExtendedServiceReqFailProc: STATE ERR!"); return NAS_EMM_SUCC; } switch (pstRrcMmDataCnf->enSendRslt) { case LRRC_LMM_SEND_RSLT_FAILURE_HO: case LRRC_LMM_SEND_RSLT_FAILURE_TXN: case LRRC_LMM_SEND_RSLT_FAILURE_RLF: if (EMM_MS_DEREG_INIT == NAS_LMM_GetEmmCurFsmMS()) { NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*发送DETACH REQUEST消息*/ NAS_EMM_SendDetachReqMo(); } else { NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /* 发起IMSI DETACH流程 */ NAS_EMM_SendImsiDetachReqMo(); } break; default: break; } return NAS_EMM_SUCC; }
VOS_VOID NAS_EMM_SER_ClearResource( VOS_VOID ) { NAS_EMM_SER_LOG_NORM("NAS_EMM_SER_ClearResource entered."); /* 清空SER全局变量*/ NAS_LMM_MEM_SET(&g_stEmmSERCtrlTbl, 0, sizeof(g_stEmmSERCtrlTbl)); /* 释放缓存的ESM消息*/ NAS_EMM_SerClearEsmDataBuf(); /* 清空接入Bar信息*/ NAS_EMM_ClearBarResouce(); /* 停止Service流程相关的所有定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_T3440); NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); return; }
VOS_VOID NAS_EMM_DetachToTAU() { /*停止定时器T3421*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*修改状态:进入主状态REG子状态REG_NORMAL_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); return; }
/***************************************************************************** Function Name : NAS_EMM_MsAuthInitSsWtCnAuthMsgEia0ActNotify Description : 在AuthInit等待CN消息时处理EIA0 ACT NOTIFY消息 Input : ulMsgId,pMsgStru Output : None Return : VOS_UINT32 History : 1.lihong00150010 2012-10-19 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_MsAuthInitSsWtCnAuthMsgEia0ActNotify ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAuthInitSsWtCnAuthMsgEia0ActNotify entered."); (VOS_VOID)(ulMsgId); (VOS_VOID)(pMsgStru); /* 停T3420,T3418*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3418); NAS_LMM_StopStateTimer( TI_NAS_EMM_T3420); /* AUTH失败次数清零*/ NAS_EMM_GetAuthFailTimes() = 0; /* 状态出栈*/ NAS_EMM_FSM_PopState(); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_LMM_DoAfterReadOptFileOver( VOS_VOID ) { NAS_LMM_FSM_STATE_STRU EmmState; NAS_LMM_UE_OPERATION_MODE_ENUM_UINT32 ulLteUeMode; NAS_LMM_UEID_STRU *pstUeId; /* 停止TI_NAS_LMM_TIMER_WAIT_USIM_CNF */ NAS_LMM_StopStateTimer(TI_NAS_LMM_TIMER_WAIT_USIM_CNF); /*如果读取到的GUTI无效但是安全上下文有效,则删除本地和NV中的上下文*/ pstUeId = NAS_LMM_GetEmmInfoUeidAddr(); if((NAS_EMM_BIT_NO_SLCT == pstUeId->bitOpGuti) &&(EMM_CUR_SECU_NOT_EXIST!= NAS_LMM_GetSecuCurFsmCS())) { NAS_EMM_ClearCurSecuCntxt(); NAS_LMM_WriteEpsSecuContext(NAS_NV_ITEM_DELETE); } /* Read NV Files*/ NAS_LMM_ProcessNvData(); /* 状态转成读必选文件状态 */ /* V7不再区分必读可选 */ /*NAS_EMM_GET_USIM_FILE_TYPE() = NAS_LMM_USIM_MANDATORY_FILE;*/ /*PC REPLAY MODIFY BY LEILI END*/ ulLteUeMode = NAS_LMM_ComputeLteUeMode( NAS_EMM_GetMsMode(), NAS_LMM_GetEmmInfoUeCenter()); NAS_LMM_SetEmmInfoUeOperationMode(ulLteUeMode); /*PC REPLAY MODIFY BY LEILI END*/ /* 启动TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER */ NAS_LMM_StartStateTimer(TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER); /* 转状态 */ EmmState.enFsmId = NAS_LMM_PARALLEL_FSM_EMM; EmmState.enMainState = EMM_MS_NULL; EmmState.enSubState = EMM_SS_NULL_WAIT_MMC_START_CNF; EmmState.enStaTId = TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER; NAS_LMM_StaTransProc(EmmState); /* 向MMC发送MMC_EMM_START_REQ(正常启动)消息 */ (VOS_VOID)NAS_EMM_PLMN_SendMmcStartReq(EMMC_EMM_START_REQ_CAUSE_NORMAL_START); return; }
VOS_VOID NAS_EMM_RestartSerProcedural(VOS_VOID) { /* 重启SERVICE流程 */ switch (NAS_EMM_SER_GetEmmSERStartCause()) { case NAS_EMM_SER_START_CAUSE_MT_CSFB_REQ: case NAS_EMM_SER_START_CAUSE_MO_CSFB_REQ: case NAS_EMM_SER_START_CAUSE_MO_EMERGENCY_CSFB_REQ: /*停止T3417定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*停止T3440定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_T3440); /*停止T3417ext定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*启动定时器3417*/ NAS_LMM_StartStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*转换EMM状态机MS_SER_INIT+SS_SER_WAIT_CN_CNF*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF, TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*组合并发送MRRC_DATA_REQ(SERVICE_REQ)*/ NAS_EMM_SER_SendMrrcDataReq_ExtendedServiceReq(); break; default : /*停止T3417定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*停止T3440定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_T3440); /*停止T3417ext定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*启动定时器3417*/ NAS_LMM_StartStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*转换EMM状态机MS_SER_INIT+SS_SER_WAIT_CN_CNF*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF, TI_NAS_EMM_STATE_SERVICE_T3417); /*组合并发送MRRC_DATA_REQ(SERVICE_REQ)*/ NAS_EMM_SER_SendMrrcDataReq_ServiceReq(); break; } return ; }
VOS_VOID NAS_EMM_MsDrgInitSsWtCnDetCnfProcMsgRrcRelInd( VOS_UINT32 ulCause) { /*打印进入该函数*/ NAS_EMM_DETACH_LOG_INFO("NAS_EMM_MsDrgInitSsWtCnDetCnfProcMsgRrcRelInd is entered"); (VOS_VOID)( ulCause); /*停止定时器T3421*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*向ESM发送ID_EMM_ESM_STATUS_IND消息*/ NAS_EMM_EsmSendStatResult( EMM_ESM_ATTACH_STATUS_DETACHED); /* lihong00150010 emergency tau&service begin */ if (VOS_TRUE == NAS_EMM_GLO_AD_GetUsimPullOutFlag()) {/* lihong00150010 emergency tau&service end */ NAS_EMM_DETACH_LOG_NORM("NAS_EMM_MsDrgInitSsWtCnDetCnfProcMsgRrcRelInd: No USIM"); NAS_EMM_ProcLocalNoUsim(); NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /*send INTRA_CONN2IDLE_REQ,更新连接状态*/ NAS_EMM_CommProcConn2Ilde(); return; } /* 有卡,不区分释放原因值,完成本地DETACH*/ /*修改状态:进入主状态DEREG子状态DEREG_NORMAL_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /* 本地DETACH释放资源:动态内存、赋初值 */ NAS_LMM_DeregReleaseResource(); /*send INTRA_CONN2IDLE_REQ,更新连接状态*/ NAS_EMM_CommProcConn2Ilde(); return; }
VOS_VOID NAS_EMM_Detach_ClearResourse(VOS_VOID) { /*动态内存释放*/ NAS_EMM_FreeDetDyn(); /* 停止DETACH定时器 */ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*赋初值*/ NAS_LMM_MEM_SET(NAS_EMM_GLO_AD_GetDetCtrlAddr(), 0, sizeof(NAS_EMM_DETACH_CTRL_STRU)); NAS_EMM_GLO_AD_GetDetTypeMo() = MMC_LMM_MO_DET_PS_ONLY; /*初始化 UE 发起 detach 的默认类型*/ NAS_EMM_GLO_AD_GetDetMode() = NAS_EMM_DETACH_MODE_NOT_SWITCH_OFF; return; }
VOS_VOID NAS_LMM_FSM_PushTimer( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId) { NAS_LMM_FSM_STATE_STRU *pstCurFsm; /* 状态机地址 */ /* 入口检查 */ if ( NAS_LMM_PARA_FSM_ID_INVALID( enParalFsmId)) { NAS_LMM_PUBM_LOG1_ERR( "NAS_LMM_FSM_PushTimer, The input is illegal! enParalFsmId", enParalFsmId); return; } pstCurFsm = NAS_LMM_GetCurFsmAddr(NAS_LMM_PARALLEL_FSM_EMM); /* 停当前状态运行的状态保护定时器*/ NAS_LMM_StopStateTimer( pstCurFsm->enStaTId); return; }
/***************************************************************************** Function Name : NAS_EMM_ImsiDetProcEnterForbTA Description : REG.IMSI_DETACH_INIT状态下收到SYS_INFO,且携带禁止信息,终止DETACH 流程,释放链路 Input : None Output : None Return : VOS_UINT32 History : 1.lihong00150010 2011-10-18 Draft Enact 2.lihong00150010 2012-12-19 Modify:Emergency *****************************************************************************/ VOS_VOID NAS_EMM_ImsiDetProcEnterForbTA( VOS_VOID ) { /* 终止DETACH流程*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /* 设置注册域为PS */ NAS_LMM_SetEmmInfoRegDomain(NAS_LMM_REG_DOMAIN_PS); NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /*向MMC发送LMM_MMC_DETACH_CNF消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); return; }
VOS_UINT32 NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgRabmRelReq ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { NAS_EMM_DETACH_LOG2_INFO("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgRabmRelReq", ulMsgId, pMsgStru); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_REG,EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF)) { /*打印出错信息*/ NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgRabmRelReq: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*停止定时器T3421*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /* 设置注册域为PS */ NAS_LMM_SetEmmInfoRegDomain(NAS_LMM_REG_DOMAIN_PS); NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /*向MMC发送LMM_MMC_DETACH_CNF消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return NAS_LMM_MSG_HANDLED; }
/***************************************************************************** Function Name : NAS_LMM_FSM_ClearTimer Discription : 栈顶状态出栈,该栈顶状态对应的定时器在压栈时同步入栈了,则 此时需要同步恢复,常见的情况是,把暂停的定时器重新启动; 本函数只执行两个操作: 恢复运行出栈后的状态的状态保护定时器; 修改g_stMmMainContext中对应定时器的运行标识 Input : 并行状态机ID, UE1.0中固定填NAS_LMM_PARALLEL_FSM_EMM Output : None Return : None History: 1. hanlufeng 41410 Draft Enact *****************************************************************************/ VOS_VOID NAS_LMM_FSM_ClearTimer( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId) { NAS_LMM_FSM_STATE_STRU *pstCurFsm; /* 状态机地址 */ /* 入口检查 */ if ( NAS_LMM_PARA_FSM_ID_INVALID(enParalFsmId)) { NAS_LMM_PUBM_LOG1_ERR("NAS_LMM_FSM_ClearTimer, The input is illegal! enParalFsmId", enParalFsmId); return; } pstCurFsm = NAS_LMM_GetCurFsmAddr(NAS_LMM_PARALLEL_FSM_EMM); /* 继续当前状态运行的状态保护定时器,即 g_stMmMainContext.stNasEmmFsm.astCurFsm.enStaTId*/ NAS_LMM_StopStateTimer(pstCurFsm->enStaTId); return; }
VOS_UINT32 NAS_EMM_MsSerInitSsWtCnSerCnfMsgAppAttachReq( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { MMC_LMM_ATTACH_REQ_STRU *pRcvEmmMsg; (VOS_VOID)ulMsgId; pRcvEmmMsg = (MMC_LMM_ATTACH_REQ_STRU *)pMsgStru; /*打印进入该函数*/ NAS_EMM_ATTACH_LOG_NORM("NAS_EMM_MsSerInitSsWtCnSerCnfMsgAppAttachReq is entered"); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_SER_INIT,EMM_SS_SER_WAIT_CN_SER_CNF)) { /*打印出错信息*/ NAS_EMM_ATTACH_LOG_WARN("NAS_EMM_MsSerInitSsWtCnSerCnfMsgAppAttachReq: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*消息内容检查,若有错,打印并退出*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_AppAttachReqMsgChk(pRcvEmmMsg)) { NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_MsSerInitSsWtCnSerCnfMsgAppAttachReq: MMC_LMM_ATTACH_REQ_STRU PARA ERR!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /*保存APP参数*/ NAS_EMM_SaveAppMsgPara(pRcvEmmMsg->ulMsgId,pRcvEmmMsg->ulOpId); if(MMC_LMM_ATT_REQ_TYPE_PS_ONLY == pRcvEmmMsg->ulAttachType) { /*向MMC发送ATTACH成功*/ NAS_EMM_MmcSendAttCnf(MMC_LMM_ATT_RSLT_SUCCESS); return NAS_LMM_MSG_HANDLED; } /*请求类型是IMSI或者CS_ps,操作模式是PS*/ if(NAS_EMM_NO == NAS_EMM_IsCsPsUeMode()) { NAS_EMM_MmcSendAttCnf(MMC_LMM_ATT_RSLT_FAILURE); return NAS_LMM_MSG_HANDLED; } /*请求类型是IMSI或者CS_ps操作模式是CS_PS,注册域为CS_PS*/ if (NAS_LMM_REG_DOMAIN_CS_PS == NAS_LMM_GetEmmInfoRegDomain()) { NAS_EMM_MmcSendAttCnf(MMC_LMM_ATT_RSLT_SUCCESS); return NAS_LMM_MSG_HANDLED; } /*请求类型是IMSI或者CS_ps操作模式是CS_PS,注册域为PS*/ if(NAS_LMM_REG_DOMAIN_PS == NAS_LMM_GetEmmInfoRegDomain()) { /* 发起TAU,打断SERVICE */ /*停止T3417定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*Inform RABM that SER fail*/ NAS_EMM_SER_SendRabmReestInd(EMM_ERABM_REEST_STATE_FAIL); /*结束SER流程*/ /* NAS_EMM_SER_AbnormalOver();*/ /*设置流程冲突标志位*/ NAS_EMM_TAU_SaveEmmCollisionCtrl(NAS_EMM_COLLISION_SERVICE); /*NAS_EMM_TAU_SaveEmmTAUStartCause(NAS_EMM_TAU_START_CAUSE_IMSI_ATTACH);*/ NAS_EMM_TAU_SaveEmmTAUStartCause(NAS_EMM_TAU_START_CAUSE_OTHERS); /*启动TAU Procedure*/ NAS_EMM_TAU_StartTAUREQ(); return NAS_LMM_MSG_HANDLED; } return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsDrgInitSsWtCnDetCnfMsgAppAttachReq( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { MMC_LMM_ATTACH_REQ_STRU *pRcvEmmMsg; (VOS_VOID)(ulMsgId); pRcvEmmMsg = (MMC_LMM_ATTACH_REQ_STRU *) pMsgStru; /* 打印,*/ NAS_EMM_ATTACH_LOG_WARN("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgAppAttachReq: Receive Message APP ATTACH."); /*消息内容检查,若有错,打印并退出*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_AppAttachReqMsgChk(pRcvEmmMsg)) { NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgAppAttachReq: NAS_EMM_CN_ATTACH_REQ_STRU PARA ERR!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /*停止定时器T3421*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*向ESM发送ID_EMM_ESM_STATUS_IND消息*/ NAS_EMM_EsmSendStatResult( EMM_ESM_ATTACH_STATUS_DETACHED); /*给MMC回复Detach Cnf */ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /* lihong00150010 emergency tau&service begin */ if (VOS_TRUE == NAS_EMM_GLO_AD_GetUsimPullOutFlag()) {/* lihong00150010 emergency tau&service end */ NAS_EMM_DETACH_LOG_NORM("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgAppAttachReq: No USIM"); NAS_EMM_ProcLocalNoUsim(); } else { /* 本地DETACH释放资源:动态内存、赋初值 */ NAS_LMM_DeregReleaseResource(); NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); } /*保存APP参数*/ NAS_EMM_SaveAppMsgPara(pRcvEmmMsg->ulMsgId,pRcvEmmMsg->ulOpId); /*重新保存用户发起ATTACH的请求类型*/ NAS_EMM_GLO_SetAttReqType(pRcvEmmMsg->ulAttachType); /*CS域的attach请求直接返回失败 */ if (MMC_LMM_ATT_REQ_TYPE_CS_ONLY == pRcvEmmMsg->ulAttachType) { NAS_EMM_MmcSendAttCnf(MMC_LMM_ATT_RSLT_FAILURE); } /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachReject( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { NAS_EMM_CN_ATTACH_REJ_STRU *pRcvEmmMsg; LNAS_STK_UPDATE_TYPE_ENUM_UINT8 uAttachType; (VOS_VOID)ulMsgId; pRcvEmmMsg = (NAS_EMM_CN_ATTACH_REJ_STRU *) pMsgStru; /*打印进入该函数*/ NAS_EMM_ATTACH_LOG_NORM("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachReject is entered"); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_REG_INIT,EMM_SS_ATTACH_WAIT_CN_ATTACH_CNF)) { /*打印出错信息*/ NAS_EMM_ATTACH_LOG_WARN("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachReject: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*消息内容检查*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_CnAttachRejMsgChk(pRcvEmmMsg)) { NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachReject: NAS_EMM_CN_ATTACH_REJ_STRU para err!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /*停止定时器T3410*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3410); /*保存ATTACH拒绝原因*/ NAS_EMM_GLO_AD_GetAttRejCau() = pRcvEmmMsg->ucCause; NAS_EMM_GLO_AD_GetAttRejEsmCau() = pRcvEmmMsg->ucEsmCause; /* xiongxianghui00253310 modify for ftmerrlog begin */ #if (FEATURE_PTM == FEATURE_ON) NAS_LMM_ErrlogInfoProc(pRcvEmmMsg->ucCause); #endif /* xiongxianghui00253310 modify for ftmerrlog end */ /* 根据当前场景考虑是否修改原因值 */ NAS_LMM_AdaptRegRejCau(&NAS_EMM_GLO_AD_GetAttRejCau()); if(pRcvEmmMsg->ucBitOpMsgCon == NAS_EMM_AD_BIT_SLCT) { /*向ESM发送消息*/ NAS_EMM_EsmSendDataInd( &(pRcvEmmMsg->stMsgCon)); } switch(NAS_EMM_GLO_GetCnAttReqType()) { case MMC_LMM_ATT_TYPE_EPS_ONLY: uAttachType = LNAS_STK_UPDATE_TYPE_EPS_ATTACH; break; case MMC_LMM_ATT_TYPE_COMBINED_EPS_IMSI: uAttachType = LNAS_STK_UPDATE_TYPE_COMBINED_ATTACH; break; default: uAttachType = LNAS_STK_UPDATE_TYPE_EPS_ATTACH; break; } /*在ATTACH过程中出现rej,将rej事件报告给STK*/ NAS_EMM_SendRejEventToSTK(NAS_EMM_GLO_AD_GetAttRejCau(), uAttachType); /*判断拒绝原因值,根据不同原因值进行处理*/ NAS_EMM_RejCauseValProc(NAS_EMM_GLO_AD_GetAttRejCau()); return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachAcp(VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { NAS_EMM_CN_ATTACH_ACP_STRU *pRcvEmmMsg; NAS_LMM_NETWORK_INFO_STRU *pMmNetInfo = VOS_NULL_PTR; #if (VOS_OS_VER != VOS_WIN32) static VOS_UINT32 s_ulAttachAcpCnt = 1; #endif (VOS_VOID)ulMsgId; pRcvEmmMsg = (NAS_EMM_CN_ATTACH_ACP_STRU *)pMsgStru; /*打印进入该函数*/ NAS_EMM_ATTACH_LOG_NORM("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachAcp is entered"); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_REG_INIT,EMM_SS_ATTACH_WAIT_CN_ATTACH_CNF)) { /*打印出错信息*/ NAS_EMM_ATTACH_LOG_WARN("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachAcp: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /* 如果ATTACH ACP消息内容不合法,不处理消息,直接丢弃*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_CnAttachAcpMsgChk(pRcvEmmMsg)) { NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_MsRegInitSsWtCnAttCnfMsgCnAttachAcp: NAS_EMM_CN_ATTACH_ACC_STRU para err!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /*停止定时器T3410*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_T3410); /* 存储ATTACH ACCPET中携带的信元 */ NAS_EMM_SaveAttachAcpIe(pMsgStru); /*清除ATTACH ATTEMPTING COUNTER和TRACKING AREA UPDATING ATTEMPT计数器*/ /*NAS_EMM_GLO_AD_GetAttAtmpCnt() = 0;*/ NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); /*注册成功后,注册前的TAU/SERVICE/DETACH模块记录的历史信息不应该影响后续流程 清除TAU/service/detach资源 */ NAS_EMM_TAU_ClearResouce(); NAS_EMM_SER_ClearResource(); NAS_EMM_Detach_ClearResourse(); /*联合注册仅EPS ONLY成功*/ if ((MMC_LMM_ATT_TYPE_COMBINED_EPS_IMSI == NAS_EMM_GLO_GetCnAttReqType()) && (EMM_ATTACH_RST_PS == pRcvEmmMsg->ucAttachRst)) { NAS_EMM_ProcEpsOnlySucc(pMsgStru); } else { /*设置EPS UPDATE STAUS为EU1*/ NAS_LMM_GetMmAuxFsmAddr()->ucEmmUpStat = EMM_US_UPDATED_EU1; /*启动定时器TI_NAS_EMM_WAIT_ESM_BEARER_CNF*/ NAS_LMM_StartStateTimer( TI_NAS_EMM_WAIT_ESM_BEARER_CNF); /*修改状态:进入主状态REG_INIT子状态ATTACH_WAIT_ESM_BEARER_CNF*/ NAS_EMM_AdStateConvert( EMM_MS_REG_INIT, EMM_SS_ATTACH_WAIT_ESM_BEARER_CNF, TI_NAS_EMM_WAIT_ESM_BEARER_CNF); } /* lihong00150010 emergency tau&service begin */ /* 参照标杆做法,在收到ATTACH ACCEPT时就更新GUTI, LAST VISIT TAI,EU值, 并写卡或者NV */ pMmNetInfo = NAS_LMM_GetEmmInfoNetInfoAddr(); NAS_EMM_SetLVRTai( &pMmNetInfo->stPresentNetId); /* 判断没有放到函数NAS_LMM_WritePsLoc中来做,是由于紧急注册被拒或者尝试次数 达到5次时还是要删除参数 ,协议只规定是紧急注册成功后才不写卡或者NV项 */ if (NAS_LMM_REG_STATUS_EMC_REGING != NAS_LMM_GetEmmInfoRegStatus()) { /*保存PS LOC信息*/ NAS_LMM_WritePsLoc(NAS_NV_ITEM_UPDATE); } /* lihong00150010 emergency tau&service end */ /* 清除接入技术变化标识,在这里清除不考虑ATTACH失败的原因值 因为要么必然转入了DEREG态,要么MME已经查询完UE无线能力*/ NAS_EMM_ClearUeRadioAccCapChgFlag(); #if (VOS_OS_VER != VOS_WIN32) if(1 == s_ulAttachAcpCnt) { (VOS_VOID)ddmPhaseScoreBoot("UE attach success",__LINE__); s_ulAttachAcpCnt++; } #endif return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_MsTauInitSsWaitCnTauCnfProcMsgAuthRej( VOS_UINT32 ulCause) { MMC_LMM_TAU_RSLT_ENUM_UINT32 enTauRslt = MMC_LMM_TAU_RSLT_AUTH_REJ; (VOS_VOID)ulCause; NAS_EMM_TAU_LOG_INFO( "NAS_EMM_MsTauInitSsWaitCnTauCnfProcMsgAuthRej is entered."); /*停止定时器*/ NAS_LMM_StopStateTimer( TI_NAS_EMM_STATE_TAU_T3430); NAS_LMM_StopPtlTimer( TI_NAS_EMM_PTL_T3416); NAS_EMM_SecuClearRandRes(); /* 删除GUTI后会自动保存EPS_LOC,所以需要先设置STATUS */ /*设置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_LIMITED_SERVICE*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI, TI_NAS_EMM_STATE_NO_TIMER); /* 上报TAU结果在冲突处理中执行 */ /****检查冲突标志并做相应的处理********************************************/ switch(NAS_EMM_TAU_GetEmmCollisionCtrl()) { case NAS_EMM_COLLISION_DETACH : NAS_EMM_MmcSendTauActionResultIndOthertype((VOS_VOID*)&enTauRslt); NAS_EMM_TAU_CollisionDetachProc(); break; case NAS_EMM_COLLISION_SERVICE : NAS_EMM_TAU_CollisionServiceProc(NAS_EMM_MmcSendTauActionResultIndOthertype, (VOS_VOID*)&enTauRslt, NAS_EMM_TRANSFER_RAT_NOT_ALLOW); break; default : NAS_EMM_TAU_LOG_INFO( "NAS_EMM_MsTauInitSsWaitCnTauCnfProcMsgAuthRej : NO Emm Collision."); NAS_EMM_MmcSendTauActionResultIndOthertype((VOS_VOID*)&enTauRslt); break; } /*向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_VOID NAS_EMM_TAU_RcvTAURej ( const NAS_EMM_CN_CAUSE_ENUM_UINT8 ucTAUrejcause, NAS_EMM_CN_TAU_REJ_STRU *pstTAURej ) { /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO("Nas_Emm_Tau_RcvTAURej is entered."); /* 停止定时器3430*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_TAU_T3430); /* 根据原因值做不同处理*/ switch(ucTAUrejcause) { case NAS_LMM_CAUSE_ILLEGAL_UE : case NAS_LMM_CAUSE_ILLEGAL_ME : case NAS_LMM_CAUSE_EPS_SERV_NOT_ALLOW : NAS_EMM_TAU_TAUReqRejectCasue367(); break; case NAS_LMM_CAUSE_EPS_SERV_AND_NON_EPS_SERV_NOT_ALLOW: NAS_EMM_TAU_TAUReqRejectCasue8(); break; case NAS_LMM_CAUSE_UE_ID_NOT_DERIVED : NAS_EMM_TAU_TAUReqRejectCasue9(); break; case NAS_LMM_CAUSE_IMPLICIT_DETACHED : /* 必须先给MMC发送LMM_MMC_TAU_RESULT_IND,后处理拒绝原因值10, 因为NAS_EMM_TAU_TAUReqRejectCasue10函数会调用NAS_EMM_TAU_ClearResouce 请求TAU流程所有资源,如果先处理拒绝原因值10,则在发送LMM_MMC_TAU_RESULT_IND 时,无法得到正确的TAU类型 */ /*向MMC发送LMM_MMC_TAU_RESULT_IND消息*/ NAS_EMM_TAU_TAUReqRejectCasue10(); break; case NAS_LMM_CAUSE_PLMN_NOT_ALLOW : NAS_EMM_TAU_TAUReqRejectCasue11(); break; case NAS_LMM_CAUSE_REQUESTED_SER_OPTION_NOT_AUTHORIZED_IN_PLMN: NAS_EMM_TAU_TAUReqRejectCasue35(ucTAUrejcause); break; case NAS_LMM_CAUSE_TA_NOT_ALLOW : NAS_EMM_TAU_TAUReqRejectCasue12(); break; case NAS_LMM_CAUSE_ROAM_NOT_ALLOW : NAS_EMM_TAU_TAUReqRejectCasue13(); break; case NAS_LMM_CAUSE_EPS_SERV_NOT_ALLOW_IN_PLMN : NAS_EMM_TAU_TAUReqRejectCasue14(); break; case NAS_LMM_CAUSE_NO_SUITABL_CELL : NAS_EMM_TAU_TAUReqRejectCasue15(); break; /* CSG功能尚未实现,收到REJ #25按非CSG处理,进入default处理分支*/ #if 0 case NAS_LMM_CAUSE_NOT_AUTHORIZED_FOR_THIS_CSG : NAS_EMM_TAU_TAUReqRejectCasue25(); #if 0 /*向MMC发送LMM_MMC_TAU_RESULT_IND消息*/ NAS_EMM_MmcSendTauActionResultIndRej(ucTAUrejcause); #endif break; #endif case NAS_LMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED: NAS_EMM_TAU_TAUReqRejectCasue40(); break; case NAS_LMM_CAUSE_PROCEDURE_CONGESTION: if (NAS_EMM_BIT_SLCT == pstTAURej->ucBitOpT3346) { NAS_EMM_TAU_TAUReqRejectCasue22(); } else { NAS_EMM_TAU_TAUReqRejectOtherCause(ucTAUrejcause); } break; default : NAS_EMM_TAU_TAUReqRejectOtherCause(ucTAUrejcause); break; } return; }