VOS_UINT32 NAS_EMM_PreProcMsgDataInd( VOS_VOID ) { VOS_UINT32 ulRet; NAS_LMM_PUBM_LOG_INFO("NAS_EMM_PreProcMsgDataInd enter!"); /*根据消息类型进入不同的处理函数,如果不是EmmInformation或者EmmStatus消息就进入状态机*/ if (NAS_EMM_CN_MT_EMM_INFO == g_stCnDecodeMsgStru.ulCnMsgType) { ulRet = NAS_EMM_PreProcMsgEmmInfo(&(g_stCnDecodeMsgStru.uCnMsgStru)); } else if (NAS_EMM_CN_MT_EMM_STATUS == g_stCnDecodeMsgStru.ulCnMsgType) { ulRet = NAS_EMM_PreProcMsgEmmStatus(&(g_stCnDecodeMsgStru.uCnMsgStru)); } else if (NAS_EMM_CN_MT_DOWNLINK_NAS_TRANSPORT == g_stCnDecodeMsgStru.ulCnMsgType) { ulRet = NAS_EMM_PreProcMsgDlNasTransport(&(g_stCnDecodeMsgStru.uCnMsgStru)); } else if (NAS_EMM_CN_CS_SER_NOTIFICATION == g_stCnDecodeMsgStru.ulCnMsgType) { ulRet = NAS_EMM_PreProcMsgCsSerNotification(&(g_stCnDecodeMsgStru.uCnMsgStru)); } else { ulRet = NAS_LMM_MSG_DISCARD; } return ulRet; }
/***************************************************************************** Function Name : NAS_LMM_PreProcMmcEnableReq Description : 收到MMC Enable LTE的命令的处理 Input : None Output : None Return : VOS_UINT32 History : 1.zhengjunyan 2011-11-9 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_LMM_PreProcMmcEnableReq( MsgBlock *pMsg ) { (void)pMsg; NAS_LMM_PUBM_LOG_INFO("NAS_LMM_PreProcMmcEnableReq Enter."); /* 记录LTE接入技术为ENABLE态*/ NAS_EMM_SetLteEnableSta( NAS_LMM_LTE_ENABLED); return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_EMM_SmRabmAbnarmalProc( VOS_VOID ) { NAS_LMM_PUBM_LOG_INFO("NAS_EMM_SmRabmAbnarmalProc is entered"); /* 复位处理*/ NAS_EMM_SendMmcErrInd(NAS_EMM_REBOOT_TYPE_ESM_ABNORMAL); 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_VOID NAS_LMM_PreProcAnyStateUsimAuthCnf(const USIMM_AUTH_CNF_STRU *pstUsimAuthCnf) { VOS_UINT32 ulDeriveKeyRslt; USIMM_TELECOM_AUTH_CNF_STRU *pstAuthCnf; NAS_LMM_PUBM_LOG_INFO("NAS_LMM_PreProcUsimAuthCnf is entered"); pstAuthCnf = (USIMM_TELECOM_AUTH_CNF_STRU*)&pstUsimAuthCnf->cnfdata.stTELECnf; if( USIMM_AUTH_UMTS_SUCCESS == pstUsimAuthCnf->enResult) { /*1.更新新安全上下文:保存AuthReq消息携带的Ksi并计算新的Kasme*/ NAS_EMM_ClearNonCurNativeSecuCntxt(); NAS_EMM_SetSecuNewNativeKSIasme(NAS_EMM_AuthReqKsi()); ulDeriveKeyRslt = NAS_EMM_DeriveKasme(&pstAuthCnf->aucCK[1], &pstAuthCnf->aucIK[1], NAS_EMM_GetSecuNewNativeKasmeAddr()); if( NAS_EMM_SECU_FAIL == ulDeriveKeyRslt) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_PreProcUsimAuthCnf: Caculate Kasme ERR."); } /*安全上下文状态迁移*/ NAS_EMM_SecuStateConvert(NAS_LMM_GetSecuCurFsmCS() ,EMM_NEW_SECU_EXIST); /*2. 启动T3416,保存Rand 和 Res*/ /*启动T3416*/ NAS_LMM_StartPtlTimer(TI_NAS_EMM_PTL_T3416); /* 鉴权成功,清空OpId */ NAS_EMM_GetSecuAuthOpId() = 0; /*保存Rand*/ NAS_EMM_GetSecuAuthOpRand() = NAS_EMM_BIT_SLCT; NAS_LMM_MEM_CPY(NAS_EMM_GetSecuAuthRandAddr(), NAS_EMM_AuthReqRandAddr(), NAS_EMM_SECU_AUTH_RAND_LEN); /*保存Res:pstUsimAuthCnf->u.aucAuthRes第一个字节为Res的长度*/ NAS_EMM_GetSecuAuthResLen() = pstAuthCnf->aucAuthRes[NAS_EMM_USIM_CNF_RES_L_POS]; NAS_LMM_MEM_CPY( NAS_EMM_GetSecuAuthResVAddr(), &(pstAuthCnf->aucAuthRes[NAS_EMM_USIM_CNF_RES_V_POS]), NAS_EMM_GetSecuAuthResLen()); } return; }
VOS_VOID NAS_LMM_ClearTaList(NAS_MM_FORB_TA_LIST_STRU *pstTaList) { NAS_LMM_PUBM_LOG_INFO("NAS_LMM_ClearTaList: is entered !!"); /* 传入指针非空检查 */ if (VOS_NULL_PTR == pstTaList) { NAS_LMM_PUBM_LOG_ERR("NAS_LMM_ClearTaList: ERR--input NULL !!"); return; } NAS_LMM_MEM_SET(pstTaList,0,sizeof(NAS_MM_FORB_TA_LIST_STRU)); return; }
VOS_VOID NAS_EMM_UpdateBearISRFlag(NAS_MML_PS_BEARER_CONTEXT_STRU *pstBearerCtx) { VOS_UINT32 i = NAS_EMM_NULL; NAS_LMM_PUBM_LOG_INFO("NAS_EMM_UpdateBearISRFlag Enter."); if (NAS_EMM_NULL_PTR == pstBearerCtx) { NAS_LMM_PUBM_LOG_ERR("NAS_EMM_UpdateBearISRFlag:Input para is invalid"); return; } for (i = 0; i < EMM_ESM_MAX_EPS_BEARER_NUM; i++) { pstBearerCtx[i].enPsBearerIsrFlg = NAS_MML_PS_BEARER_EXIST_BEFORE_ISR_ACT; } return; }
VOS_VOID NAS_LMM_ClearPlmnList(NAS_MM_PLMN_LIST_STRU *pstPlmnList) { NAS_LMM_PUBM_LOG_INFO("NAS_LMM_ClearPlmnList: is entered !!"); /* 传入指针非空检查 */ if (VOS_NULL_PTR == pstPlmnList) { NAS_LMM_PUBM_LOG_ERR("NAS_LMM_ClearPlmnList: ERR--input NULL !!"); return; } pstPlmnList->ulPlmnNum = 0; NAS_LMM_MEM_SET( pstPlmnList->astPlmnId, 0, NAS_MM_MAX_PLMN_NUM * sizeof(NAS_MM_PLMN_ID_STRU)); return; }
VOS_UINT32 NAS_LMM_PreProcUsimAuthCnf(MsgBlock *pMsg) { VOS_UINT32 ulCurEmmStat; VOS_UINT32 ulRslt; USIMM_AUTH_CNF_STRU *pstUsimAuthCnf; pstUsimAuthCnf = (USIMM_AUTH_CNF_STRU *)pMsg; NAS_LMM_PUBM_LOG_INFO("NAS_LMM_ProcUsimAuthCnf is entered"); /* 如果OpId不同,说明在这个鉴权CNF之前又收到了网侧的鉴权请求 ,继续等待USIM回复*/ if(pstUsimAuthCnf->ucOpId != NAS_EMM_GetSecuAuthOpId()) { return NAS_LMM_MSG_HANDLED; } /* 部分状态下,LMM会对USIM的CNF进行处理,那么在这些状态下LMM不预处理,*/ 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): 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): 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_TAU_INIT, EMM_SS_TAU_WAIT_CN_TAU_CNF): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_DEREG_INIT, EMM_SS_DETACH_WAIT_CN_DETACH_CNF): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_AUTH_INIT, EMM_SS_AUTH_WAIT_CN_AUTH): case NAS_LMM_PUB_COMP_EMMSTATE(EMM_MS_SER_INIT, EMM_SS_SER_WAIT_CN_SER_CNF): ulRslt = NAS_LMM_MSG_DISCARD; break; default: NAS_LMM_PreProcAnyStateUsimAuthCnf(pstUsimAuthCnf); ulRslt = NAS_LMM_MSG_HANDLED; break; } return ulRslt; }
VOS_UINT32 NAS_LMM_PreProcMmcDisableReq( MsgBlock *pMsg ) { MMC_LMM_DISABLE_LTE_NOTIFY_STRU *pstMsg = NAS_LMM_NULL_PTR; NAS_LMM_PUBM_LOG_INFO("NAS_LMM_PreProcMmcDisableReq Enter."); /* 检查如果不是IDLE态,则直接丢弃*/ if (NAS_EMM_NO == NAS_LMM_IsRrcConnectStatusIdle()) { NAS_LMM_PUBM_LOG_ERR("NAS_LMM_PreProcMmcDisableReq:NOT IDLE."); return NAS_LMM_MSG_HANDLED; } pstMsg = (MMC_LMM_DISABLE_LTE_NOTIFY_STRU *)(VOS_VOID *)pMsg; /* 记录LTE接入技术为DISABLE态*/ NAS_EMM_SetLteEnableSta( NAS_LMM_LTE_DISABLED); /* 清空T3412Exp标志*/ NAS_LMM_SetEmmInfoT3412ExpCtrl( NAS_EMM_T3412_EXP_NO); /*NAS_LMM_SetEmmInfoUpdateMmFlag(NAS_EMM_UPDATE_MM_FLAG_INVALID);*/ /*清空DrxNetCapability标志*/ NAS_LMM_SetEmmInfoDrxNetCapChange(NAS_EMM_NO); /*清空RRC删除原因标识*/ NAS_LMM_SetEmmInfoTriggerTauRrcRel(NAS_EMM_TRIGGER_TAU_RRC_REL_NO); /* 清除GU发起过LAU或者联合RAU标识*/ NAS_LMM_SetEmmInfoLauOrComRauFlag(NAS_EMM_LAU_OR_COMBINED_RAU_NOT_HAPPENED); NAS_LMM_SetEmmInfoSrvccFlag(NAS_EMM_SRVCC_NOT_HAPPENED); /*清空 EPS 承载上下文变更标志*/ NAS_EMM_SetEpsContextStatusChange(NAS_EMM_EPS_BEARER_STATUS_NOCHANGE); NAS_LMM_SetEmmInfoTriggerTauSysChange(NAS_EMM_NO); /* 清除异系统变换触发和类型记录信息 */ NAS_EMM_ClearResumeInfo(); NAS_LMM_SetEmmInfoPsState(GMM_LMM_GPRS_NOT_SUSPENSION); if( (MMC_LMM_DISABLE_LTE_REASON_LTE_VOICE_NOT_AVAILABLE == pstMsg->enDisableLteReason) || (MMC_LMM_DISABLE_LTE_REASON_EMERGENCY_CALL == pstMsg->enDisableLteReason) || (MMC_LMM_DISABLE_LTE_REASON_LTE_REJ_CAUSE_14 == pstMsg->enDisableLteReason)) { /* 收到MMC的DISABLE LTE消息时,将CS域和PS服务状态设置成无服务,并上报给MMC */ NAS_LMM_SetNasMmcCSServiceState(MMC_LMM_SERVICE_STATUS_NO_SERVICE); NAS_LMM_SetNasMmcServiceState(MMC_LMM_SERVICE_STATUS_NO_SERVICE); NAS_EMM_SendMmcServiceStatInd(NAS_EMM_YES, NAS_EMM_YES); /* 给MMC上报无服务之后,将CS域和PS域的服务状态设置成BUTT,以便再次ENABLE LTE 时肯定会再上报服务状态 */ NAS_LMM_SetNasMmcCSServiceState(MMC_LMM_SERVICE_STATUS_TYPE_BUTT); NAS_LMM_SetNasMmcServiceState(MMC_LMM_SERVICE_STATUS_TYPE_BUTT); } NAS_EMM_ClrAllUlDataReqBufferMsg(); /*参考协议24301,5.5.3.3.4.2, 5.5.3.3.4.3, 5.5.1.3.4.2,当前设置位语音中心&IMS不可用, 如果 TAU 5次都是eps only成功,此时会disable LTE,此时 需要停止定时器3402,否则回到L的时候不会立即发起TAU */ /*NAS_LMM_StopPtlTimer(TI_NAS_EMM_PTL_T3402);*/ /* 美国AT&T定制需求: disable LTE清除CService计数 */ NAS_EMM_GetEmmInfoDamParaCserviceCnt() = 0; /* 通知LRRC当前LTE被disable */ NAS_LMM_SendRrcDisableLteNotify(); return NAS_LMM_MSG_HANDLED; }