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; }
/***************************************************************************** Function Name : NAS_EMM_DetGuAttachRst Description : 挂起状态下,处理GU发来的DETACH结果 Input :VOS_VOID Output : None Return : VOS_VOID History : 1.Hanlufeng 41410 2011-5-12 Draft Enact *****************************************************************************/ VOS_VOID NAS_EMM_DetGuAttachRst( VOS_VOID * pMsg ) { MMC_LMM_ACTION_RESULT_REQ_STRU *pMmcActResult; pMmcActResult = (MMC_LMM_ACTION_RESULT_REQ_STRU *)pMsg; NAS_EMM_ATTACH_LOG1_NORM("NAS_EMM_AttGuAttachRst: ulActRst =.", pMmcActResult->ulActRst); /* 若非PS相关的,暂时丢弃,待联合操作时再考虑 */ if(MMC_LMM_IMSI_ONLY == pMmcActResult->ulRstDomain) { NAS_EMM_ATTACH_LOG1_NORM("NAS_EMM_AttGuAttachRst: ulRstDomain =.", pMmcActResult->ulRstDomain); return; } /* DETACH 无论成功失败,都认为去注册完成 */ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NO_CELL_AVAILABLE, TI_NAS_EMM_STATE_NO_TIMER); /* 通知ESM状态改变 */ NAS_EMM_PUB_SendEsmStatusInd(EMM_ESM_ATTACH_STATUS_DETACHED); return; }
VOS_VOID NAS_EMM_ProcRejCauseVal14() { NAS_EMM_AttDataUpdate(NAS_EMM_NOT_DELETE_RPLMN); if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); NAS_EMM_WaitNetworkRelInd(); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } return; }
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; }
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; }
VOS_UINT32 NAS_EMM_PreProcMsgT3412Exp(MsgBlock * pMsg ) { /*VOS_UINT32 ulCurEmmStat = NAS_EMM_NULL;*/ (void)pMsg; NAS_LMM_PUBM_LOG_INFO("NAS_EMM_PreProcMsgT3412Exp enter!"); /*通知GU模t3412超时*/ NAS_EMM_SendTimerStateNotify(TI_NAS_EMM_PTL_T3412, LMM_MMC_TIMER_EXP); /* ulCurEmmStat = NAS_LMM_PUB_COMP_EMMSTATE( NAS_EMM_CUR_MAIN_STAT, NAS_EMM_CUR_SUB_STAT); */ /*当前的状态是NAS_EMM_CONN_ESTING,则说明正在建链过程中收到了周期性TAU超时 设置超时标记,该标记该如何处理呢?两种情况: 1. 在TAU或者service流程中,建链成功,TAU, SERVCIE成功会清该标示,不再发起周期TAU 2. 在TAU或者service流程中,如果建链失败,则转到相应的状态之后,等待RRC重新驻留, 上报系统消息之后,发起TAU之前会判断该标识,确定是否要发起周期TAU */ if(NAS_EMM_CONN_ESTING == NAS_EMM_GetConnState()) { /*设置周期TAU定时器标示*/ NAS_LMM_SetEmmInfoT3412ExpCtrl(NAS_EMM_T3412_EXP_YES_OTHER_STATE); return NAS_LMM_MSG_HANDLED; } /* 如果注册状态不为紧急注册,则需要进入状态机进行处理 */ if (NAS_LMM_REG_STATUS_EMC_REGED != NAS_LMM_GetEmmInfoRegStatus()) { return NAS_LMM_MSG_DISCARD; } /* 如果是紧急注册,本地DETACH */ NAS_EMM_EsmSendStatResult( EMM_ESM_ATTACH_STATUS_DETACHED); NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 本地DETACH释放资源:动态内存、赋初值 */ NAS_LMM_DeregReleaseResource(); /*向MMC发送本地LMM_MMC_DETACH_IND消息*/ NAS_EMM_MmcSendDetIndLocal( MMC_LMM_L_LOCAL_DETACH_OTHERS); #if (FEATURE_PTM == FEATURE_ON) NAS_EMM_LocalDetachErrRecord(EMM_ERR_LOG_LOCAL_DETACH_TYPE_OTHER); #endif return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsDrgInitSsWtCnDetCnfMsgT3421Exp( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { /*打印进入该函数*/ NAS_EMM_DETACH_LOG2_INFO("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgT3421Exp", ulMsgId, pMsgStru); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_DEREG_INIT,EMM_SS_DETACH_WAIT_CN_DETACH_CNF)) { /*打印出错信息*/ NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgT3421Exp: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*Detach attempt counter加1*/ NAS_EMM_GLO_AD_GetDetAtmpCnt()++; /*判断Detach attempt counter,分为小于5和大于等于5处理*/ if (NAS_EMM_GLO_AD_GetDetAtmpCnt() < 5) { /*发送DETACH REQUEST消息*/ NAS_EMM_SendDetachReqMo(); } else { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgT3421Exp 5 times"); /*向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 { 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); /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); } return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_ProcRejCauseVal15() { NAS_MM_TA_STRU stTa; /* 获取当前TA */ NAS_EMM_GetCurrentTa(&stTa); NAS_EMM_AttDataUpdate(NAS_EMM_NOT_DELETE_RPLMN); if (NAS_EMMC_USER_SPEC_PLMN_YES == NAS_EMMC_GetUserSpecPlmnFlag()) { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRej15Addr()); } else { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRoamAddr()); NAS_EMMC_SendRrcCellSelectionReq(LRRC_LNAS_FORBTA_CHANGE); } if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); NAS_EMM_WaitNetworkRelInd(); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } 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_ProcRejCauseVal2(VOS_VOID) { /*清除ATTACH ATTEMPTING COUNTER和TRACKING AREA UPDATING ATTEMPT计数器*/ NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); /*设置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); return; }
VOS_VOID NAS_EMM_ProcRejCauseVal12() { NAS_MM_TA_STRU stTa; /* 获取当前TA */ NAS_EMM_GetCurrentTa(&stTa); NAS_EMM_AttDataUpdate(NAS_EMM_NOT_DELETE_RPLMN); NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRposAddr()); /* 增加REJ cause 12标记,用于向MMC上报有区域限制的限制服务状态 2011-07-27*/ NAS_LMM_SetNasRejCause12Flag(NAS_LMM_REJ_CAUSE_IS_12); if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); NAS_EMM_WaitNetworkRelInd(); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } return; }
VOS_VOID NAS_EMM_ProcRejCauseVal3678() { NAS_EMM_AttDataUpdate(NAS_EMM_DELETE_RPLMN); NAS_LMM_SetPsSimValidity(NAS_LMM_SIM_INVALID); if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); /*向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); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } /* 清除之前记录的attach原因值 */ NAS_LMM_ClearEmmInfoMmcAttachReason(); return; }
VOS_VOID NAS_EMM_EmcPndReqSerAbnormalCommProc ( NAS_EMM_SUB_STATE_ENUM_UINT16 ucSs ) { NAS_EMM_TAU_SendEsmStatusInd(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); /* 本地DETACH释放资源:动态内存、赋初值 */ NAS_LMM_DeregReleaseResource(); /*向MMC发送本地LMM_MMC_DETACH_IND消息*/ NAS_EMM_MmcSendDetIndLocal( MMC_LMM_L_LOCAL_DETACH_OTHERS); /* 记录ATTACH触发原因值 */ NAS_EMM_GLO_AD_GetAttCau() = EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER; NAS_EMM_AdStateConvert( EMM_MS_DEREG, ucSs, TI_NAS_EMM_STATE_NO_TIMER); }
VOS_VOID NAS_EMM_ProcRejCauseVal5() { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); /* 通知IMSA不再尝试CS域 */ 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; }
VOS_VOID NAS_EMM_ProcRejCauseVal161722(VOS_VOID ) { /*根据GCF协议36523 9.2.1.2.3章节描述,先清除ATTACH ATTEMPTING COUNTER和 TRACKING AREA UPDATING ATTEMPT计数器,再对TRACKING AREA UPDATING ATTEMPT 计数器加1*/ NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); /*tracking area updating attempt counter shall be incremented*/ NAS_EMM_TAU_GetEmmTAUAttemptCnt() ++; /*设置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); return; }
VOS_UINT32 NAS_EMM_MsDrgSsNmlSrvMsgAppAttachReq( 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_INFO("NAS_EMM_MsDrgSsNmlSrvMsgAppAttachReq is entered"); /*检查状态是否匹配,若不匹配,退出*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_DEREG,EMM_SS_DEREG_NORMAL_SERVICE)) { /*打印出错信息*/ NAS_EMM_ATTACH_LOG_WARN("NAS_EMM_MsDrgSsNmlSrvMsgAppAttachReq: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*消息内容检查,若有错,打印并退出*/ if (NAS_EMM_PARA_INVALID == NAS_EMM_AppAttachReqMsgChk(pRcvEmmMsg)) { NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_MsDrgSsNmlSrvMsgAppAttachReq: NAS_EMM_CN_ATTACH_REQ_STRU PARA ERR!"); return NAS_LMM_ERR_CODE_PARA_INVALID; } /*保存APP参数*/ NAS_EMM_SaveAppMsgPara(pRcvEmmMsg->ulMsgId,pRcvEmmMsg->ulOpId); /*保存触发ATTACH的原因*/ NAS_EMM_GLO_AD_GetAttCau() = EMM_ATTACH_CAUSE_APP; /* 用户请求ATTACH类型为IMSI,UE模式为PS,则直接回复FAILURE , 用户请求ATTACH类型为IMSI,UE模式为CS_PS,此时注册状态为NULL,则直接回复FAILURE , 综上,dereg.normalserive状态下CS的ATTACH都直接回复失败 */ if (MMC_LMM_ATT_REQ_TYPE_CS_ONLY == pRcvEmmMsg->ulAttachType) { NAS_EMM_MmcSendAttCnf(MMC_LMM_ATT_RSLT_FAILURE); } /*用户请求ATTACH类型为PS或者CS_PS,直接发起ATTACH,填充ATTACH消息时判断ATTACH类型*/ else { /*向ESM发送ID_EMM_ESM_PDN_CON_IND消息*/ NAS_EMM_EsmSendPdnConnInd( NAS_EMM_DEFAULT_CID); /*启动定时器TI_NAS_EMM_WAIT_ESM_PDN_RSP*/ NAS_LMM_StartStateTimer( TI_NAS_EMM_WAIT_ESM_PDN_RSP); /*修改状态:进入主状态REG_INIT子状态ATTACH_WAIT_ESM_PDN_RSP*/ NAS_EMM_AdStateConvert( EMM_MS_REG_INIT, EMM_SS_ATTACH_WAIT_ESM_PDN_RSP, TI_NAS_EMM_WAIT_ESM_PDN_RSP); } 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_MsDrgInitSsWtCnDetCnfMsgIntraConnectFailInd( 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_MsDrgInitSsWtCnDetCnfMsgIntraConnectFailInd 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_MsDrgInitSsWtCnDetCnfMsgIntraConnectFailInd: NULL PTR!"); return NAS_LMM_MSG_DISCARD; } /*check current state*/ if (NAS_EMM_AD_CHK_STAT_INVALID(EMM_MS_DEREG_INIT,EMM_SS_DETACH_WAIT_CN_DETACH_CNF)) { NAS_EMM_DETACH_LOG_WARN("NAS_EMM_MsDrgInitSsWtCnDetCnfMsgIntraConnectFailInd: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*停止定时器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 */ /*修改状态:进入主状态DEREG子状态DEREG_NORMAL_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); } else { /*NAS_EMM_ProcLocalNoUsim();*/ /*修改状态:进入主状态DEREG子状态DEREG_NORMAL_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_NO_IMSI, TI_NAS_EMM_STATE_NO_TIMER); /* 给MMC回复LMM_MMC_USIM_STATUS_CNF */ NAS_EMM_SendMmcUsimStatusCnf(); /* lihong00150010 emergency tau&service begin */ /* 清除拔卡标识 */ NAS_EMM_GLO_AD_GetUsimPullOutFlag() = VOS_FALSE; /* lihong00150010 emergency tau&service end */ } if ((LRRC_EST_ACCESS_BARRED_MO_SIGNAL == pMrrcConnectFailInd->enEstResult) || (LRRC_EST_ACCESS_BARRED_ALL == pMrrcConnectFailInd->enEstResult)) { /*向MMC发送LMM_MMC_DETACH_CNF消息*/ /*NAS_EMM_AppSendDetCnf(MMC_LMM_DETACH_RSLT_ACCESS_BARED);*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_ACCESS_BARED); } else { /*向MMC发送本地LMM_MMC_DETACH_IND消息*/ /*NAS_EMM_MmcSendDetIndLocal();*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); } /* 本地DETACH释放资源:动态内存、赋初值 */ NAS_LMM_DeregReleaseResource(); /*send INTRA_CONN2IDLE_REQ,更新连接状态*/ NAS_EMM_CommProcConn2Ilde(); return NAS_LMM_MSG_HANDLED; }
VOS_UINT32 NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgT3421Exp ( VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru ) { /*打印进入该函数*/ NAS_EMM_DETACH_LOG2_INFO("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgT3421Exp", 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_MsRegImsiDetachWtCnDetCnfMsgT3421Exp: STATE ERR!"); return NAS_LMM_MSG_DISCARD; } /*Detach attempt counter加1*/ NAS_EMM_GLO_AD_GetDetAtmpCnt()++; /*判断Detach attempt counter,分为小于5和大于等于5处理*/ if (NAS_EMM_GLO_AD_GetDetAtmpCnt() < 5) { /*发送DETACH REQUEST消息*/ NAS_EMM_SendImsiDetachReqMo(); return NAS_LMM_MSG_HANDLED; } NAS_EMM_DETACH_LOG_INFO("NAS_EMM_MsRegImsiDetachWtCnDetCnfMsgT3421Exp 5 times"); NAS_EMM_GLO_AD_GetDetAtmpCnt() = 0; /* 设置注册域为PS */ NAS_LMM_SetEmmInfoRegDomain(NAS_LMM_REG_DOMAIN_PS); /* 如果当前是数据连接态,则直接转到REG+NORMAL_SERVIC态,否则待释放RRC链路 后再转到REG+NORMAL_SERVIC态 */ if (NAS_EMM_CONN_DATA == NAS_EMM_GetConnState()) { NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /*向MMC发送本地LMM_MMC_DETACH_IND消息*/ NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); return NAS_LMM_MSG_HANDLED; } NAS_EMM_AdStateConvert( EMM_MS_REG, EMM_SS_REG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); NAS_EMM_SendDetRslt(MMC_LMM_DETACH_RSLT_SUCCESS); /*向MRRC发送NAS_EMM_MRRC_REL_REQ消息*/ NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_ProcRejCauseVal15() { NAS_MM_TA_STRU stTa; MMC_LMM_LTE_NO_SUBSCRIBE_PLMN_LIST_STRU stLteNoSubsPlmnList; /* 获取当前TA */ NAS_EMM_GetCurrentTa(&stTa); NAS_EMM_AttDataUpdate(NAS_EMM_NOT_DELETE_RPLMN); if (NAS_EMMC_USER_SPEC_PLMN_YES == NAS_EMMC_GetUserSpecPlmnFlag()) { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRej15Addr()); } else { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRoamAddr()); NAS_EMMC_SendRrcCellSelectionReq(LRRC_LNAS_FORBTA_CHANGE); } if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); /*被15拒绝,当前PLMN只有一个*/ stLteNoSubsPlmnList.ulPlmnNum = 1; /*拷贝当前PLMN*/ NAS_LMM_MEM_CPY(&(stLteNoSubsPlmnList.astPlmnId[0]), NAS_LMM_GetEmmInfoPresentPlmnAddr(), sizeof(MMC_LMM_PLMN_ID_STRU)); /*如果网络侧带了扩展原因值,而且当前对应值是EUTRAN NOT ALLOW,则走正常的协议流程*/ if((NAS_EMM_BIT_SLCT == NAS_EMM_GLO_AD_OP_GetAttRejEmmExtCau()) &&(NAS_EMM_EUTRAN_NOT_ALLOWED == NAS_EMM_GLO_AD_GetAttRejEmmExtCau())) { /*被15原因值拒绝而且当前有扩展原因值,指示USIM未在LTE开户,走正常的LTE未开户流程*/ NAS_EMM_SetLteNoSubscribeExtCauseFlag(NAS_EMM_EUTRAN_NOT_ALLOWED); NAS_LMM_LteNoSubscribeWithExtCauseHandle(&stLteNoSubsPlmnList); } else { /*被15原因值拒绝但是没有带扩展原因值,走LTE未开户定制流程*/ NAS_LMM_LteNoSubscribeWithOutExtCauseHandle(&stLteNoSubsPlmnList); } NAS_EMM_WaitNetworkRelInd(); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } return; }
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; }