/******************************************************************************* Module : Function : NAS_EMM_SER_SendMrrcDataReq_Tcdata Input : pMsg------------TC消息 Output : NOTE : 向RRC转发TC_DATA_REQ消息 Return : VOS_VOID History : 1.lihong00150010 2009-10-16 Draft Enact *******************************************************************************/ VOS_VOID NAS_EMM_SER_SendMrrcDataReq_Tcdata ( EMM_ETC_DATA_REQ_STRU *pMsg ) { VOS_UINT32 ulMsgLenthNoHeader; NAS_EMM_MRRC_DATA_REQ_STRU *pMrrcDataReqMsg = NAS_EMM_NULL_PTR; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_SER_LOG1_INFO( "NAS_EMM_SER_SendMrrcDataReq_Tcdata is entered.", pMsg); /*申请消息*/ 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_Tcdata: NAS_LMM_ALLOC_MSG err !!"); return; } ulMsgLenthNoHeader = NAS_EMM_CountMrrcDataReqLen(pMsg->stTcMsg.ulTcMsgSize); /* 拷贝消息 */ pMrrcDataReqMsg->stNasMsg.ulNasMsgSize = pMsg->stTcMsg.ulTcMsgSize; NAS_LMM_MEM_CPY( (pMrrcDataReqMsg->stNasMsg.aucNasMsg), (pMsg->stTcMsg.aucTcMsg), (pMsg->stTcMsg.ulTcMsgSize)); /* 改写DOPRA消息头 */ EMM_COMP_MM_MSG_HEADER( (pMrrcDataReqMsg), ulMsgLenthNoHeader); /*改写消息ID*/ pMrrcDataReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; /*填写 EST CAUSE*/ pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; pMrrcDataReqMsg->enEmmMsgType = NAS_EMM_MSG_TC; pMrrcDataReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NOT_NEED; /* 向MRRC转发TC_DATA_REQ消息 */ NAS_EMM_SndUplinkNasMsg(pMrrcDataReqMsg); NAS_LMM_MEM_FREE(pMrrcDataReqMsg); return; }
/***************************************************************************** Function Name : Nas_Emm_MrrcDataReq Discription : 构造MRRC_DATA_REQ,把上行消息发给mrrc模块转发 Input : GUTI Output : None Return : None History: 1. zangyalan 57968 2008-09-09 Draft Enact *****************************************************************************/ VOS_UINT32 NAS_EMM_GutiMrrcDataReq(VOS_VOID) { NAS_EMM_MRRC_DATA_REQ_STRU *pstMrrcDataReqMsg = NAS_EMM_NULL_PTR; VOS_UINT32 ulLen; /*分配空间,内部消息不应该分配空间,而应获取地址方式*/ /*获取内部消息地址*/ pstMrrcDataReqMsg =(NAS_EMM_MRRC_DATA_REQ_STRU *) NAS_LMM_MEM_ALLOC(NAS_EMM_INTRA_MSG_MAX_SIZE); if(NAS_EMM_NULL_PTR == pstMrrcDataReqMsg) { return NAS_EMM_ERR; } /* 填充CN消息 */ NAS_EMM_CompCnGutiCmp( &(pstMrrcDataReqMsg->stNasMsg)); ulLen = NAS_EMM_CountMrrcDataReqLen(pstMrrcDataReqMsg->stNasMsg.ulNasMsgSize); /*打包VOS消息头,NAS_EMM_MRRC_DATA_REQ_STRU */ NAS_EMM_INTRA_MSG_HEADER(pstMrrcDataReqMsg, ulLen); /*填充消息ID */ pstMrrcDataReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; pstMrrcDataReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NEED; /*填充消息内容*/ pstMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_SIGNALLING; pstMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_SIGNALLING; pstMrrcDataReqMsg->enEmmMsgType = NAS_EMM_MSG_GUTI_CMP; /*空口消息上报GUTI REALLOCATION COMPLETE*/ NAS_LMM_SendOmtAirMsg(NAS_EMM_OMT_AIR_MSG_UP, NAS_EMM_GUTI_CMP, (NAS_MSG_STRU*)&(pstMrrcDataReqMsg->stNasMsg)); /*关键事件上报GUTI REALLOCATION COMPLETE*/ NAS_LMM_SendOmtKeyEvent( EMM_OMT_KE_GUTI_CMP); /*发出内部消息MRRC_DATA_REQ*/ NAS_EMM_SndUplinkNasMsg( pstMrrcDataReqMsg); NAS_LMM_MEM_FREE(pstMrrcDataReqMsg); return NAS_EMM_OK; }
VOS_VOID NAS_EMM_CompCnDetachReqMo( NAS_EMM_MRRC_DATA_REQ_STRU *pDetReqMoMsg) { VOS_UINT32 ulIndex; VOS_UINT32 ulDataReqLenNoHeader; NAS_EMM_MRRC_DATA_REQ_STRU *pTempDetReqMsg = pDetReqMoMsg; if (NAS_EMM_NULL_PTR == pDetReqMoMsg) { /*打印错误*/ NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_CompCnDetachReqMo: Mem Alloc Err!"); return; } ulIndex = 0; /*计算DETACH REQ空口消息*/ NAS_EMM_CompCnDetachReqMoNasMsg(pTempDetReqMsg->stNasMsg.aucNasMsg, &ulIndex); /*内部消息长度计算*/ ulDataReqLenNoHeader = NAS_EMM_CountMrrcDataReqLen(ulIndex); if ( NAS_EMM_INTRA_MSG_MAX_SIZE < ulDataReqLenNoHeader ) { /* 打印错误信息 */ NAS_LMM_PUBM_LOG_ERR("NAS_EMM_CompCnDetachReqMo, Size error"); return ; } /*填充消息长度*/ pTempDetReqMsg->stNasMsg.ulNasMsgSize = ulIndex; /*填充消息头*/ NAS_EMM_COMP_AD_INTRA_MSG_HEADER(pTempDetReqMsg, ulDataReqLenNoHeader); /*填充消息ID*/ pTempDetReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; pTempDetReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NEED; /*填充消息内容*/ pTempDetReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_SIGNALLING; pTempDetReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_SIGNALLING; pTempDetReqMsg->enEmmMsgType = NAS_EMM_MSG_DETACH_REQ; return; }
/******************************************************************************* Module : Function : NAS_EMM_SMS_CompMsgUpLinkNasTransportMrrcDataReqMsg Input :pMsg :SMS透传过来的消息 Output :pMrrcDataReqMsg : 指向 LRRC_LNAS_MSG_STRU NOTE : Return : History : 1. FTY 2011.11.15 新规作成 *******************************************************************************/ VOS_VOID NAS_EMM_SMS_CompMsgUpLinkNasTransportMrrcDataReqMsg (NAS_EMM_MRRC_DATA_REQ_STRU *pMrrcDataReqMsg, const LMM_SMS_MSG_STRU * pSmsMsg) { VOS_UINT32 uldataReqMsgLenNoHeader = NAS_LMM_NULL; VOS_UINT32 ulCnNasMsgLen = NAS_LMM_NULL; NAS_LMM_PUBM_LOG_NORM("NAS_EMM_CompMsgUpLinkNasTransportMrrcDataReqMsg enter!"); /*构造MRRC_DATA_REQ 中的 NAS_MSG_STRU,即CN消息(Compose the msg of):UpLink NAS Transport*/ NAS_EMM_SMS_CompCnUplinkNasTransportMsg(pMrrcDataReqMsg->stNasMsg.aucNasMsg, &ulCnNasMsgLen, pSmsMsg); pMrrcDataReqMsg->stNasMsg.ulNasMsgSize = ulCnNasMsgLen; uldataReqMsgLenNoHeader = NAS_EMM_CountMrrcDataReqLen(ulCnNasMsgLen); if ( NAS_EMM_INTRA_MSG_MAX_SIZE < uldataReqMsgLenNoHeader ) { /* 打印错误信息 */ NAS_LMM_PUBM_LOG_ERR("NAS_EMM_SMS_CompMsgUpLinkNasTransportMrrcDataReqMsg, Size error "); return ; } /* 填写MRRC_DATA_REQ 的DOPRA消息头 */ EMM_COMP_MM_MSG_HEADER(pMrrcDataReqMsg, uldataReqMsgLenNoHeader); /* 填写MRRC_DATA_REQ 的消息ID标识 */ pMrrcDataReqMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; /*填充 NAS_EMM_NAS_UPLINK_NAS_TRANSPORT*/ pMrrcDataReqMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_DATA; pMrrcDataReqMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_CALL; pMrrcDataReqMsg->enEmmMsgType = NAS_EMM_NAS_UPLINK_NAS_TRANSPORT; pMrrcDataReqMsg->enDataCnf = LRRC_LMM_DATA_CNF_NOT_NEED; pMrrcDataReqMsg->ulEsmMmOpId = NAS_LMM_OPID; return; }
VOS_VOID NAS_EMM_SendMsgEmmStatus( VOS_UINT8 ucRes ) { NAS_EMM_MRRC_DATA_REQ_STRU *pIntraMsg; VOS_UINT32 ulDataReqMsgLenNoHeader; NAS_MSG_STRU *pstNasMsg; VOS_UINT32 ulIndex =0; NAS_EMM_ATTACH_LOG_INFO("Enter NAS_EMM_SendMsgEmmStatus,Status MSG LEN"); /*申请消息内存*/ pIntraMsg = (VOS_VOID *) NAS_LMM_MEM_ALLOC(NAS_EMM_INTRA_MSG_MAX_SIZE); /*判断申请结果,若失败退出*/ if (NAS_EMM_NULL_PTR == pIntraMsg) { return; } /* xiongxianghui00253310 add memset 2013-11-26 begin */ NAS_LMM_MEM_SET(pIntraMsg, 0, NAS_EMM_INTRA_MSG_MAX_SIZE); /* xiongxianghui00253310 add memset 2013-11-26 end */ /*构造EmmStatus消息*/ NAS_EMM_CompCnEmmStatus( &(pIntraMsg->stNasMsg),&ulIndex,ucRes); ulDataReqMsgLenNoHeader = NAS_EMM_CountMrrcDataReqLen(ulIndex); if ( NAS_EMM_INTRA_MSG_MAX_SIZE < ulDataReqMsgLenNoHeader ) { /* 打印错误信息 */ NAS_LMM_PUBM_LOG_ERR("NAS_EMM_SendMsgEmmStatus, Size error"); NAS_LMM_MEM_FREE(pIntraMsg); return ; } /*填充消息头*/ NAS_EMM_INTRA_MSG_HEADER(pIntraMsg, ulDataReqMsgLenNoHeader); /*填充消息ID*/ pIntraMsg->ulMsgId = ID_NAS_LMM_INTRA_MRRC_DATA_REQ; /*填充消息内容*/ pIntraMsg->enEstCaue = LRRC_LNAS_EST_CAUSE_MO_SIGNALLING; pIntraMsg->enCallType = LRRC_LNAS_CALL_TYPE_ORIGINATING_SIGNALLING; pIntraMsg->enEmmMsgType = NAS_EMM_NAS_STATUS; pIntraMsg->enDataCnf = LRRC_LMM_DATA_CNF_NOT_NEED; /*填充消息长度*/ pIntraMsg->stNasMsg.ulNasMsgSize = ulIndex; /*向OM发送空口消息ATTACH COMPLETE*/ pstNasMsg = (NAS_MSG_STRU *)(&(pIntraMsg->stNasMsg)); NAS_LMM_SendOmtAirMsg(NAS_EMM_OMT_AIR_MSG_UP, NAS_EMM_STATUS, pstNasMsg); /*向MRRC发送消息*/ NAS_EMM_SndUplinkNasMsg( pIntraMsg); NAS_LMM_MEM_FREE(pIntraMsg); 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; }