VOS_UINT32 NAS_EMM_CnAttachAcpMsgChk(const NAS_EMM_CN_ATTACH_ACP_STRU *pMsgMsg) { NAS_LMM_UEID_STRU *pstEmmInfoUeIdAddr = VOS_NULL_PTR; /* EPS attach result合法性检查*/ if ((NAS_EMM_CN_MSG_ATTACH_TYPE_PS != pMsgMsg->ucAttachRst) &&(NAS_EMM_CN_MSG_ATTACH_TYPE_PS_CS != pMsgMsg->ucAttachRst)) { return NAS_EMM_PARA_INVALID; } /* UE没有GUTI,网络也没有分配GUTI*/ pstEmmInfoUeIdAddr = NAS_LMM_GetEmmInfoUeidAddr(); if((NAS_EMM_BIT_NO_SLCT == pMsgMsg->ucBitOpGuti) &&(NAS_EMM_BIT_NO_SLCT == pstEmmInfoUeIdAddr->bitOpGuti)) { /*发送EMM STATUS, 接收到conditional IE错误的消息 */ NAS_EMM_SendMsgEmmStatus( NAS_LMM_CAUSE_CONDITIONAL_IE_ERROR ); return NAS_EMM_PARA_INVALID; } return NAS_EMM_PARA_VALID; }
VOS_UINT32 NAS_EMM_AnyStateMsgGtReCmd(VOS_UINT32 ulMsgId, VOS_VOID *pMsgStru) { NAS_EMM_GUTI_REALLOCATION_CMD_STRU *pstGutiCmdMsg = NAS_EMM_NULL_PTR; NAS_EMM_GUTI_STRU *pstGuti; VOS_UINT32 ulRst; (VOS_VOID)ulMsgId; /*解析消息,获取网侧发来的GUTI*/ pstGutiCmdMsg = (NAS_EMM_GUTI_REALLOCATION_CMD_STRU *)pMsgStru; pstGuti = (NAS_EMM_GUTI_STRU *) &pstGutiCmdMsg->stGuti; /*更新全局变量GUTI*/ NAS_LMM_MEM_CPY_S( NAS_LMM_GetEmmInfoUeidGutiAddr(), sizeof(NAS_LMM_GUTI_STRU), pstGuti, sizeof(NAS_LMM_GUTI_STRU)); NAS_LMM_GetEmmInfoUeidAddr()->bitOpGuti = NAS_EMM_BIT_SLCT; /*如果更新了Tai List,存储最新Tai List */ if(VOS_TRUE == pstGutiCmdMsg->ucBitOpTaiList) { if(NAS_LMM_SUCC == NAS_EMM_TaiListSet(&pstGutiCmdMsg->stTaiList)) { NAS_EMM_GUTI_NORMAL_LOG("NAS_EMM_AnyStateMsgGtReCmd: TaiList update is success!"); TLPS_PRINT2LAYER_INFO(NAS_EMM_AnyStateMsgGtReCmd_ENUM,LNAS_SUCC); /*保存新的TAI List的同时更新ForbTA for Roaming和ForbTA for RPOS*/ NAS_EMMC_UpdateForbTaList(); } else { NAS_EMM_GUTI_ERROR_LOG("NAS_EMM_AnyStateMsgGtReCmd: TaiList update is fail!"); TLPS_PRINT2LAYER_ERROR(NAS_EMM_AnyStateMsgGtReCmd_ENUM,LNAS_FAIL); } } /* 判断没有放到函数NAS_LMM_WritePsLoc中来做,是由于紧急注册被拒或者尝试 次数达到5次时还是要删除参数 ,协议只规定是紧急注册成功后才不写卡或者 NV项 */ if ((NAS_LMM_REG_STATUS_EMC_REGING != NAS_LMM_GetEmmInfoRegStatus()) && (NAS_LMM_REG_STATUS_EMC_REGED != NAS_LMM_GetEmmInfoRegStatus())) { /*保存PS LOC信息*/ /*存储最新guti,last Ta,update state */ NAS_LMM_WritePsLoc(NAS_NV_ITEM_UPDATE); } /*发出内部消息MRRC_DATA_REQ,携带GUTI REALLOCAITON CMPL*/ ulRst = NAS_EMM_GutiMrrcDataReq(); if(NAS_EMM_OK != ulRst) { NAS_EMM_GUTI_ERROR_LOG("NAS_EMM_AnyStateMsgGtReCmd: NAS_EMM_GutiMrrcDataReq err!"); TLPS_PRINT2LAYER_ERROR(NAS_EMM_AnyStateMsgGtReCmd_ENUM,LNAS_ERROR); } return NAS_LMM_MSG_HANDLED; }
VOS_VOID NAS_LMM_DoAfterReadOptFileOver( VOS_VOID ) { NAS_LMM_FSM_STATE_STRU EmmState; NAS_LMM_UE_OPERATION_MODE_ENUM_UINT32 ulLteUeMode; NAS_LMM_UEID_STRU *pstUeId; /* 停止TI_NAS_LMM_TIMER_WAIT_USIM_CNF */ NAS_LMM_StopStateTimer(TI_NAS_LMM_TIMER_WAIT_USIM_CNF); /*如果读取到的GUTI无效但是安全上下文有效,则删除本地和NV中的上下文*/ pstUeId = NAS_LMM_GetEmmInfoUeidAddr(); if((NAS_EMM_BIT_NO_SLCT == pstUeId->bitOpGuti) &&(EMM_CUR_SECU_NOT_EXIST!= NAS_LMM_GetSecuCurFsmCS())) { NAS_EMM_ClearCurSecuCntxt(); NAS_LMM_WriteEpsSecuContext(NAS_NV_ITEM_DELETE); } /* Read NV Files*/ NAS_LMM_ProcessNvData(); /* 状态转成读必选文件状态 */ /* V7不再区分必读可选 */ /*NAS_EMM_GET_USIM_FILE_TYPE() = NAS_LMM_USIM_MANDATORY_FILE;*/ /*PC REPLAY MODIFY BY LEILI END*/ ulLteUeMode = NAS_LMM_ComputeLteUeMode( NAS_EMM_GetMsMode(), NAS_LMM_GetEmmInfoUeCenter()); NAS_LMM_SetEmmInfoUeOperationMode(ulLteUeMode); /*PC REPLAY MODIFY BY LEILI END*/ /* 启动TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER */ NAS_LMM_StartStateTimer(TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER); /* 转状态 */ EmmState.enFsmId = NAS_LMM_PARALLEL_FSM_EMM; EmmState.enMainState = EMM_MS_NULL; EmmState.enSubState = EMM_SS_NULL_WAIT_MMC_START_CNF; EmmState.enStaTId = TI_NAS_EMM_WAIT_MMC_START_CNF_TIMER; NAS_LMM_StaTransProc(EmmState); /* 向MMC发送MMC_EMM_START_REQ(正常启动)消息 */ (VOS_VOID)NAS_EMM_PLMN_SendMmcStartReq(EMMC_EMM_START_REQ_CAUSE_NORMAL_START); return; }
/***************************************************************************** Function Name : NAS_LMM_DecodeSimPsLoc Discription : 解码PS_LOC_FILE Input : pstNvCtrlTbl:公共处理结构 Output : 解码后的数据 Return : History: *****************************************************************************/ VOS_UINT32 NAS_LMM_DecodeSimPsLoc( NAS_NVIM_CTRL_TBL *pstNvCtrlTbl) { VOS_UINT8 *pucMsg; NAS_LMM_UEID_STRU *pstUeId; VOS_UINT32 usIndex = 0; VOS_UINT32 ulRslt = VOS_TRUE; VOS_UINT32 ulRslt2 = VOS_TRUE; NAS_LMM_GUTI_STRU stGuti; NAS_MM_NETWORK_ID_STRU stLrvTai; VOS_UINT8 ucUpdataSta; VOS_UINT8 *pstLastPsLoc; NAS_MM_PLMN_ID_STRU stPlmnId; NAS_LMM_NVIM_LOG_INFO("NAS_LMM_DecodeSimPsLoc is entered "); NAS_LMM_MEM_SET(&stGuti, 0, sizeof(NAS_LMM_GUTI_STRU)); NAS_LMM_MEM_SET(&stLrvTai, 0, sizeof(NAS_MM_NETWORK_ID_STRU)); pstUeId = NAS_LMM_GetEmmInfoUeidAddr(); pstLastPsLoc = NAS_LMM_GetEmmInfoLastWriteUsimPsLocAddr(); pucMsg = (VOS_UINT8*)pstNvCtrlTbl->pNvData; /* 读出卡中的码流保存到上次写卡的全局变量中*/ NAS_LMM_MEM_CPY( pstLastPsLoc, pucMsg, pstNvCtrlTbl->usNvDataLen); /*****************GUTI*********************/ /*检测文件GUTI头的有效性*/ if ( NAS_LMM_NVIM_GUTI_AND_OETOI_LEN != pucMsg[usIndex]) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_DecodeSimPsLoc: GUTI HEAD ERR"); usIndex += NAS_LMM_NVIM_GUTI_AND_OETOI_LEN; usIndex ++; pstUeId->bitOpGuti = NAS_NVIM_BIT_NO_SLCT; } else { stGuti.stGutiHead.ucLenth = NAS_LMM_NVIM_GUTI_AND_OETOI_LEN; usIndex ++; stGuti.stGutiHead.ucOeToi = pucMsg[usIndex] & NAS_EMM_LOW_HALF_BYTE_F; if (NAS_LMM_NVIM_GUTI_OETOI != stGuti.stGutiHead.ucOeToi) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_DecodeSimPsLoc: GUTI OETOI ERR"); usIndex += NAS_LMM_NVIM_GUTI_AND_OETOI_LEN; pstUeId->bitOpGuti = NAS_NVIM_BIT_NO_SLCT; } else { usIndex ++; /*检测GUTI内容的合法性*/ ulRslt = NAS_EMM_CheckSimGutiValid(pucMsg, usIndex, NAS_LMM_NVIM_GUTI_LEN); /*检测GUTI中PLMN ID的合法性 */ stPlmnId.aucPlmnId[0] = pucMsg[0 + usIndex]; stPlmnId.aucPlmnId[1] = pucMsg[1 + usIndex]; stPlmnId.aucPlmnId[2] = pucMsg[2 + usIndex]; ulRslt2 &= NAS_LMM_CheckPlmnIsInvalid(&stPlmnId); /*检测内容的有效性*/ if ((VOS_FALSE == ulRslt) || (VOS_TRUE == ulRslt2)) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_DecodeSimPsLoc: GUTI Content ERR"); usIndex = usIndex + NAS_LMM_NVIM_GUTI_LEN; pstUeId->bitOpGuti = NAS_NVIM_BIT_NO_SLCT; } else { NAS_LMM_MEM_CPY( &stGuti.stPlmnId, &stPlmnId, sizeof(NAS_MM_PLMN_ID_STRU)); usIndex += 3; stGuti.stMmeGroupId.ucGroupId = pucMsg[usIndex]; usIndex ++; stGuti.stMmeGroupId.ucGroupIdCnt = pucMsg[usIndex]; usIndex ++; stGuti.stMmeCode.ucMmeCode = pucMsg[usIndex]; usIndex ++; NAS_LMM_MEM_CPY( &(stGuti.stMTmsi), &(pucMsg[usIndex]), sizeof(NAS_LMM_MTMSI_STRU)); usIndex += sizeof(NAS_LMM_MTMSI_STRU); pstUeId->bitOpGuti = NAS_NVIM_BIT_SLCT; NAS_LMM_MEM_CPY( &(pstUeId->stGuti), &stGuti, sizeof(NAS_LMM_GUTI_STRU)); } } } /****************L.R.V TAI******************/ /* 检测LRV TAI中 PLMN合法性 */ /*检查PLMN中MCC和MNC是否有效*/ NAS_LMM_MEM_CPY( &(stLrvTai.stPlmnId), &(pucMsg[usIndex]), NAS_LMM_NVIM_PLMN_ID_LEN); usIndex += NAS_LMM_NVIM_PLMN_ID_LEN; ulRslt = NAS_LMM_CheckPlmnIsInvalid(&(stLrvTai.stPlmnId)); /*ulRslt = NAS_LMM_CheckWhetherAllBytesAreFF(pucMsg, usIndex, NAS_LMM_NVIM_PLMN_ID_LEN);*/ /*plmn无效,设置全局变量中PLMN为0XFFFFFF,TAC为0xfffe*/ if (VOS_TRUE == ulRslt) { NAS_EMM_ClearLVRTai(); usIndex = usIndex + NAS_LMM_NVIM_TAC_LEN; } else { NAS_LMM_MEM_CPY( &(stLrvTai.stTac), &(pucMsg[usIndex]), NAS_LMM_NVIM_TAC_LEN); usIndex += NAS_LMM_NVIM_TAC_LEN; if (VOS_TRUE == NAS_LMM_TacIsUnexist(&(stLrvTai.stTac))) { NAS_LMM_UndefTac(&(stLrvTai.stTac)); } NAS_EMM_SetLVRTai(&stLrvTai); } /***************UPDATE STATUS**************/ /*检测文件UPDATE STATUS项的有效性*/ ucUpdataSta = (pucMsg[usIndex])& NAS_LMM_NVIM_LOW_3_BIT_1; if ( NAS_LMM_NVIM_VALID_UPDATESTA < ucUpdataSta) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_DecodeSimPsLoc: UPDATE STATUS Content ERR"); } else { NAS_EMM_MAIN_CONTEXT_SET_AUX_UPDATE_STAE(pucMsg[usIndex]); } usIndex ++; pstNvCtrlTbl->usNvDataLen = (VOS_UINT16)(usIndex); NAS_LMM_NVIM_LOG_INFO("NAS_LMM_DecodeSimPsLoc:GUTI IS: "); NAS_COMM_PrintArray(NAS_COMM_GET_MM_PRINT_BUF(),(VOS_UINT8 *)&pstUeId->stGuti,20); NAS_LMM_NVIM_LOG_INFO("NAS_LMM_DecodeSimPsLoc:L.R.V TAI IS: "); NAS_COMM_PrintArray(NAS_COMM_GET_MM_PRINT_BUF(),(VOS_UINT8*)NAS_LMM_GetEmmInfoLastRegPlmnAddr(),4); NAS_COMM_PrintArray(NAS_COMM_GET_MM_PRINT_BUF(),(VOS_UINT8*)NAS_LMM_GetEmmInfoLastRegTacAddr(),4); NAS_LMM_NVIM_LOG1_INFO("NAS_LMM_DecodeSimPsLoc:UPDATE STATUS IS: ",NAS_EMM_UPDATE_STAE); return NAS_LMM_NVIM_OK; }