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_TAU_TAUReqRejectCasue10(VOS_VOID) { VOS_UINT32 ulAttachFlag = VOS_TRUE; NAS_EMM_ESM_MSG_BUFF_STRU *pstEsmMsg = NAS_EMM_NULL_PTR; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO( "Nas_Emm_Tau_TAUReqRejectCasue10 is entered."); /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { 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 */ /* 状态迁移Dereg.Normal_Service,发送INTRA_ATTACH_REQ消息*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 进入DEREG态不再写统一写安全上下文,参照标杆,在TAU被#10拒绝,将安全上下文写卡 */ NAS_LMM_WriteEpsSecuContext(NAS_NV_ITEM_UPDATE); switch(NAS_EMM_TAU_GetEmmCollisionCtrl()) { case NAS_EMM_COLLISION_DETACH: /* 向MMC报TAU结果需在DETACH结果上报前 */ NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); NAS_EMM_TAU_CollisionDetachProc(); if (MMC_LMM_MO_DET_CS_ONLY != NAS_EMM_GLO_AD_GetDetTypeMo()) { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue10:Process EPS Detach or EPS/IMSI Detach"); /* 本地DETACH*/ NAS_LMM_DeregReleaseResource(); NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return; } NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue10:Process IMSI Detach"); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); break; case NAS_EMM_COLLISION_SERVICE: /* 如果是紧急CSFB,则标识不发内部ATTACH */ if(VOS_FALSE == NAS_EMM_SER_IsNotEmergencyCsfb()) { ulAttachFlag = VOS_FALSE; } /* 上报TAU结果在SER冲突处理中执行 */ NAS_EMM_TAU_CollisionServiceProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, NAS_EMM_TRANSFER_RAT_NOT_ALLOW); break; default: NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); break; } /* lihong00150010 emergency tau&service begin */ pstEsmMsg = (NAS_EMM_ESM_MSG_BUFF_STRU*)(VOS_VOID*)NAS_LMM_GetEmmInfoEsmBuffAddr(); if ((NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) && (NAS_EMM_NULL_PTR != pstEsmMsg)) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_RrcRelCause_TAUREJ9: CAUSE_ESM_EMC_PDN_REQ"); /*保存ESM消息*/ /*lint -e960*/ NAS_LMM_MEM_CPY( (VOS_VOID*)NAS_EMM_GLO_AD_GetEsmMsgAddr(), &(pstEsmMsg->stEsmMsg), (pstEsmMsg->stEsmMsg.ulEsmMsgSize)+4); /*lint +e960*/ NAS_EMM_StartEmergencyAttach(); } else if(VOS_TRUE == ulAttachFlag) {/* lihong00150010 emergency tau&service end */ /* 延时发送attach请求 */ NAS_EMM_ReattachDelay(); } else { NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); } /* 清空TAU和APP资源*/ NAS_EMM_TAU_ClearResouce(); NAS_EMM_ClearAppMsgPara(); return; }
VOS_VOID NAS_EMM_TAU_TAUReqRejectCasue40() { VOS_UINT32 ulAttachFlag = VOS_TRUE; NAS_EMM_ESM_MSG_BUFF_STRU *pstEsmMsg = NAS_EMM_NULL_PTR; NAS_EMM_TAU_LOG_INFO( "NAS_EMM_TAU_TAUReqRejectCasue40 is entered."); /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { 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_REG+SS_REG_LIMITED_SERVICE*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 上报TAU结果在冲突处理中执行 */ /****检查冲突标志并做相应的处理********************************************/ switch(NAS_EMM_TAU_GetEmmCollisionCtrl()) { case NAS_EMM_COLLISION_DETACH : NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); if (MMC_LMM_MO_DET_CS_ONLY != NAS_EMM_GLO_AD_GetDetTypeMo()) { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue40:Process EPS Detach or EPS/IMSI Detach"); NAS_EMM_TAU_CollisionDetachProc(); /* 本地DETACH*/ NAS_LMM_DeregReleaseResource(); NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); return; } else { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue40:Process IMSI Detach"); NAS_EMM_TAU_CollisionDetachProc(); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); } break; case NAS_EMM_COLLISION_SERVICE : /* 如果是紧急CSFB,则标识不发内部ATTACH */ if(VOS_FALSE == NAS_EMM_SER_IsNotEmergencyCsfb()) { ulAttachFlag = VOS_FALSE; } NAS_EMM_TAU_CollisionServiceProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, NAS_EMM_TRANSFER_RAT_NOT_ALLOW); break; default : NAS_EMM_TAU_LOG_INFO( "NAS_EMM_TAU_TAUReqRejectCasue40 : NO Emm Collision."); NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); break; } /* lihong00150010 emergency tau&service begin */ pstEsmMsg = (NAS_EMM_ESM_MSG_BUFF_STRU*)(VOS_VOID*)NAS_LMM_GetEmmInfoEsmBuffAddr(); if ((NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) && (NAS_EMM_NULL_PTR != pstEsmMsg)) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_RrcRelCause_TAUREJ9: CAUSE_ESM_EMC_PDN_REQ"); /*保存ESM消息*/ /*lint -e960*/ NAS_LMM_MEM_CPY( (VOS_VOID*)NAS_EMM_GLO_AD_GetEsmMsgAddr(), &(pstEsmMsg->stEsmMsg), (pstEsmMsg->stEsmMsg.ulEsmMsgSize)+4); /*lint +e960*/ NAS_EMM_StartEmergencyAttach(); } else if (VOS_TRUE == ulAttachFlag) {/* lihong00150010 emergency tau&service end */ /* 延时发送attach请求 */ NAS_EMM_ReattachDelay(); } else { NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); } /* 清空TAU流程所有资源*/ NAS_EMM_TAU_ClearResouce(); NAS_EMM_ClearAppMsgPara(); return; }
VOS_VOID NAS_EMM_TAU_TAUReqRejectCasue9( ) { VOS_UINT32 ulAttachFlag = VOS_TRUE; NAS_EMM_ESM_MSG_BUFF_STRU *pstEsmMsg = NAS_EMM_NULL_PTR; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO("Nas_Emm_Tau_TAUReqRejectCasue9 is entered."); /* 删除GUTI后会自动保存EPS_LOC,所以需要先设置STATUS */ /*设置设置EU2 NOT UPDATED*/ NAS_LMM_GetMmAuxFsmAddr()->ucEmmUpStat = EMM_US_NOT_UPDATED_EU2; /*删除GUTI,KSIasme,TAI list,GUTI*/ NAS_EMM_ClearRegInfo(NAS_EMM_NOT_DELETE_RPLMN); /*删除equivalent PLMNs由MMC模块完成*/ /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { 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_NORMAL_SERVICE*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_DEREG, EMM_SS_DEREG_NORMAL_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /****检查冲突标志并做相应的处理********************************************/ switch(NAS_EMM_TAU_GetEmmCollisionCtrl()) { case NAS_EMM_COLLISION_DETACH : NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); NAS_EMM_TAU_CollisionDetachProc(); if (MMC_LMM_MO_DET_CS_ONLY != NAS_EMM_GLO_AD_GetDetTypeMo()) { NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue9:Process EPS/Combined Detach"); /* 本地DETACH*/ NAS_LMM_DeregReleaseResource(); NAS_EMM_RelReq( NAS_LMM_NOT_BARRED); return; } NAS_EMM_DETACH_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue9:Process IMSI Detach"); /* IMSI DETACH后释放资源 */ NAS_LMM_ImsiDetachReleaseResource(); break; case NAS_EMM_COLLISION_SERVICE : /* 如果是紧急CSFB,则标识不发内部ATTACH */ if(VOS_FALSE == NAS_EMM_SER_IsNotEmergencyCsfb()) { ulAttachFlag = VOS_FALSE; } NAS_EMM_TAU_CollisionServiceProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, NAS_EMM_TRANSFER_RAT_NOT_ALLOW); break; default : NAS_EMM_TAU_LOG_INFO( "NAS_EMM_TAU_RrcRelCause_TAUREJ9 : NO Emm Collision."); NAS_EMM_MmcSendTauActionResultIndRej((VOS_VOID*)NAS_EMM_NULL_PTR); break; } /* lihong00150010 emergency tau&service begin */ pstEsmMsg = (NAS_EMM_ESM_MSG_BUFF_STRU*)(VOS_VOID*)NAS_LMM_GetEmmInfoEsmBuffAddr(); if ((NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) && (NAS_EMM_NULL_PTR != pstEsmMsg)) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_RrcRelCause_TAUREJ9: CAUSE_ESM_EMC_PDN_REQ"); /*保存ESM消息*/ /*lint -e960*/ NAS_LMM_MEM_CPY( (VOS_VOID*)NAS_EMM_GLO_AD_GetEsmMsgAddr(), &(pstEsmMsg->stEsmMsg), (pstEsmMsg->stEsmMsg.ulEsmMsgSize)+4); /*lint +e960*/ NAS_EMM_StartEmergencyAttach(); } else if(VOS_TRUE == ulAttachFlag) {/* lihong00150010 emergency tau&service end */ /* 延时发送attach请求 */ NAS_EMM_ReattachDelay(); } else { NAS_EMM_RelReq(NAS_LMM_NOT_BARRED); } /* 清空TAU流程所有资源*/ NAS_EMM_TAU_ClearResouce(); NAS_EMM_ClearAppMsgPara(); return; }