VOS_VOID NAS_RABM_ReadVoicePreferNvim(VOS_VOID) { NAS_RABM_NVIM_WCDMA_VOICE_PREFER_STRU stVoicePreferCfg; VOS_UINT32 ulLength; ulLength = 0; PS_MEM_SET(&stVoicePreferCfg, 0x00, sizeof(NAS_RABM_NVIM_WCDMA_VOICE_PREFER_STRU)); /* 读NV失败,认为不允许VoicePrefer */ NV_GetLength(en_NV_Item_Wcdma_Voice_Prefer_Cfg, &ulLength); if (ulLength > sizeof(NAS_RABM_NVIM_WCDMA_VOICE_PREFER_STRU)) { NAS_WARNING_LOG(WUEPS_PID_RABM, "NAS_RABM_ReadVoicePreferNvim:WARNING:NV_GetLength ulLength fail!"); g_stNasRabmVoicePreferCtx.ucVoicePreferNvimEnableFlag = VOS_FALSE; return; } if (NV_OK != NV_Read(en_NV_Item_Wcdma_Voice_Prefer_Cfg, &stVoicePreferCfg, ulLength)) { NAS_WARNING_LOG(WUEPS_PID_RABM, "NAS_RABM_ReadVoicePreferNvim:WARNING:NV_Read faild!"); g_stNasRabmVoicePreferCtx.ucVoicePreferNvimEnableFlag = VOS_FALSE; return; } g_stNasRabmVoicePreferCtx.ucVoicePreferNvimEnableFlag = stVoicePreferCfg.ucEnableFlag; g_stNasRabmVoicePreferCtx.ulNvTestMcc = stVoicePreferCfg.ulMcc; g_stNasRabmVoicePreferCtx.ulNvTestMnc = stVoicePreferCfg.ulMnc; return; }
VOS_VOID NAS_MM_EmergencyCallCsfbWaitHoSysInfoTimeOut(VOS_VOID) { /* 处于紧急呼CSFB流程发起紧急呼叫 */ if ( NAS_MML_CSFB_SERVICE_STATUS_MO_EMERGENCY_EXIST == NAS_MML_GetCsfbServiceStatus()) { /* 当前存在缓存的CC业务,发起CC业务 */ if ( MM_TRUE == g_MmGlobalInfo.ConnCtrlInfo[MM_CONN_CTRL_CC].RcvXXEstReq.ucFlg ) { /* 记录delay lau标识,呼叫结束后收到系统消息需要做lau */ NAS_MML_SetDelayedCsfbLauFlg(VOS_TRUE); g_MmGlobalInfo.ucStaOfRcvXXEstReq = g_MmGlobalInfo.ucState; /* 记录收到建立请求时的状态 */ NAS_MM_EstMmConnection(MM_CONN_CTRL_CC); } else { /* 无缓存的CC业务,进行异常处理 */ NAS_WARNING_LOG(WUEPS_PID_MM, "NAS_MM_EmergencyCallCsfbWaitHoSysInfoTimeOut:EmergencyCall BUFFER NOT EXIST "); NAS_MML_SetCsfbServiceStatus(NAS_MML_CSFB_SERVICE_STATUS_BUTT); } } else { /* 无缓存的CC业务,进行异常处理 */ NAS_WARNING_LOG(WUEPS_PID_MM, "NAS_MM_EmergencyCallCsfbWaitHoSysInfoTimeOut:EmergencyCall BUFFER NOT EXIST "); } return; }
NAS_MML_NET_RAT_TYPE_ENUM_UINT8 NAS_MMC_GetSuspendDestinationRatType( NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg ) { #if (FEATURE_ON == FEATURE_LTE) LMM_MMC_SUSPEND_IND_STRU *pstLSuspendMsg = VOS_NULL_PTR; #endif RRMM_SUSPEND_IND_ST stGuSuspendMsg; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enRat; enRat = NAS_MML_NET_RAT_TYPE_BUTT; /* 根据消息类型,转换入口消息 */ switch (pstEntryMsg->ulEventType) { case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND): case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND): stGuSuspendMsg = *(RRMM_SUSPEND_IND_ST*)(pstEntryMsg->aucEntryMsgBuffer); break; #if (FEATURE_ON == FEATURE_LTE) case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND): pstLSuspendMsg = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer); /* 转换L的挂起消息为GU的 */ NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg); break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Invalid Event Type!"); return enRat; } /* 根据挂起目的方,获取挂起前的网络类型 */ switch(stGuSuspendMsg.ucSuspendDestination) { case MMC_SUSPEND_DESTINATION_GSM: enRat = NAS_MML_NET_RAT_TYPE_GSM; break; case MMC_SUSPEND_DESTINATION_WCDMA: enRat = NAS_MML_NET_RAT_TYPE_WCDMA; break; #if (FEATURE_ON == FEATURE_LTE) case MMC_SUSPEND_DESTINATION_LTE: enRat = NAS_MML_NET_RAT_TYPE_LTE; break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Unexpected Rat Type!"); return enRat; } return enRat; }
VOS_VOID NAS_MML_InsertInternalMsgHead( VOS_VOID *pSndMsg ) { VOS_UINT8 ucMsgPnt; NAS_MML_INTERNAL_MSG_BUF_STRU *pstMmlMsg = VOS_NULL_PTR; NAS_MML_INTERNAL_MSG_QUEUE_STRU *pstInternalMsgQueue = VOS_NULL_PTR; NAS_MML_INTERNAL_MSG_BUF_STRU *pstSndMsg = VOS_NULL_PTR; pstInternalMsgQueue = &(NAS_MML_GetMmlCtx()->stInternalMsgQueue); pstSndMsg = (NAS_MML_INTERNAL_MSG_BUF_STRU*)pSndMsg; /* 1. 判断内部消息缓冲区是否已满 */ ucMsgPnt = pstInternalMsgQueue->ucTail; if ( ((ucMsgPnt + 1) % NAS_MML_MAX_MSG_QUEUE_SIZE) == pstInternalMsgQueue->ucHeader ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MML_InsertInternalMsgHead:Warning: The Queue is full."); NAS_MMC_SndOmInternalMsgQueueInfo(VOS_TRUE, VOS_FALSE); NAS_MMC_SndOmInternalMsgQueueDetailInfo(pstInternalMsgQueue); return; } /* 2. 判断消息长度是否非法 */ if ( pstSndMsg->ulLength > NAS_MML_MAX_INTERNAL_MSG_LEN) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MML_InsertInternalMsgHead:Warning: ulBufLen is too long."); NAS_MMC_SndOmInternalMsgQueueInfo(VOS_FALSE, VOS_TRUE); return; } if ( (pstInternalMsgQueue->ucHeader % NAS_MML_MAX_MSG_QUEUE_SIZE) >= 1 ) { pstInternalMsgQueue->ucHeader--; pstInternalMsgQueue->ucHeader %= NAS_MML_MAX_MSG_QUEUE_SIZE; } else { pstInternalMsgQueue->ucHeader = NAS_MML_MAX_MSG_QUEUE_SIZE- 1; } /* 3. 取得一个消息缓冲单元 */ pstMmlMsg = (NAS_MML_INTERNAL_MSG_BUF_STRU *)&(pstInternalMsgQueue->astNasMmMsgQueue[pstInternalMsgQueue->ucHeader]); NAS_NORMAL_LOG1(WUEPS_PID_MMC, "NAS_MML_InsertInternalMsgHead: usMsgID is ", pstMmlMsg->usMsgID); /* 4. 将内部消息发送到内部消息队列的最前面 */ PS_MEM_CPY(pstMmlMsg, pstSndMsg, sizeof(NAS_MML_INTERNAL_MSG_BUF_STRU)); /* 更新内部消息缓冲区 */ return; }
VOS_VOID TAF_MMA_ReadRoamingBrokerInfoNvim(VOS_VOID) { NAS_MMA_NVIM_ROAMING_BROKER_STRU stRoamingBroker; VOS_UINT32 ulLength; ulLength = 0; PS_MEM_SET(&stRoamingBroker, 0, sizeof(NAS_MMA_NVIM_ROAMING_BROKER_STRU)); NV_GetLength(en_NV_Item_Roaming_Broker, &ulLength); if (NV_OK != NV_Read(en_NV_Item_Roaming_Broker, &stRoamingBroker, ulLength)) { NAS_WARNING_LOG(WUEPS_PID_MMA, "TAF_MMA_ReadRoamingBrokerInfoNvim: Read NV Fail "); gstMmaValue.ucRoamBrokerSwitch = VOS_FALSE; } else { gstMmaValue.ucRoamBrokerSwitch = (stRoamingBroker.aucRoamingBroker)[0]; /* 如果NV中的值无效,则设置RoamBroker功能关闭 */ if ( (VOS_FALSE != (stRoamingBroker.aucRoamingBroker)[0]) && (VOS_TRUE != (stRoamingBroker.aucRoamingBroker)[0]) ) { gstMmaValue.ucRoamBrokerSwitch = VOS_FALSE; } } return; }
VOS_UINT32 NAS_UTRANCTRL_RcvTdSysCfgCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_SYS_CFG_CNF_STRU *pstSysCfgCnf; pstSysCfgCnf = (RRMM_SYS_CFG_CNF_STRU *)pstMsg; /* 如果当前UTRANCTRL模的等开机回复时状态定时器不运行认为异常 */ if ( NAS_MMC_TIMER_STATUS_RUNING != NAS_UTRANCTRL_GetTimerStatus(TI_NAS_UTRANCTRL_WAIT_TD_SYSCFG_CNF)) { /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTdSysCfgCnf_Main: Unexpected Plmnsrch msg!"); /* 丢弃该异常消息 */ return VOS_TRUE; } /* 停止MMC通过UTRANCTRL模块给UTRAN模发送SYSCFG设置消息时候起的定时器 */ NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_TD_SYSCFG_CNF); if ( RRMM_SYS_CFG_RESULT_FAILURE == pstSysCfgCnf->ulResult) { /* 若syscfg设置失败,则直接进MMC状态机进行处理 */ return VOS_FALSE; } /* 切换到适配模块的SYSCFG状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_SYSCFG); /* Td的SYSCFG回复消息在适配模块的SYSCFG状态机进行处理 */ return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTdStartCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_START_CNF_STRU *pstRrStartCnfMsg; pstRrStartCnfMsg = (RRMM_START_CNF_STRU *)pstMsg; /* 如果当前UTRANCTRL模的等开机回复时状态定时器不运行认为异常 */ if ( NAS_MMC_TIMER_STATUS_RUNING != NAS_UTRANCTRL_GetTimerStatus(TI_NAS_UTRANCTRL_WAIT_TD_START_CNF)) { /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTdStartCnf_Main: Unexpected Plmnsrch msg!"); /* 丢弃该异常消息 */ return VOS_TRUE; } /* 停止MMC通过UTRANCTRL模块给UTRAN模发送开机消息时候起的定时器 */ NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_TD_START_CNF); if (MMC_START_FAILURE == pstRrStartCnfMsg->ulResult) { /* 若UTRAN模块开机失败,则直接进MMC状态机进行处理 */ return VOS_FALSE; } /* 切换到适配模块的开机状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_SWITCH_ON); /* TD的开机回复消息在适配模块的开机状态机进行处理 */ return VOS_TRUE; }
VOS_VOID NAS_MMC_BulidResumeMsg( NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enRat, RRMM_RESUME_IND_ST *pstMsg ) { switch(enRat) { case NAS_MML_NET_RAT_TYPE_GSM: pstMsg->ucResumeOrigen = MMC_RESUME_ORIGEN_GSM; break; case NAS_MML_NET_RAT_TYPE_WCDMA: pstMsg->ucResumeOrigen = MMC_RESUME_ORIGEN_WCDMA; break; #if (FEATURE_ON == FEATURE_LTE) case NAS_MML_NET_RAT_TYPE_LTE: pstMsg->ucResumeOrigen = MMC_RESUME_ORIGEN_LTE; break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_BulidResumeMsg:Unexpected Rat Type!"); return; } pstMsg->ucCsResumeResult = MMC_RESUME_RESULT_SUCCESS; pstMsg->ucPsResumeResult = MMC_RESUME_RESULT_SUCCESS; return; }
VOS_UINT32 NAS_UTRANCTRL_RcvLmmUtranModeCnf_ModeChange_WaitSlaveModeCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_MASTER_MODE_ENUM_UINT8 enMasterMode; enMasterMode = NAS_UTRANCTRL_GetMasterMode_ModeChange(); /* 如果L为主模,不处理,直接返回 */ if (NAS_UTRANCTRL_MASTER_MODE_LTE == enMasterMode) { /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvLmmUtranModeCnf_ModeChange_WaitSlaveModeCnf: ENTERED"); return VOS_TRUE; } /* 收到TDRRC的UTRAN MODE CNF消息,清除等待标志 */ NAS_UTRANCTRL_ClearWaitSlaveUtranModeCnfFlg_ModeChange(NAS_UTRANCTRL_WAIT_LMM_UTRAN_MODE_CNF); /* 收到从模的回复后,调用处理从模回复的函数 */ NAS_UTRANCTRL_ProcSlaveModeCnf_ModeChange(enMasterMode); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvTiWaitAsResumeIndExpired_InterSysHo_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enCurRat; enCurRat = NAS_MML_GetCurrNetRatType(); /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitAsResumeIndExpired_InterSysHo_WaitAsResumeInd:ENTERED"); /* 调用om接口,上电复位: */ if ( (NAS_UTRANCTRL_UTRAN_MODE_FDD == NAS_UTRANCTRL_GetCurrUtranMode()) && (NAS_MML_NET_RAT_TYPE_WCDMA == enCurRat) ) { NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_WAS_WAIT_RESUME_IND_EXPIRED); } else if ( NAS_MML_NET_RAT_TYPE_GSM == enCurRat ) { NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_GAS_WAIT_RESUME_IND_EXPIRED); } else if ( NAS_MML_NET_RAT_TYPE_LTE == enCurRat ) { NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_LMM_WAIT_RESUME_IND_EXPIRED); } else { NAS_MML_SoftReBoot(NAS_MML_REBOOT_SCENE_MMC_IN_TD_WAIT_RESUME_IND_EXPIRED); } return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitTdPowerOffCnfExpired_PowerOff_WaitTdPowerOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_POWER_OFF_CNF_STRU stNasPowerOffCnf; VOS_UINT32 ulPowerOffEventType; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitTdPowerOffCnfExpired_PowerOff_WaitTdPowerOffCnf: ENTERED"); /* 构造关机回复消息 */ NAS_UTRANCTRL_BuildRrMmPowerOffCnfMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, &stNasPowerOffCnf); ulPowerOffEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)&stNasPowerOffCnf ); /* 将更改过的超时消息放到输出队列中 */ NAS_UTRANCTRL_SaveBufferUtranSndMmcMsg(ulPowerOffEventType, (struct MsgCB *)&stNasPowerOffCnf); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 回到main状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitTdPlmnStopCnfExpired_PlmnSelection_WaitTdPlmnStopCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_ENTRY_MSG_STRU *pstBufferEntryMsg = VOS_NULL_PTR; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; NAS_UTRANCTRL_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; /* 取当前缓存的系统消息 */ pstEntryMsg = NAS_UTRANCTRL_GetCurrEntryMsgAddr(); /* 取得当前缓存消息的头 */ pstMsgHeader = (MSG_HEADER_STRU *)pstEntryMsg->aucEntryMsgBuffer; /* 获得当前缓存的缓冲区地址 */ pstBufferEntryMsg = NAS_UTRANCTRL_GetBufferUtranSndMmcMsgAddr(); /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitTdPlmnStopCnfExpired_PlmnSelection_WaitTdPlmnStopCnf: ENTERED"); /* 中国网络标记存在则退出当前状态机 */ if ( (VOS_TRUE == NAS_UTRANCTRL_GetSearchedSpecTdMccFlg()) || ( (WUEPS_PID_MMC == pstMsgHeader->ulSenderPid) && (MMCMMC_INTER_SKIP_SEARCH_W_IND == pstMsgHeader->ulMsgName) ) ) { /* 构造指定搜网回复失败消息到内存的缓存区域 */ NAS_UTRANCTRL_BuildRrMmPlmnSearchCnfFailMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, (RRMM_PLMN_SEARCH_CNF_STRU *)pstBufferEntryMsg->aucEntryMsgBuffer); /* 保存构造指定搜网回复失败消息事件类型 */ pstBufferEntryMsg->ulEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)pstBufferEntryMsg->aucEntryMsgBuffer ); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 消息处理完成继续进入MMC状态机处理 */ return VOS_FALSE; } /* 此时需要回到W下,向TDRRC发送挂起请求 */ NAS_UTRANCTRL_SndGuAsSuspendReq(TPS_PID_RRC); /* 迁移状态到等到TDRRC挂起回复 */ NAS_UTRANCTRL_FSM_SetCurrState(NAS_UTRANCTRL_PLMN_SELECTION_STA_WAIT_TD_SUSPEND_CNF_BACK_W); /* 启动保护定时器 */ NAS_UTRANCTRL_StartTimer(TI_NAS_UTRANCTRL_WAIT_TD_SUSPEND_CNF, TI_NAS_UTRANCTRL_WAIT_TD_SUSPEND_CNF_LEN); /* 消息处理完成不需继续处理 */ return VOS_TRUE; }
VOS_UINT32 NAS_MMC_SndOmSmsIndMsg(VOS_VOID) { NAS_OM_SMS_IND_STRU stNasOmSmsInd; DIAG_TRANS_IND_STRU stDiagTransInd; VOS_UINT32 ulRet; /* 初始化 */ PS_MEM_SET(&stNasOmSmsInd, 0x00, sizeof(NAS_OM_SMS_IND_STRU)); /* 填充消息内容 */ NAS_SMS_BuildSmsOmInfo(&stNasOmSmsInd); stNasOmSmsInd.enPrimId = ID_NAS_OM_SMS_CONFIRM; stNasOmSmsInd.usToolsId = 0; stDiagTransInd.ulModule = DIAG_GEN_MODULE(VOS_GetModemIDFromPid(WUEPS_PID_SMS), DIAG_MODE_UMTS);; stDiagTransInd.ulPid = WUEPS_PID_SMS; stDiagTransInd.ulMsgId = ((VOS_UINT32)(VOS_GetModemIDFromPid(WUEPS_PID_SMS)) << 16) + ID_NAS_OM_SMS_CONFIRM; stDiagTransInd.ulLength = sizeof(NAS_OM_SMS_IND_STRU); stDiagTransInd.pData = &stNasOmSmsInd; /* 发送消息 */ ulRet = DIAG_TransReport(&stDiagTransInd); if (VOS_OK != ulRet) { NAS_WARNING_LOG(WUEPS_PID_SMS, "NAS_MMC_SndOmSmsIndMsg:WARNING: Send msg fail."); } return ulRet; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitWasStartCnfExpired_SwitchOn_WaitWasStartCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_START_CNF_STRU *pstRrMmStartCnfMsg; NAS_UTRANCTRL_ENTRY_MSG_STRU *pstEntryMsg; pstEntryMsg = NAS_UTRANCTRL_GetCurrEntryMsgAddr(); pstRrMmStartCnfMsg = (RRMM_START_CNF_STRU *)pstEntryMsg->aucEntryMsgBuffer; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitWasStartCnfExpired_SwitchOn_WaitWasStartCnf: ENTERED"); /* 认为当前开机失败 */ pstRrMmStartCnfMsg->ulResult = MMC_START_FAILURE; /* 将当前开机失败消息放到输出队列中 */ NAS_UTRANCTRL_SaveBufferUtranSndMmcMsg(pstEntryMsg->ulEventType, (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer); /* 设置需要替换入口消息标记,这样MMC模块就会处理开机回复失败消息 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* UTRANCTRL状态机回到MAIN状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 消息未被处理完成需MMC继续处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitMasterModeCnfExpired_ModeChange_WaitMasterModeCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_ENTRY_MSG_STRU *pstEntryMsg; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitMasterModeCnfExpired_ModeChange_WaitMasterModeCnf: ENTERED"); /* 清除所有等待模式变更回复的标志 */ NAS_UTRANCTRL_ClearAllWaitAsUtranModeCnfFlg_ModeChange(); /* 取当前缓存的系统消息 */ pstEntryMsg = NAS_UTRANCTRL_GetCurrEntryMsgAddr(); NAS_UTRANCTRL_SaveBufferUtranSndMmcMsg( pstEntryMsg->ulEventType, (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer); /* 设置缓存消息有效标志 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 退出MODE CHANGE状态机,切换到MAIN状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); return VOS_FALSE; }
VOS_VOID NAS_UTRANCTRL_SaveCurEntryMsg( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; VOS_UINT32 ulLen; /* 获得当前UTRANCTRL模块状态机入口消息的缓冲区地址 */ pstEntryMsg = NAS_UTRANCTRL_GetCurrEntryMsgAddr(); pstMsgHeader = (MSG_HEADER_STRU*)pstMsg; /* 如果是空消息 */ if ( VOS_NULL_PTR == pstMsg ) { pstEntryMsg->ulEventType = ulEventType; NAS_WARNING_LOG( WUEPS_PID_MMC, "NAS_MMC_SaveCurEntryMsg Entry Message Pointer is NULL!" ); return; } ulLen = pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH; /* 将当前处理的入口消息拷贝到Context对应的缓冲区 */ PS_MEM_CPY( pstEntryMsg->aucEntryMsgBuffer, pstMsg, ulLen ); /* 填写Context中的参数 */ pstEntryMsg->ulEventType = ulEventType; return; }
VOS_UINT32 NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp:ENTERED"); /* 向接入层发送挂起失败 */ NAS_MMC_SndSuspendRsp(NAS_MML_GetCurrNetRatType(), RRC_NAS_SUSPEND_FAILURE); /* 根据挂起的发起方,构造一条恢复消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg); /* 向MM/GMM进行恢复 */ NAS_MMC_SndGmmResumeInd(&stResumeIndMsg); NAS_MMC_SndMmResumeInd(&stResumeIndMsg); NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_FAIL, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出状态机*/ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); /* 向当前AS发送 RRMM_SUSPEND_REL_REQ */ if ( NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType()) { NAS_MMC_SndAsSuspendRelReq(WUEPS_PID_WRR); } else { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd:could not support current rat!"); return VOS_FALSE; } /* 迁移状态到等待SUSPEND_REL_CNF */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_WAS_SUSPEND_REL_CNF); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF, TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiTdSysCfgCnfExpired_SysCfg_WaitTdSysCfgCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_SYS_CFG_CNF_STRU *pstSysCfgCnfMsg; NAS_UTRANCTRL_ENTRY_MSG_STRU *pstEntryMsg; pstEntryMsg = NAS_UTRANCTRL_GetCurrEntryMsgAddr(); pstSysCfgCnfMsg = (RRMM_SYS_CFG_CNF_STRU *)pstEntryMsg->aucEntryMsgBuffer; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTdSysCfgCnfExpired_SysCfg_WaitTdSysCfgCnf: ENTERED"); /* 认为当前SYSCFG设置失败 */ pstSysCfgCnfMsg->ulResult = RRMM_SYS_CFG_RESULT_FAILURE; /* 将SYSCFG设置失败消息放到输出队列中 */ NAS_UTRANCTRL_SaveBufferUtranSndMmcMsg(pstEntryMsg->ulEventType, (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer); /* 设置需要替换入口消息标记,这样MMC模块就会处理SYSCFG设置失败消息 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 回到main状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitWasPlmnSearchCnfExpired_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_ENTRY_MSG_STRU *pstBufferEntryMsg = VOS_NULL_PTR; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enUtranMode; enUtranMode = NAS_UTRANCTRL_GetCurrUtranMode(); /* 获得当前缓存的缓冲区地址 */ pstBufferEntryMsg = NAS_UTRANCTRL_GetBufferUtranSndMmcMsgAddr(); /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitWasPlmnSearchCnfExpired_Main: ENTERED"); /* CSFB标志存在时,并且当前是FDD模式,不再搜TD */ if ((VOS_TRUE == NAS_MML_IsCsfbServiceStatusExist()) && (NAS_UTRANCTRL_UTRAN_MODE_FDD == enUtranMode)) { /* 构造指定搜网回复失败消息到内存的缓存区域 */ NAS_UTRANCTRL_BuildRrMmPlmnSearchCnfFailMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, (RRMM_PLMN_SEARCH_CNF_STRU *)pstBufferEntryMsg->aucEntryMsgBuffer); /* 保存构造指定搜网回复失败消息事件类型 */ pstBufferEntryMsg->ulEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)pstBufferEntryMsg->aucEntryMsgBuffer ); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; } /* 如果当前为UTRAN MODE AUTO SWITCH模式,则需要启动UTRANCTRL模块的搜网状态机 */ if ( NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode() ) { /* 切换到适配模块的选网状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_PLMN_SELECTION); /* 进入适配层选网状态机处理 */ return VOS_TRUE; } /* 构造指定搜网回复失败消息到内存的缓存区域 */ NAS_UTRANCTRL_BuildRrMmPlmnSearchCnfFailMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, (RRMM_PLMN_SEARCH_CNF_STRU *)pstBufferEntryMsg->aucEntryMsgBuffer); /* 保存构造指定搜网回复失败消息事件类型 */ pstBufferEntryMsg->ulEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)pstBufferEntryMsg->aucEntryMsgBuffer ); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
LOCAL VOS_VOID NAS_CC_SendMmccPrim( VOS_VOID *pMsg ) { if (VOS_OK != PS_SEND_MSG(WUEPS_PID_CC, pMsg)) { NAS_WARNING_LOG(WUEPS_PID_CC, "NAS_CC_SendMmccPrim():WARNING:SEND MSG FIAL"); } }
VOS_VOID NAS_RABM_RcvSysModeChgInd( GMM_RABM_NET_RAT_ENUM_UINT32 enNewSysMode ) { NAS_RABM_PROC_FUNC_TBL_STRU *pstProcFuncTbl; GMM_RABM_NET_RAT_ENUM_UINT32 enOldSysMode; /* 判断当前的系统模式是否有效 */ enOldSysMode = NAS_RABM_GetCurrentSysMode(); /* 检测系统模式有效性, 若无效, 不更新系统模式 */ if (NAS_MML_NET_RAT_TYPE_BUTT == enNewSysMode) { NAS_ERROR_LOG(WUEPS_PID_RABM, "NAS_RABM_RcvSysModeChgInd: Invalid System Mode."); return; } /* 更新系统模式 */ NAS_RABM_SetSysMode(enNewSysMode); /* 根据当前系统模式获取对应的处理函数表的指针 */ pstProcFuncTbl = NAS_RABM_GetProFuncTblAddr(enOldSysMode); /* 确认函数处理表已经注册 */ if (VOS_NULL_PTR != pstProcFuncTbl) { if (VOS_NULL_PTR != pstProcFuncTbl->pSysModeChgIndProcFunc) { /* 调用对应模式的处理函数 */ pstProcFuncTbl->pSysModeChgIndProcFunc(enOldSysMode, enNewSysMode); } else { NAS_WARNING_LOG(WUEPS_PID_RABM, "NAS_RABM_RcvSysModeChgInd: pDataResumeIndProcFunc is not registered."); } } else { NAS_WARNING_LOG(WUEPS_PID_RABM, "NAS_RABM_RcvSysModeChgInd: Message is received in wrong system mode."); } }
VOS_VOID NAS_RABM_MsgProc( struct MsgCB *pMsg ) { MSG_HEADER_STRU *pstMsg; struct MsgCB *pstDestMsg; pstDestMsg = VOS_NULL_PTR; /* 入口消息非空检查 */ if (VOS_NULL_PTR == pMsg) { NAS_WARNING_LOG(WUEPS_PID_RABM, "NAS_RABM_MsgProc: Message is NULL."); return; } /* 支持TD-SCDMA特性时,需对消息进行适配处理,将TD模的发送PID适配为W模的PID */ if ( VOS_TRUE == NAS_UTRANCTRL_MsgProc(pMsg, &pstDestMsg) ) { /* 消息在UTRANCTRL模块处理完成,直接返回,不进入后续处理 */ return; } /* 替换消息指针 */ pstMsg = (MSG_HEADER_STRU*)pstDestMsg; /* 处理消息 */ switch (pstMsg->ulSenderPid) { case WUEPS_PID_SM: NAS_RABM_RcvSmMsg(pstDestMsg); break; case WUEPS_PID_GMM: NAS_RABM_RcvGmmMsg(pstDestMsg); break; case WUEPS_PID_AT: NAS_RABM_RcvAtMsg(pstDestMsg); break; case UEPS_PID_CDS: NAS_RABM_RcvCdsMsg(pstDestMsg); break; #if (FEATURE_ON == FEATURE_BASTET) case UEPS_PID_BASTET: NAS_RABM_RcvBastetMsg(pstDestMsg); break; #endif default: NAS_RABM_RcvCommMsg(pstDestMsg); break; } }
VOS_UINT32 NAS_UTRANCTRL_RcvTdPlmnSearchCnf_PlmnSelection_WaitWasPlmnStopCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTdPlmnSearchCnf_PlmnSelection_WaitWasPlmnStopCnf: illegal MESSAGE! "); /* 丢弃该非法消息 */ return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvWasPowerOffCnf_PowerOff_WaitTdPowerOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvWasPowerOffCnf_PowerOff_WaitTdPowerOffCnf: illegal MESSAGE! "); /* 丢弃该非法消息 */ return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTdStartCnf_SwitchOn_WaitWasStartCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTdStartCnf_SwitchOn_WaitWasStartCnf: illegal MESSAGE! "); /* 丢弃该非法消息 */ return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_ProcessMsgInFsm( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_ACTION_FUNC pActFun; NAS_UTRANCTRL_FSM_CTX_STRU *pstCurFsm; VOS_UINT32 ulRslt; NAS_UTRANCTRL_FSM_ID_ENUM_UINT32 enCurrFsmId; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 取得当前的状态机名称 */ enCurrFsmId = NAS_UTRANCTRL_GetCurrFsmId(); /* 获取当前UTRANCTRL的状态机地址 */ pstCurFsm = NAS_UTRANCTRL_GetCurFsmAddr(); /* 查找状态转移表中的相应的动作处理函数 */ pActFun = NAS_FSM_FindAct(pstCurFsm->pstFsmDesc, pstCurFsm->ulState, ulEventType); if (VOS_NULL_PTR != pActFun) { /* 在状态表中对消息进行处理 */ ulRslt = (*pActFun) (ulEventType, (struct MsgCB *)pstMsg); return ulRslt; } /* 通知接入层模式通知或SYSCFG设置的时候,缓存所有找不到的消息 */ if ((NAS_UTRANCTRL_FSM_MODE_CHANGE == enCurrFsmId) || (NAS_UTRANCTRL_FSM_SYSCFG == enCurrFsmId)) { /* 消息长度超过了缓存的长度,则不保存, 防止数组越界 */ if ( (pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH) > NAS_UTRANCTRL_MAX_MSG_BUFFER_LEN ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_ProcessMsgInFsm:Msg too big to save "); /* 状态表中未找到要处理的消息,则需继续处理 */ return VOS_FALSE; } NAS_UTRANCTRL_SaveCacheMsgInMsgQueue(ulEventType, pstMsg); /* 缓存消息,当前MMC状态机不处理,后续处理适配层缓存 */ return VOS_TRUE; } /* 状态表中未找到要处理的消息,则需继续处理 */ return VOS_FALSE; }
VOS_VOID NAS_UTRANCTRL_ClearAllWaitAsUtranModeCnfFlg_ModeChange(VOS_VOID) { /* 如果当前状态机不是MODE CHANGE状态机 */ if (NAS_UTRANCTRL_FSM_MODE_CHANGE != NAS_MMC_GetCurrFsmId()) { /* 异常事件 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_ClearAllWaitUtranModeCnfFlg_ModeChange:ENTERED"); } (NAS_UTRANCTRL_GetUtranCtrlCtx()->stCurFsm.unFsmCtx.stModeChangeCtx.ucWaitSlaveModeUtranModeCnfFlg) = NAS_UTRANCTRL_WAIT_UTRAN_MODE_CNF_NULL; return; }
VOS_VOID Api_AppRabmDataReq( ST_APP_RABM_DATA *pRabmDataReq ) { VOS_UINT32 ulDataLen; TAFRABM_CS_DATA_REQ_STRU *pSndCsMsg = VOS_NULL_PTR; /* 定义发送到CS域的指针 */ VOS_UINT32 ulRet; if (D_RABM_CS_DOMAIN != pRabmDataReq->ucDomain) { PS_NAS_LOG( WUEPS_PID_RABM, VOS_NULL, PS_LOG_LEVEL_ERROR, "Api_AppRabmDataReq(CS):ucDomain is not D_RABM_CS_DOMAIN!" ); return; } ulDataLen = (pRabmDataReq->ulDataLen + 7) / 8; /* 将APP传来的bit长度改为字节长度 */ pSndCsMsg = (TAFRABM_CS_DATA_REQ_STRU *) PS_ALLOC_MSG( WUEPS_PID_TAF, (sizeof(TAFRABM_CS_DATA_REQ_STRU) + ulDataLen) - 4); if (VOS_NULL_PTR ==pSndCsMsg) { PS_NAS_LOG( WUEPS_PID_RABM, VOS_NULL, PS_LOG_LEVEL_ERROR, "Api_AppRabmDataReq(CS):Alloc msg fail!" ); return; } pSndCsMsg->MsgHeader.ulSenderCpuId = VOS_LOCAL_CPUID; pSndCsMsg->MsgHeader.ulSenderPid = WUEPS_PID_TAF; pSndCsMsg->MsgHeader.ulReceiverCpuId = VOS_LOCAL_CPUID; pSndCsMsg->MsgHeader.ulReceiverPid = WUEPS_PID_RABM; pSndCsMsg->MsgHeader.ulMsgName = TAFRABM_CS_DATA_REQ; pSndCsMsg->ulSi = pRabmDataReq->ucRabId; /* 保存SI */ pSndCsMsg->ulDataLen = pRabmDataReq->ulDataLen; /* 保存数据长度 */ PS_NAS_MEM_CPY(pSndCsMsg->aucData, pRabmDataReq->pucData, ulDataLen); /* 获得数据 */ PS_NAS_LOG( WUEPS_PID_RABM, VOS_NULL, PS_LOG_LEVEL_NORMAL, "\n Api_AppRabmDataReq: ucDomain = D_RABM_CS_DOMAIN\r" ); PS_NAS_LOG1( WUEPS_PID_RABM, VOS_NULL, PS_LOG_LEVEL_NORMAL, "\n Api_AppRabmDataReq: ucRabId = \r", pRabmDataReq->ucRabId ); PS_NAS_LOG1( WUEPS_PID_RABM, VOS_NULL, PS_LOG_LEVEL_NORMAL, "\n Api_AppRabmDataReq: ulDataLen = \r", (VOS_INT32)pRabmDataReq->ulDataLen ); ulRet = PS_SEND_MSG(WUEPS_PID_TAF, pSndCsMsg); if ( VOS_OK != ulRet ) { NAS_WARNING_LOG(WUEPS_PID_TAF, "Api_AppRabmDataReq():WARNING:SEND LMM START REQ FIAL"); } }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitTdPowerOffCnfExpired_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitTdPowerOffCnfExpired_Main: ENTERED"); /* 切换到适配模块的关机状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_POWER_OFF); /* Td的关机回复消息在适配模块的关机状态机进行处理 */ return VOS_TRUE; }