NAS_MML_INTERNAL_MSG_BUF_STRU *NAS_MML_GetIntMsgSendBuf( VOS_UINT32 ulLen ) { NAS_MML_INTERNAL_MSG_BUF_STRU *pstNasMmlMsg = VOS_NULL_PTR; NAS_MML_INTERNAL_MSG_QUEUE_STRU *pstInternalMsgQueue = VOS_NULL_PTR; pstInternalMsgQueue = &(NAS_MML_GetMmlCtx()->stInternalMsgQueue); /* 从上下文中获取消息缓冲区指针 */ pstNasMmlMsg = ( NAS_MML_INTERNAL_MSG_BUF_STRU *)&(pstInternalMsgQueue->stSendMsgBuf); if ( ulLen > NAS_MML_MAX_INTERNAL_MSG_LEN ) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MML_GetIntMsgSendBuf: Buffer full" ); NAS_MMC_SndOmInternalMsgQueueInfo(VOS_FALSE, VOS_TRUE); return VOS_NULL_PTR; } /* 清空这个消息缓冲单元 */ PS_MEM_SET(pstNasMmlMsg, 0x00, sizeof(NAS_MML_INTERNAL_MSG_BUF_STRU)); /* 返回缓冲区指针 */ return pstNasMmlMsg; }
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_UINT32 NAS_MMC_InitTask( VOS_VOID ) { NAS_MMC_CONTEXT_STRU *pstMmcCtx; NAS_MML_CTX_STRU *pstMmlCtx; /* 初始化MML模块CTX */ pstMmlCtx = NAS_MML_GetMmlCtx(); NAS_MML_InitCtx(NAS_MML_INIT_CTX_STARTUP, pstMmlCtx); /* 支持TD时,对UTRAN CTRL模块进行初始化 */ NAS_UTRANCTRL_InitCtx(NAS_MML_INIT_CTX_STARTUP); /* 初始化MMC模块CTX */ pstMmcCtx = NAS_MMC_GetMmcCtxAddr(); NAS_MMC_InitCtx(NAS_MMC_INIT_CTX_STARTUP, pstMmcCtx); /*注册状态机*/ NAS_MMC_RegFsm(); return VOS_OK; }
NAS_MML_INTERNAL_MSG_BUF_STRU* NAS_MML_GetNextInternalMsg( VOS_VOID ) { NAS_MML_INTERNAL_MSG_BUF_STRU *pstNextMsg = VOS_NULL_PTR; VOS_UINT8 ucNextIndex; NAS_MML_CTX_STRU *pstMmlCtx = VOS_NULL_PTR; pstMmlCtx = NAS_MML_GetMmlCtx(); if ( pstMmlCtx->stInternalMsgQueue.ucHeader != pstMmlCtx->stInternalMsgQueue.ucTail) { ucNextIndex = pstMmlCtx->stInternalMsgQueue.ucHeader; pstNextMsg = (NAS_MML_INTERNAL_MSG_BUF_STRU *)&(pstMmlCtx->stInternalMsgQueue.astNasMmMsgQueue[ucNextIndex]); /* 取完一条消息,头指针向后偏移 */ (pstMmlCtx->stInternalMsgQueue.ucHeader)++; (pstMmlCtx->stInternalMsgQueue.ucHeader) %= NAS_MML_MAX_MSG_QUEUE_SIZE; return pstNextMsg; } NAS_INFO_LOG(WUEPS_PID_MM, "NAS_MML_GetNextInternalMsg:Empty Internal Msg"); return VOS_NULL_PTR; }