环形缓冲区(三)
ERR 数据压入环形缓冲区失败
*************************************************************************/
ULONG VOS_PopBuffer(VOID *pRingBuffer, VOID *pFrameBuffer, ULONG *pulFrameBufferLen)
{
ULONG ulUsedRingBufferSize;
ULONG ulFrameBufferLen;
TLV_S stTlv;
UCHAR *pucCopyEnd;
RING_BUFFER_S *pstRingBuffer;
/* 函数参数合法性检查 */
if ((NULL_PTR == pRingBuffer) || (NULL_PTR == pFrameBuffer) || (NULL_PTR == pulFrameBufferLen))
{
return VOS_ERR;
}
pstRingBuffer = (RING_BUFFER_S *)pRingBuffer;
/* 获取环形缓冲区已用空间 */
ulUsedRingBufferSize = VOS_GetUsedRingBufferSize(pstRingBuffer);
/* 环形缓冲区无使用空间,不存在用户数据 */
if (0 == ulUsedRingBufferSize)
{
return VOS_ERR;
}
/* 读取TL字段 */
pucCopyEnd = VOS_SmartCopyFromBuffer(pstRingBuffer->aucBuffer,
sizeof(pstRingBuffer->aucBuffer),
pstRingBuffer->pucReadCursor,
(UCHAR *)(&stTlv),
SIZE_OF_TL);
if (stTlv.ucType != pstRingBuffer->
ucType)
{
return VOS_ERR;
}
pstRingBuffer->pucReadCursor = pucCopyEnd;
pstRingBuffer->ulUsedBufferSize -= SIZE_OF_TL;
/* 读取用户数据 */
ulFrameBufferLen = (stTlv.ucLen1 << 24) + (stTlv.ucLen2 << 16) + (stTlv.ucLen3 << 8) + (stTlv.ucLen4 << 0);
pucCopyEnd = VOS_SmartCopyFromBuffer(pstRingBuffer->aucBuffer,
sizeof(pstRingBuffer->aucBuffer),
pstRingBuffer->pucReadCursor,
(UCHAR *)(pFrameBuffer),
ulFrameBufferLen);
pstRingBuffer->pucReadCursor = pucCopyEnd;
pstRingBuffer->ulUsedBufferSize -= ulFrameBufferLen;
/* 回填返回数据大小 */
*pulFrameBufferLen = ulFrameBufferLen;
return VOS_OK;
}