VOS_VOID NAS_EMM_SER_CompCnServiceReq( LRRC_LNAS_MSG_STRU *pNasMsg) { VOS_UINT32 ulIndex = 0; VOS_UINT8 ucKsiSn; VOS_UINT8 ucKsi; VOS_UINT8 ucSequenceNum; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_SER_LOG_INFO("NAS_EMM_SER_CompCnServiceReq is entered."); /* 清空将填充CN消息的空间 */ /* xiongxianghui00253310 delete memset 2013-11-26 begin */ /* NAS_LMM_MEM_SET(pNasMsg->aucNasMsg, 0, pNasMsg->ulNasMsgSize); */ /* xiongxianghui00253310 delete memset 2013-11-26 end */ /* 填充 Security header type + Protocol discriminator */ pNasMsg->aucNasMsg[ulIndex++] = EMM_CN_SECURITY_HEADER_TYPE_SER_REQ; /* 计算 KsiSn*/ ucKsi = NAS_EMM_SecuGetKSIValue(); ucSequenceNum = (VOS_UINT8)NAS_EMM_SecuGetUlNasCountVAlue(); ucSequenceNum = ucSequenceNum & EMM_TAUSER_LOW5_BITS; ucKsiSn = ((VOS_UINT8)(ucKsi << 5)) | ucSequenceNum; /* 填充 KSI and sequence number */ pNasMsg->aucNasMsg[ulIndex++] = ucKsiSn; /* 填充 Message authentication code */ /*这里只需要初始化为0,在完整性保护时会填充这两个字节*/ pNasMsg->aucNasMsg[ulIndex++] = 0; pNasMsg->aucNasMsg[ulIndex] = 0; return; }
VOS_VOID NAS_EMM_SER_AbnormalOver(VOS_VOID) { NAS_EMM_SER_LOG_INFO( "NAS_EMM_SER_AbnormalOver is entered."); /*停止T3417定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417); /*停止T3440定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_T3440); /*停止T3417ext定时器*/ NAS_LMM_StopStateTimer(TI_NAS_EMM_STATE_SERVICE_T3417_EXT); /*如果SR流程是由于SMS触发,需要回复SMS建链失败,并且清除SR的发起原因,*/ if(NAS_EMM_SER_START_CAUSE_SMS_EST_REQ == NAS_EMM_SER_GetSerStartCause()) { /* SER异常的原因值上报暂时报LMM_SMS_ERR_CAUSE_OTHERS, 以后可能要根据相应的原因值进行具体细分处理,上报准确的原因值 此处作为遗留问题 */ NAS_LMM_SndLmmSmsErrInd(LMM_SMS_ERR_CAUSE_OTHERS); NAS_EMM_SER_SaveEmmSERStartCause(NAS_EMM_SER_START_CAUSE_BUTT); } if (VOS_TRUE != NAS_EMM_SER_IsCsfbProcedure()) { /*Inform RABM that SER fail*/ NAS_EMM_SER_SendRabmReestInd(EMM_ERABM_REEST_STATE_FAIL); } /*清空ESM_DATA缓存*/ NAS_EMM_SerClearEsmDataBuf(); return; }
VOS_VOID NAS_EMM_SER_SendRabmReestInd(EMM_ERABM_REEST_STATE_ENUM_UINT32 enRabmReestState) { EMM_ERABM_REEST_IND_STRU *pRabmReestIndMsg = NAS_EMM_NULL_PTR; NAS_EMM_SER_LOG_INFO("NAS_EMM_SER_SendRabmReestInd is entered."); /* 申请DOPRA消息 */ pRabmReestIndMsg = (VOS_VOID *)NAS_LMM_ALLOC_MSG(sizeof(EMM_ERABM_REEST_IND_STRU)); if(NAS_EMM_NULL_PTR == pRabmReestIndMsg) { NAS_EMM_SER_LOG_ERR( "NAS_EMM_SER_SendRabmReestInd: MSG ALLOC ERR !!"); return; } /* 填写EMM_ERABM_REEST_IND 的DOPRA消息头 */ EMM_COMP_ERABM_MSG_HEADER(pRabmReestIndMsg, sizeof(EMM_ERABM_REEST_IND_STRU) - EMM_LEN_VOS_MSG_HEADER); /* 填写EMM_ERABM_REEST_IND 的消息ID标识 */ pRabmReestIndMsg->ulMsgId = ID_EMM_ERABM_REEST_IND; /* 构造EMM_ERABM_REEST_IND 中的重建状态 */ pRabmReestIndMsg->enReEstState = enRabmReestState; /* 发送消息(Send the msg of) EMM_ERABM_REEST_IND */ NAS_LMM_SEND_MSG( pRabmReestIndMsg); return; }
VOS_UINT32 NAS_EMM_SndDetachReqFailProc(VOS_VOID* pMsg,VOS_UINT32 *pulIsDelBuff) { LRRC_LMM_DATA_CNF_STRU *pstRrcMmDataCnf = VOS_NULL_PTR; *pulIsDelBuff = VOS_TRUE; pstRrcMmDataCnf = (LRRC_LMM_DATA_CNF_STRU*) pMsg; if ((EMM_MS_DEREG_INIT != NAS_LMM_GetEmmCurFsmMS()) && ((EMM_MS_REG != NAS_LMM_GetEmmCurFsmMS()) && (EMM_SS_REG_IMSI_DETACH_WATI_CN_DETACH_CNF != NAS_LMM_GetEmmCurFsmSS()))) { /*打印出错信息*/ NAS_EMM_SER_LOG_INFO("NAS_EMM_SndExtendedServiceReqFailProc: STATE ERR!"); return NAS_EMM_SUCC; } switch (pstRrcMmDataCnf->enSendRslt) { case LRRC_LMM_SEND_RSLT_FAILURE_HO: case LRRC_LMM_SEND_RSLT_FAILURE_TXN: case LRRC_LMM_SEND_RSLT_FAILURE_RLF: if (EMM_MS_DEREG_INIT == NAS_LMM_GetEmmCurFsmMS()) { NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /*发送DETACH REQUEST消息*/ NAS_EMM_SendDetachReqMo(); } else { NAS_LMM_StopStateTimer( TI_NAS_EMM_T3421); /* 发起IMSI DETACH流程 */ NAS_EMM_SendImsiDetachReqMo(); } break; default: break; } return NAS_EMM_SUCC; }
VOS_VOID NAS_EMM_MmcSendSerResultIndOtherType ( MMC_LMM_SERVICE_RSLT_ENUM_UINT32 ulSerRslt ) { LMM_MMC_SERVICE_RESULT_IND_STRU *pstRsltInd = NAS_EMM_NULL_PTR; /* 打印进入该函数*/ NAS_EMM_SER_LOG_INFO("NAS_EMM_MmcSendSerResultIndOtherType is entered."); /* 申请MMC内部消息*/ pstRsltInd = (VOS_VOID *)NAS_LMM_GetLmmMmcMsgBuf(sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU)); if(NAS_EMM_NULL_PTR == pstRsltInd) { NAS_EMM_SER_LOG_ERR("NAS_EMM_MmcSendSerResultIndOtherType: MSG ALLOC ERR !!"); return; } NAS_LMM_MEM_SET(pstRsltInd, 0, sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU)); /* 填充给RRC的DOPRA头 */ EMM_PUBU_COMP_MMC_MSG_HEADER( pstRsltInd, sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU) - EMM_LEN_VOS_MSG_HEADER); /*填充OPID*/ /* 填充消息ID */ pstRsltInd->ulMsgId = ID_LMM_MMC_SERVICE_RESULT_IND; /* 填充消息内容----SERVCIE结果 */ if ((MMC_LMM_SERVICE_RSLT_FAILURE== ulSerRslt) || (MMC_LMM_SERVICE_RSLT_ACCESS_BARED == ulSerRslt) || (MMC_LMM_SERVICE_RSLT_AUTH_REJ == ulSerRslt)) { NAS_EMM_SER_LOG1_NORM("NAS_EMM_MmcSendSerResultIndOtherType: ulSerRslt = ", ulSerRslt); pstRsltInd->ulServiceRst = ulSerRslt; } else { NAS_EMM_SER_LOG_WARN("NAS_EMM_MmcSendSerResultIndOtherType: ulSerRslt is err! "); } /*填充消息内容----请求类型*/ /* 如果ARBOT标识无效,则是CSFB流程,则填写请求类型 */ if (NAS_EMM_CSFB_ABORT_FLAG_VALID != NAS_EMM_SER_GetEmmSerCsfbAbortFlag()) { if (NAS_EMM_SER_START_CAUSE_MO_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICE_MO_CSFB_1XCSFB; } else if (NAS_EMM_SER_START_CAUSE_MT_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICR_MT_CSFB_1XCSFB; } else if (NAS_EMM_SER_START_CAUSE_MO_EMERGENCY_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICR_MO_CSFB_1XCSFB_EMERGENCY; } else { /* 非CSFB类型不填写ulReqType */ } } /* 发送LMM_MMC_SERVICE_RESULT_IND消息 */ NAS_LMM_SendLmmMmcMsg( pstRsltInd); return; }
VOS_VOID NAS_EMM_MmcSendSerResultIndRej ( NAS_EMM_CN_CAUSE_ENUM_UINT8 ucCnCause ) { LMM_MMC_SERVICE_RESULT_IND_STRU *pstRsltInd = NAS_EMM_NULL_PTR; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_SER_LOG_INFO( "NAS_EMM_MmcSendSerResultIndRej is entered."); /* 申请MMC内部消息 */ pstRsltInd = (VOS_VOID *)NAS_LMM_GetLmmMmcMsgBuf(sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU)); if(NAS_EMM_NULL_PTR == pstRsltInd) { NAS_EMM_SER_LOG_ERR( "NAS_EMM_SER_SendMmcActionResultReq: MSG ALLOC ERR !!"); return; } NAS_LMM_MEM_SET(pstRsltInd, 0, sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU)); /* 填充给RRC的DOPRA头 */ EMM_PUBU_COMP_MMC_MSG_HEADER( pstRsltInd, sizeof(LMM_MMC_SERVICE_RESULT_IND_STRU) - EMM_LEN_VOS_MSG_HEADER); /*填充OPID*/ /* 填充消息ID */ pstRsltInd->ulMsgId = ID_LMM_MMC_SERVICE_RESULT_IND; /* 填充消息内容----SERVCIE结果 */ pstRsltInd->ulServiceRst = MMC_LMM_SERVICE_RSLT_CN_REJ; /*填充消息内容----拒绝原因值*/ pstRsltInd->bitOpCnCause = NAS_EMM_BIT_SLCT; pstRsltInd->ucCnCause = ucCnCause; /*填充消息内容----请求类型*/ /* 如果ARBOT标识无效,则是CSFB流程,则填写请求类型 */ if (NAS_EMM_CSFB_ABORT_FLAG_VALID != NAS_EMM_SER_GetEmmSerCsfbAbortFlag()) { if (NAS_EMM_SER_START_CAUSE_MO_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICE_MO_CSFB_1XCSFB; } else if (NAS_EMM_SER_START_CAUSE_MT_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICR_MT_CSFB_1XCSFB; } else if (NAS_EMM_SER_START_CAUSE_MO_EMERGENCY_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pstRsltInd->bitOpReqType = NAS_EMM_BIT_SLCT; pstRsltInd->ulReqType = MMC_LMM_SERVICR_MO_CSFB_1XCSFB_EMERGENCY; } else { /* 非CSFB类型不填写ulReqType */ } } /* 发送LMM_MMC_SERVICE_RESULT_IND消息 */ NAS_LMM_SendLmmMmcMsg( pstRsltInd); return; }
VOS_VOID NAS_EMM_SER_SendMrrcDataReq_ExtendedServiceReq(VOS_VOID) { NAS_EMM_MRRC_DATA_REQ_STRU *pMrrcDataReqMsg = NAS_EMM_NULL_PTR; VOS_UINT32 ulDataReqMsgLenNoHeader = NAS_EMM_NULL; VOS_UINT32 ulIndex = NAS_EMM_NULL; NAS_EMM_SER_LOG_INFO("NAS_EMM_SER_SendMrrcDataReq_ExtendedServiceReq is entered."); /*以最小消息长度,申请消息内存,主要是看是否队列有空间*/ pMrrcDataReqMsg = (VOS_VOID *) NAS_LMM_MEM_ALLOC(NAS_EMM_INTRA_MSG_MAX_SIZE); /*判断申请结果,若失败打印错误并退出*/ if (NAS_EMM_NULL_PTR == pMrrcDataReqMsg) { /*打印错误*/ NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_SER_SendMrrcDataReq_ExtendedServiceReq: MSG ALLOC ERR!"); return; } /* 清除CSFB ABORT标识 */ NAS_EMM_SER_SaveEmmSerCsfbAbortFlag(NAS_EMM_CSFB_ABORT_FLAG_INVALID); /*组装EXTENDED SERVICE REQ消息*/ NAS_EMM_CompCnExtendedSerReqMoNasMsg(pMrrcDataReqMsg->stNasMsg.aucNasMsg, &ulIndex); /*内部消息长度计算*/ ulDataReqMsgLenNoHeader = NAS_EMM_CountMrrcDataReqLen(ulIndex); if ( NAS_EMM_INTRA_MSG_MAX_SIZE < ulDataReqMsgLenNoHeader ) { /* 打印错误信息 */ NAS_LMM_PUBM_LOG_ERR("NAS_EMM_SER_SendMrrcDataReq_ExtendedServiceReq, Size error"); NAS_LMM_MEM_FREE(pMrrcDataReqMsg); return ; } /*填充消息长度*/ pMrrcDataReqMsg->stNasMsg.ulNasMsgSize = ulIndex; /*填充消息头*/ EMM_COMP_MM_MSG_HEADER(pMrrcDataReqMsg, ulDataReqMsgLenNoHeader); /* 填写MRRC_DATA_REQ 的消息ID标识 */ pMrrcDataReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; /*填写建立原因*/ switch(NAS_EMM_SER_GetEmmSERStartCause()) { case NAS_EMM_SER_START_CAUSE_MT_CSFB_REQ: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MT_ACCESS; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_TERMINATING_CALL; break; case NAS_EMM_SER_START_CAUSE_MO_CSFB_REQ: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_MO_CSFB; break; case NAS_EMM_SER_START_CAUSE_MO_EMERGENCY_CSFB_REQ: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_EMERGENCY_CALL; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_EMERGENCY_CALL; break; default: NAS_EMM_SER_LOG_ERR("Nas_Emm_SER_SendMrrcDataReq_ServiceReq:StartCause ERR"); break; } pMrrcDataReqMsg->enEmmMsgType = NAS_EMM_MSG_EXTENDED_SERVICE_REQ; pMrrcDataReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NEED; /*空口消息上报SER REQ*/ NAS_LMM_SendOmtAirMsg(NAS_EMM_OMT_AIR_MSG_UP, NAS_EMM_EXTENDED_SER_REQ, (NAS_MSG_STRU*)&(pMrrcDataReqMsg->stNasMsg)); /*关键事件上报SER REQ*/ NAS_LMM_SendOmtKeyEvent( EMM_OMT_KE_EXTENDED_SER_REQ); /* 发送消息(Send the msg of) MRRC_DATA_REQ(SER_REQ) */ NAS_EMM_SndUplinkNasMsg( pMrrcDataReqMsg); NAS_LMM_MEM_FREE(pMrrcDataReqMsg); return; }
VOS_VOID NAS_EMM_SER_SendMrrcDataReq_ServiceReq() { NAS_EMM_MRRC_DATA_REQ_STRU *pMrrcDataReqMsg = NAS_EMM_NULL_PTR; VOS_UINT32 ulDataReqMsgLenNoHeader; VOS_UINT32 ulCnMsgLen; NAS_EMM_SER_LOG_INFO("NAS_EMM_SER_SendMrrcDataReq_ServiceReq is entered."); /* 计算NAS_MSG_STRU消息长度 */ ulCnMsgLen = NAS_EMM_COUNT_CN_SER_REQ_LEN; ulDataReqMsgLenNoHeader = EMM_COUNT_DATA_REQ_LEN(ulCnMsgLen); /* 申请DOPRA消息 */ pMrrcDataReqMsg = (VOS_VOID *)NAS_LMM_MEM_ALLOC(NAS_EMM_INTRA_MSG_MAX_SIZE); if(NAS_EMM_NULL_PTR == pMrrcDataReqMsg) { NAS_EMM_SER_LOG_ERR( "Nas_Emm_SER_SendMrrcDataReq_ServiceReq: MSG ALLOC ERR !!"); return; } /* xiongxianghui00253310 add memset 2013-11-26 begin */ NAS_LMM_MEM_SET(pMrrcDataReqMsg, 0, NAS_EMM_INTRA_MSG_MAX_SIZE); /* xiongxianghui00253310 add memset 2013-11-26 end */ /* 清除CSFB ABORT标识 */ NAS_EMM_SER_SaveEmmSerCsfbAbortFlag(NAS_EMM_CSFB_ABORT_FLAG_INVALID); /* 填写MRRC_DATA_REQ 的DOPRA消息头 */ EMM_COMP_MM_MSG_HEADER(pMrrcDataReqMsg, ulDataReqMsgLenNoHeader); /* 填写MRRC_DATA_REQ 的消息ID标识 */ pMrrcDataReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; /*填写建立原因*/ switch(NAS_EMM_SER_GetEmmSERStartCause()) { case NAS_EMM_SER_START_CAUSE_RRC_PAGING: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MT_ACCESS; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_TERMINATING_CALL; break; case NAS_EMM_SER_START_CAUSE_RABM_REEST: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; break; case NAS_EMM_SER_START_CAUSE_ESM_DATA_REQ: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; break; case NAS_ESM_SER_START_CAUSE_UPLINK_PENDING: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; break; case NAS_EMM_SER_START_CAUSE_SMS_EST_REQ: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; break; /* lihong00150010 emergency tau&service begin */ case NAS_EMM_SER_START_CAUSE_ESM_DATA_REQ_EMC: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_EMERGENCY_CALL; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_EMERGENCY_CALL; break; case NAS_EMM_SER_START_CAUSE_RABM_REEST_EMC: pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_EMERGENCY_CALL; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_EMERGENCY_CALL; break; /* lihong00150010 emergency tau&service end */ default: NAS_EMM_SER_LOG_ERR("Nas_Emm_SER_SendMrrcDataReq_ServiceReq:StartCause ERR"); break; } pMrrcDataReqMsg->enEmmMsgType = NAS_EMM_MSG_SERVICE_REQ; /* 填写MRRC_DATA_REQ 的NAS消息长度标识 */ pMrrcDataReqMsg->stNasMsg.ulNasMsgSize = ulCnMsgLen; pMrrcDataReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NEED; /* 构造MRRC_DATA_REQ 中的 NAS_MSG_STRU,即CN消息(Compose the msg of): SER_REQ */ NAS_EMM_SER_CompCnServiceReq( &(pMrrcDataReqMsg->stNasMsg)); /*空口消息上报SER REQ*/ NAS_LMM_SendOmtAirMsg(NAS_EMM_OMT_AIR_MSG_UP, NAS_EMM_SER_REQ, (NAS_MSG_STRU*)&(pMrrcDataReqMsg->stNasMsg)); /*关键事件上报SER REQ*/ NAS_LMM_SendOmtKeyEvent( EMM_OMT_KE_SER_REQ); /* 发送消息(Send the msg of) MRRC_DATA_REQ(SER_REQ) */ NAS_EMM_SndUplinkNasMsg((VOS_VOID*)pMrrcDataReqMsg); NAS_LMM_MEM_FREE(pMrrcDataReqMsg); return; }