⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssp_mbuf.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 4 页
字号:
		return NULL;	}	if(ulLength == 0)	{		pstMBufCopy = mbuf_create(0, 0, pstMBuf->stDataBlockDescriptor.ulType, mpe);		if(pstMBufCopy == NULL)		{			return NULL;		}		pstMBufCopy->stDataBlockDescriptor.ulOption = pstMBuf->stDataBlockDescriptor.ulOption;		if( NULL == aos_memcpy( (VOID *)(& pstMBufCopy->stUserTagData), (VOID *) ( & pstMBuf->stUserTagData),\			sizeof(MBUF_USERTAGDATA_S) ) )		{			(VOID)mbuf_destroy(pstMBufCopy);			return NULL;		}		else		{			return pstMBufCopy;		}	}		pstMBufCopy = aos_dmem_alloc(mpe, SID_MBUF, MBUF_MBUF_SIZE);	if(pstMBufCopy == NULL)	{		return NULL;	}	pstMBufCopy->ulMbufMagic = MBUF_MAGIC_NUMBER;	pstMBufCopy->stDataBlockDescriptor.ulDBMagic = DBES_MAGIC_NUMBER;		pstMBufCopy->ulTotalDataLength = ulLength;	pstMBufCopy->pstNextMBuf = NULL;	if( NULL == aos_memcpy( (VOID *)(& pstMBufCopy->stUserTagData), (VOID *) ( & pstMBuf->stUserTagData),\		sizeof(MBUF_USERTAGDATA_S) ) )	{		pstMBufCopy->ulMbufMagic = 0;		(VOID)aos_dmem_free(pstMBufCopy);		return NULL;	}		for(pstDataBlockDescriptor = &(pstMBuf->stDataBlockDescriptor);\		pstDataBlockDescriptor != NULL && ulOffset >= pstDataBlockDescriptor->ulDataLength;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			pstMBufCopy->ulMbufMagic = 0;			aos_dmem_free(pstMBufCopy);			AOS_ASSERT(0);			return NULL;		}		ulOffset -= pstDataBlockDescriptor->ulDataLength;	}				ppstDataBlockDescriptorCopy = & (pstDataBlockDescriptorCopyHead);	ulDataBlockNumber = 0;				while(ulLength > 0 )	{		ulDataBlockNumber ++;				pstDataBlockDescriptorCopy = aos_dmem_alloc(mpe, SID_MBUF_DBDES, MBUF_DATA_BLOCK_DESC_SIZE);				if(pstDataBlockDescriptorCopy == NULL)		{						for(pstTempDataBlockDescriptor = pstDataBlockDescriptorCopyHead;\				pstTempDataBlockDescriptor != NULL;\				pstTempDataBlockDescriptor = pstTempNextDataBlockDescriptor)			{				if (DBES_IS_BAD(pstTempDataBlockDescriptor))				{					pstMBufCopy->ulMbufMagic = 0;					aos_dmem_free(pstMBufCopy);					AOS_ASSERT(0);					return NULL;				}				if(pstTempDataBlockDescriptor->pucDataBlock != NULL)				{					(VOID)aos_dmem_free(pstTempDataBlockDescriptor->pucDataBlock);				}								pstTempNextDataBlockDescriptor = pstTempDataBlockDescriptor->pstNextDataBlockDescriptor;				pstTempDataBlockDescriptor->ulDBMagic = 0;				(VOID)aos_dmem_free(pstTempDataBlockDescriptor);			}			pstMBufCopy->ulMbufMagic = 0;			(VOID)aos_dmem_free(pstMBufCopy);            			return NULL;		}        else        {    		pstDataBlockDescriptorCopy->ulDBMagic = DBES_MAGIC_NUMBER;    		* ppstDataBlockDescriptorCopy = pstDataBlockDescriptorCopy;        }		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return NULL;		}				pstDataBlockDescriptorCopy->ulDataLength\			= MBUF_MIN(pstDataBlockDescriptor->ulDataLength - ulOffset, ulLength);		pstDataBlockDescriptorCopy->pucData = pstDataBlockDescriptor->pucData + ulOffset;		pstDataBlockDescriptorCopy->pucDataBlock = pstDataBlockDescriptor->pucDataBlock;		ulResult = aos_dmem_ref_inc(pstDataBlockDescriptorCopy->pucDataBlock);		if(ulResult != 0)		{			pstDataBlockDescriptorCopy->pucDataBlock = NULL;			pstDataBlockDescriptorCopy->pstNextDataBlockDescriptor = NULL;						for(pstTempDataBlockDescriptor = pstDataBlockDescriptorCopyHead;\				pstTempDataBlockDescriptor != NULL;\				pstTempDataBlockDescriptor = pstTempNextDataBlockDescriptor)			{				if (DBES_IS_BAD(pstTempDataBlockDescriptor))				{					AOS_ASSERT(0);					return NULL;				}				if(pstTempDataBlockDescriptor->pucDataBlock != NULL)				{					(VOID)aos_dmem_free(pstTempDataBlockDescriptor->pucDataBlock);				}								pstTempNextDataBlockDescriptor = pstTempDataBlockDescriptor->pstNextDataBlockDescriptor;				pstTempDataBlockDescriptor->ulDBMagic = 0;				(VOID)aos_dmem_free(pstTempDataBlockDescriptor);			}			pstMBufCopy->ulMbufMagic = 0;			(VOID)aos_dmem_free(pstMBufCopy);			return NULL;		}		pstDataBlockDescriptorCopy->ulDataBlockLength = pstDataBlockDescriptor->ulDataBlockLength;		pstDataBlockDescriptorCopy->ulType = pstDataBlockDescriptor->ulType;		pstDataBlockDescriptorCopy->ulOption = pstDataBlockDescriptor->ulOption;						ulLength -= pstDataBlockDescriptorCopy->ulDataLength;		ulOffset = 0;		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;		pstDataBlockDescriptorCopy->pstNextDataBlockDescriptor = 0;		ppstDataBlockDescriptorCopy = &(pstDataBlockDescriptorCopy->pstNextDataBlockDescriptor);	}		pstMBufCopy->stDataBlockDescriptor = * pstDataBlockDescriptorCopyHead;	pstMBufCopy->ulDataBlockNumber = ulDataBlockNumber;	pstDataBlockDescriptorCopyHead->ulDBMagic = 0;	(VOID)aos_dmem_free(pstDataBlockDescriptorCopyHead);	return pstMBufCopy;}MBUF_S * mbuf_raw_copy(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength, U32 ulReserveHeadSpace, U32 mpe){	MBUF_S * pstMBufCopy;	U32 ulOffsetCopy;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	U32 ulCopyLength;	U32 ulResult;		if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return NULL;	}		if(ulOffset > pstMBuf->ulTotalDataLength)	{		return NULL;	}	if(ulLength > pstMBuf->ulTotalDataLength - ulOffset)	{		return NULL;	}	if(ulReserveHeadSpace > MBUF_DATA_BLOCK2048_SIZE)	{		return NULL;	}	pstMBufCopy = mbuf_create(ulReserveHeadSpace, 0, pstMBuf->stDataBlockDescriptor.ulType, mpe);	if(pstMBufCopy == NULL)	{		return NULL;	}	if( NULL == aos_memcpy( (VOID *)(& pstMBufCopy->stUserTagData), (VOID *) ( & pstMBuf->stUserTagData),\		sizeof(MBUF_USERTAGDATA_S) ) )	{		(VOID)mbuf_destroy(pstMBufCopy);		return NULL;	}	if(ulLength == 0)	{		return pstMBufCopy;	}		for(pstDataBlockDescriptor = &(pstMBuf->stDataBlockDescriptor);\		ulOffset >= pstDataBlockDescriptor->ulDataLength;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return NULL;		}		ulOffset -= pstDataBlockDescriptor->ulDataLength;	}			ulOffsetCopy = 0;	while(ulLength > 0 )	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return NULL;		}		ulCopyLength = MBUF_MIN(pstDataBlockDescriptor->ulDataLength - ulOffset, ulLength);		ulResult = mbuf_copy_from_buff(pstMBufCopy, ulOffsetCopy, ulCopyLength,\			pstDataBlockDescriptor->pucData + ulOffset, mpe);		if(ulResult != 0)		{			(VOID)mbuf_destroy(pstMBufCopy);			return NULL;		}		ulOffsetCopy += ulCopyLength;		ulLength -= ulCopyLength;		ulOffset = 0;		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;	}	return pstMBufCopy;}U32 mbuf_concatenate(MBUF_S * pstDestinationMBuf, MBUF_S * pstSourceMBuf, U32 mpe){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptorTemp;	if (MBUF_IS_BAD(pstDestinationMBuf) || MBUF_IS_BAD(pstSourceMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}			pstDataBlockDescriptorTemp = aos_dmem_alloc(mpe, SID_MBUF_DBDES, MBUF_DATA_BLOCK_DESC_SIZE);	if(pstDataBlockDescriptorTemp == NULL)	{		return MBUF_FAIL;	}	pstDataBlockDescriptorTemp->ulDBMagic = DBES_MAGIC_NUMBER;	* pstDataBlockDescriptorTemp = pstSourceMBuf->stDataBlockDescriptor;		for(pstDataBlockDescriptor = &(pstDestinationMBuf->stDataBlockDescriptor);\		pstDataBlockDescriptor->pstNextDataBlockDescriptor != NULL;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor )	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}	}		pstDataBlockDescriptor->pstNextDataBlockDescriptor = pstDataBlockDescriptorTemp;	pstDestinationMBuf->ulTotalDataLength += pstSourceMBuf->ulTotalDataLength;	pstDestinationMBuf->ulDataBlockNumber += pstSourceMBuf->ulDataBlockNumber;	pstSourceMBuf->ulMbufMagic = 0;	(VOID)aos_dmem_free(pstSourceMBuf);	return MBUF_OK;}MBUF_S * mbuf_fragment(MBUF_S * pstMBuf, U32 ulLength, U32 mpe){	MBUF_S * pstSurplusMBuf;	U32 ulSurplusLength;	U32 ulDataBlockNumber;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	U32 ulResult;	if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return NULL;	}	if(ulLength > pstMBuf->ulTotalDataLength)	{		return NULL;	}			ulSurplusLength = pstMBuf->ulTotalDataLength - ulLength;	if(ulSurplusLength == 0)	{				pstSurplusMBuf = mbuf_create(0, 0, pstMBuf->stDataBlockDescriptor.ulType, mpe);		return pstSurplusMBuf;	}	ulDataBlockNumber = 0;	for(pstDataBlockDescriptor = &(pstMBuf->stDataBlockDescriptor);\		\		ulLength > pstDataBlockDescriptor->ulDataLength;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return NULL;		}		ulLength -= pstDataBlockDescriptor->ulDataLength;		ulDataBlockNumber ++;	}					pstSurplusMBuf = aos_dmem_alloc(mpe, SID_MBUF, MBUF_MBUF_SIZE);	if(pstSurplusMBuf == NULL)	{		return NULL;	}	pstSurplusMBuf->ulMbufMagic = MBUF_MAGIC_NUMBER;	pstSurplusMBuf->stDataBlockDescriptor.ulDBMagic = DBES_MAGIC_NUMBER;		pstSurplusMBuf->ulTotalDataLength = ulSurplusLength;	pstSurplusMBuf->ulDataBlockNumber = pstMBuf->ulDataBlockNumber - ulDataBlockNumber;	pstSurplusMBuf->pstNextMBuf = NULL;	if( NULL == aos_memcpy( (VOID *)(& pstSurplusMBuf->stUserTagData), (VOID *) ( & pstMBuf->stUserTagData),\		sizeof(MBUF_USERTAGDATA_S) ) )	{		pstSurplusMBuf->ulMbufMagic = 0;		(VOID)aos_dmem_free(pstSurplusMBuf);		return NULL;	}	if(ulLength < pstDataBlockDescriptor->ulDataLength)	{				ulResult = aos_dmem_ref_inc(pstDataBlockDescriptor->pucDataBlock);		if(ulResult != 0)		{			pstSurplusMBuf->ulMbufMagic = 0;			(VOID)aos_dmem_free(pstSurplusMBuf);			return NULL;		}		pstSurplusMBuf->stDataBlockDescriptor.ulType = pstDataBlockDescriptor->ulType;		pstSurplusMBuf->stDataBlockDescriptor.ulOption = pstDataBlockDescriptor->ulOption;		pstSurplusMBuf->stDataBlockDescriptor.pucDataBlock = pstDataBlockDescriptor->pucDataBlock;		pstSurplusMBuf->stDataBlockDescriptor.ulDataBlockLength = pstDataBlockDescriptor->ulDataBlockLength;		pstSurplusMBuf->stDataBlockDescriptor.pucData = pstDataBlockDescriptor->pucData + ulLength;		pstSurplusMBuf->stDataBlockDescriptor.ulDataLength = pstDataBlockDescriptor->ulDataLength - ulLength;		pstSurplusMBuf->stDataBlockDescriptor.pstNextDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;						pstDataBlockDescriptor->ulDataLength = ulLength;	}	else	{		pstSurplusMBuf->ulDataBlockNumber --;		pstSurplusMBuf->stDataBlockDescriptor = * (pstDataBlockDescriptor->pstNextDataBlockDescriptor);		pstDataBlockDescriptor->pstNextDataBlockDescriptor->ulDBMagic = 0;		(VOID)aos_dmem_free(pstDataBlockDescriptor->pstNextDataBlockDescriptor);	}	pstDataBlockDescriptor->pstNextDataBlockDescriptor = NULL;		pstMBuf->ulTotalDataLength -= ulSurplusLength;	pstMBuf->ulDataBlockNumber = ulDataBlockNumber + 1;	return pstSurplusMBuf;}U32 mbuf_cut_and_free_head(MBUF_S * pstMBuf, U32 ulLength){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstNextDataBlockDescriptor;	if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}	if(ulLength > pstMBuf->ulTotalDataLength)	{		return MBUF_FAIL;	}	MBUF_CUT_HEAD(pstMBuf, ulLength);    if( NULL == pstMBuf )    {		AOS_ASSERT(0);        return MBUF_FAIL;    }		pstDataBlockDescriptor = (pstMBuf->stDataBlockDescriptor).pstNextDataBlockDescriptor;	while(pstDataBlockDescriptor != NULL && pstDataBlockDescriptor->ulDataLength == 0)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		pstMBuf->ulDataBlockNumber --;		(VOID)aos_dmem_free(pstDataBlockDescriptor->pucDataBlock);		pstNextDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;		pstDataBlockDescriptor->ulDBMagic = 0;		(VOID)aos_dmem_free(pstDataBlockDescriptor);		pstDataBlockDescriptor = pstNextDataBlockDescriptor;	}	if(pstDataBlockDescriptor == NULL)	{				pstMBuf->stDataBlockDescriptor.pstNextDataBlockDescriptor = NULL;		return MBUF_OK;	}		if( (pstMBuf->stDataBlockDescriptor).ulDataLength == 0 )	{		pstMBuf->ulDataBlockNumber --;		(VOID)aos_dmem_free( (pstMBuf->stDataBlockDescriptor).pucDataBlock );		pstMBuf->stDataBlockDescriptor = * pstDataBlockDescriptor;		pstDataBlockDescriptor->ulDBMagic = 0;		(VOID)aos_dmem_free(pstDataBlockDescriptor);	}	else	{		pstMBuf->stDataBlockDescriptor.pstNextDataBlockDescriptor = pstDataBlockDescriptor;	}	return MBUF_OK;}U32 mbuf_cut_part(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptorFirstCut;	U32 ulCutLength;	U32 ulOriginalLength;	if (MBUF_IS_BAD(pstMBuf))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -