VOS_VOID MTC_ProcCurrCampPlmnInfoForSvlte(VOS_VOID) { MTC_MODEM_POWER_STATE_ENUM_UINT8 enModem1PowerState; MTC_MODEM_NETWORK_INFO_STRU *pstModem0NetworkInfo = VOS_NULL_PTR; MTC_PS_TRANSFER_ENUM_UINT8 enPsTransferSolution; MTC_RATMODE_ENUM_UINT8 enModem0RateMode; VOS_UINT8 ucUsimValidFlag; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); enModem1PowerState = MTC_GetModemPowerState(MODEM_ID_1); pstModem0NetworkInfo = MTC_GetModemNetworkInfoAddr(MODEM_ID_0); enPsTransferSolution = MTC_GetPsTransferCfg(); enModem0RateMode = MTC_GetModemRatMode(MODEM_ID_0); /* Modem1关机,国外模式无需PS域迁移 */ if (MTC_MODEM_POWER_OFF == enModem1PowerState) { return; } ucUsimValidFlag = MTC_GetModemUsimValidFlag(MODEM_ID_0); /* 1、modem1处于开机状态 2、当前驻留网络接入技术为T/L(OscarTL通过主卡的G重选回T/L) 3、当前驻留网络非禁止plmn 4、单待模式modem0的ps是detach状态,上报PS域迁移指示 */ if ( ( (MTC_RATMODE_LTE == enModem0RateMode) || (MTC_RATMODE_TDS == enModem0RateMode) ) && (VOS_FALSE == pstModem0NetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_TRUE == ucUsimValidFlag) && (VOS_FALSE == pstModem0NetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg) && (VOS_TRUE == pstModem0NetworkInfo->stPsDomainInfo.ucPsSupportFlg) ) { /* PS域迁移策略脱网重选,上报网络恢复指示AT命令 */ if (MTC_PS_TRANSFER_LOST_AREA == enPsTransferSolution) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* PS域迁移策略离网重选,上报网络恢复指示AT命令 */ if ((MTC_PS_TRANSFER_OFF_AREA == enPsTransferSolution) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE == pstPsTransferCtx->enRrcCause)) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } //MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } return; }
VOS_VOID MTC_RcvRrcAreaAvaliableInd(VOS_VOID * pMsg) { MODEM_ID_ENUM_UINT16 enModemId; RRC_MTC_AREA_AVALIABLE_IND_STRU *pstAreaAvaliableInd = VOS_NULL_PTR; MTC_MODEM_NETWORK_INFO_STRU *pstNetworkInfo = VOS_NULL_PTR; VOS_UINT8 ucUsimValidFlag; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); ucUsimValidFlag = MTC_GetModemUsimValidFlag(MODEM_ID_0); pstAreaAvaliableInd = (RRC_MTC_AREA_AVALIABLE_IND_STRU*)pMsg; enModemId = VOS_GetModemIDFromPid(pstAreaAvaliableInd->stMsgHeader.ulSenderPid); /* 仅处理Modem0发送的网络恢复指示 */ if (enModemId != MODEM_ID_0) { MTC_ERROR1_LOG("MTC_RcvRrcAreaAvaliableInd: Err ModemId ", enModemId); return; } /* PS域离网重选策略开启时 */ if (MTC_PS_TRANSFER_OFF_AREA == MTC_GetPsTransferCfg()) { pstNetworkInfo = MTC_GetModemNetworkInfoAddr(enModemId); /* 当前驻留网络非禁止PLMN、非禁止GPRS接入、卡状态有效、不重复上报 */ if ( (VOS_FALSE == pstNetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_TRUE == pstNetworkInfo->stPsDomainInfo.ucPsSupportFlg) && (VOS_TRUE == ucUsimValidFlag) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE != pstPsTransferCtx->enReportCause)) { /* 上报PS域迁移网络恢复指示AT命令 */ MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE; MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* 可维可测: 记录接收到丢网指示的次数 */ MTC_DEBUG_RcvRrcAreaAvaliableInd(); return; }
VOS_VOID MTC_ProcCurrCampPlmnInfoForLC(VOS_VOID) { MTC_MODEM_NETWORK_INFO_STRU *pstModem0NetworkInfo = VOS_NULL_PTR; MTC_PS_TRANSFER_ENUM_UINT8 enPsTransferSolution; MTC_RATMODE_ENUM_UINT8 enModem0RateMode; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstModem0NetworkInfo = MTC_GetModemNetworkInfoAddr(MODEM_ID_0); enPsTransferSolution = MTC_GetPsTransferCfg(); enModem0RateMode = MTC_GetModemRatMode(MODEM_ID_0); /* 1、当前驻留网络非禁止plmn 2、单待模式modem0的ps是detach状态,上报PS域迁移指示 */ if ( (MTC_RATMODE_LTE == enModem0RateMode) && (VOS_FALSE == pstModem0NetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_FALSE == pstModem0NetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg)) { /* PS域迁移策略脱网重选,上报网络恢复指示AT命令 */ if (MTC_PS_TRANSFER_LOST_AREA == enPsTransferSolution) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* PS域迁移策略离网重选,上报网络恢复指示AT命令 */ if ((MTC_PS_TRANSFER_OFF_AREA == enPsTransferSolution) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE == pstPsTransferCtx->enRrcCause)) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } return; }
VOS_VOID MTC_RcvMmaCurrCampPlmnInfoInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MODEM_ID_ENUM_UINT16 enOtherModemId; MMA_MTC_CURR_CAMP_PLMN_INFO_IND_STRU *pstCurrCampPlmnInfo = VOS_NULL_PTR; MTC_MODEM_NETWORK_INFO_STRU *pstNetworkInfo; MTC_OPERATOR_CUST_SOLUTION_ENUM_UINT8 enOperatorCustSolution; pstCurrCampPlmnInfo = (MMA_MTC_CURR_CAMP_PLMN_INFO_IND_STRU *)pMsg; ulPid = pstCurrCampPlmnInfo->stMsgHeader.ulSenderPid; /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); enOtherModemId = MODEM_ID_BUTT; if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaCurrCampPlmnInfoInd: Modem ID Err."); return ; } /* 保存Modem系统消息中的Modem网络信息 */ pstNetworkInfo = MTC_GetModemNetworkInfoAddr(enModemId); pstNetworkInfo->stPlmnId = pstCurrCampPlmnInfo->stPlmnId; pstNetworkInfo->stPsDomainInfo.ucPsSupportFlg = pstCurrCampPlmnInfo->ucPsSupportFlg; pstNetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg = pstCurrCampPlmnInfo->ucPsAttachAllowFlag; pstNetworkInfo->ucIsForbiddenPlmnFlag = pstCurrCampPlmnInfo->ucIsForbiddenPlmnFlag; MTC_SetModemRatMode(enModemId, pstCurrCampPlmnInfo->enRatMode); /* 获取当前运营商的定制方案 */ enOperatorCustSolution = MTC_GetOperatorCustSolution(); /* 当前仅在SVLTE形态及C+L形态需要通知另一个Modem当前的PLMN ID */ if ( (VOS_OK == MTC_GetOtherModemId(enModemId, &enOtherModemId)) && (MTC_OPERATOR_CUST_NONE != enOperatorCustSolution) ) { /* 通知modem0的mmc modem1的驻留信息,UTRAN 搜网T/W的状态中, 额外判断副卡的PLMN。如果发现中国区的,跳过W的搜索*/ MTC_SndMmaOtherModemInfoNotify(enOtherModemId, &pstCurrCampPlmnInfo->stPlmnId, VOS_NULL_PTR); } /* PS域迁移策略开启时触发流程 */ if (MTC_PS_TRANSFER_NONE == MTC_GetPsTransferCfg()) { return; } /* 处理Modem0发送的驻留plmn消息 */ if (MODEM_ID_0 == enModemId) { switch (enOperatorCustSolution) { case MTC_OPERATOR_CUST_CMCC_SVLTE: MTC_ProcCurrCampPlmnInfoForSvlte(); break; case MTC_OPERATOR_CUST_CT_LC: MTC_ProcCurrCampPlmnInfoForLC(); break; default: break; } } return; }