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

📄 ssp_mbuf.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 4 页
字号:
	{		AOS_ASSERT(0);		return MBUF_FAIL;	}	if(ulOffset > pstMBuf->ulTotalDataLength)	{		return MBUF_FAIL;	}	if(ulLength > pstMBuf->ulTotalDataLength - ulOffset)	{		return MBUF_FAIL;	}	if(ulLength == 0)	{		return MBUF_OK;	}	ulOriginalLength = ulLength;		for(pstDataBlockDescriptor = &(pstMBuf->stDataBlockDescriptor);\		ulOffset >= pstDataBlockDescriptor->ulDataLength;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		ulOffset -= pstDataBlockDescriptor->ulDataLength;	}			pstDataBlockDescriptorFirstCut = pstDataBlockDescriptor;	while(ulLength > 0)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		ulCutLength = MBUF_MIN(pstDataBlockDescriptor->ulDataLength - ulOffset, ulLength);		ulLength -= ulCutLength;		if(ulLength == 0)		{						if(pstDataBlockDescriptor == pstDataBlockDescriptorFirstCut\				&& ulOffset != 0)			{								if( NULL == aos_memcpy( pstDataBlockDescriptor->pucData + ulOffset,\					pstDataBlockDescriptor->pucData + ulOffset + ulCutLength,\					pstDataBlockDescriptor->ulDataLength - (ulOffset + ulCutLength) ) )				{					return MBUF_FAIL;				}				else				{					pstMBuf->ulTotalDataLength -= ulOriginalLength;					pstDataBlockDescriptor->ulDataLength -= ulCutLength;					return MBUF_OK;				}			}			else			{								pstDataBlockDescriptor->ulDataLength -= ulCutLength;				pstDataBlockDescriptor->pucData += ulCutLength;				pstMBuf->ulTotalDataLength -= ulOriginalLength;				return MBUF_OK;			}		}				pstDataBlockDescriptor->ulDataLength -= ulCutLength;		ulOffset = 0;		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;	}		pstMBuf->ulTotalDataLength -= ulOriginalLength;	return MBUF_OK;}U32 mbuf_cut_tail(MBUF_S * pstMBuf, U32 ulLength){	U32 ulSurplusLength;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstNextDataBlockDescriptor;	U32 ulCutDataBlockNumber;		if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}	if(ulLength > pstMBuf->ulTotalDataLength)	{		return MBUF_FAIL;	}	ulSurplusLength = pstMBuf->ulTotalDataLength - ulLength;	pstMBuf->ulTotalDataLength = ulSurplusLength;			for(pstDataBlockDescriptor = &(pstMBuf->stDataBlockDescriptor);\		pstDataBlockDescriptor != NULL;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		if(pstDataBlockDescriptor->ulDataLength >=  ulSurplusLength)		{			pstDataBlockDescriptor->ulDataLength = ulSurplusLength;			break;		}		ulSurplusLength -= pstDataBlockDescriptor->ulDataLength;	}		if(pstDataBlockDescriptor == NULL)	{        AOS_ASSERT(0);        return MBUF_OK;	}    pstNextDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;    pstDataBlockDescriptor->pstNextDataBlockDescriptor = NULL;    pstDataBlockDescriptor = pstNextDataBlockDescriptor;    ulCutDataBlockNumber = 0;	while(pstDataBlockDescriptor != NULL)    {	if (DBES_IS_BAD(pstDataBlockDescriptor))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}        pstNextDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;        aos_dmem_free(pstDataBlockDescriptor->pucDataBlock);        pstDataBlockDescriptor->ulDBMagic = 0;        aos_dmem_free(pstDataBlockDescriptor);        ulCutDataBlockNumber ++;        pstDataBlockDescriptor = pstNextDataBlockDescriptor;    }    pstMBuf->ulDataBlockNumber -= ulCutDataBlockNumber;    return MBUF_OK;        #if 0	pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;	while(pstDataBlockDescriptor != NULL)	{		pstDataBlockDescriptor->ulDataLength = 0;		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;	}	return MBUF_OK;#endif}U8 * mbuf_append(MBUF_S * pstMBuf, U32 ulLength, U32 mpe){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	U8 * pucAppending;	U32 ulReferenceCount;	U32 ulResult;	U32 ulType;	if(ulLength > MBUF_DATA_BLOCK2048_SIZE)	{		return NULL;	}	if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return NULL;	}	ulType = pstMBuf->stDataBlockDescriptor.ulType;		for(pstDataBlockDescriptor = MBUF_GET_DATA_BLOCK_DESC(pstMBuf);\		pstDataBlockDescriptor->pstNextDataBlockDescriptor != NULL;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return NULL;		}	}	if(ulLength == 0)	{		return (pstDataBlockDescriptor->pucData	+ pstDataBlockDescriptor->ulDataLength);	}	ulResult = aos_dmem_ref_get(pstDataBlockDescriptor->pucDataBlock, & ulReferenceCount);	if(ulResult != 0)	{		ulReferenceCount = 2;	}	if( ulReferenceCount != 1 \		|| (U32) ( pstDataBlockDescriptor->pucDataBlock + pstDataBlockDescriptor->ulDataBlockLength \		- (pstDataBlockDescriptor->pucData + pstDataBlockDescriptor->ulDataLength) ) < ulLength)	{		pstDataBlockDescriptor->pstNextDataBlockDescriptor 			= mbuf_create_dbdes(MBUF_DATA_BLOCK2048_SIZE, ulType, mpe);		if(	pstDataBlockDescriptor->pstNextDataBlockDescriptor == NULL)		{			return NULL;		}		pstMBuf->ulDataBlockNumber ++;		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;				pstDataBlockDescriptor->pucData = pstDataBlockDescriptor->pucDataBlock;		pstDataBlockDescriptor->ulDataLength = 0;	}			pucAppending = pstDataBlockDescriptor->pucData + pstDataBlockDescriptor->ulDataLength;	pstDataBlockDescriptor->ulDataLength += ulLength;	pstMBuf->ulTotalDataLength += ulLength;	return (pucAppending);}U32 mbuf_assign_zero(MBUF_S * pstMBuf){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}		for(pstDataBlockDescriptor = MBUF_GET_DATA_BLOCK_DESC(pstMBuf);\		pstDataBlockDescriptor != NULL;\		pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		if( NULL == aos_memset(pstDataBlockDescriptor->pucData, 0, pstDataBlockDescriptor->ulDataLength) )		{			return MBUF_FAIL;		}	}	return MBUF_OK;}U32 mbuf_neat_concatenate(MBUF_S * pstDestinationMBuf, MBUF_S * pstSourceMBuf, MBUF_DATABLOCKDESCRIPTOR_S ** ppstLastDataBlockDescriptor, U32 mpe){	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptorTemp;	MBUF_DATABLOCKDESCRIPTOR_S * pstNextDataBlockDescriptor;	U32 ulResult;	U32 ulReferenceCount;	U32 ulRemainingSpace;	if (MBUF_IS_BAD(pstDestinationMBuf) || MBUF_IS_BAD(pstSourceMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}	if (ppstLastDataBlockDescriptor == NULL)	{		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);	while(pstDataBlockDescriptor->pstNextDataBlockDescriptor != NULL)	{		if (DBES_IS_BAD(pstDataBlockDescriptor))		{			AOS_ASSERT(0);			return MBUF_FAIL;		}		pstNextDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor;		ulResult = aos_dmem_ref_get(pstDataBlockDescriptor->pucDataBlock, & ulReferenceCount);		if(ulResult != 0)		{			ulReferenceCount = 2;		}				ulRemainingSpace = (U32)(pstDataBlockDescriptor->pucDataBlock + pstDataBlockDescriptor->ulDataBlockLength\			- (pstDataBlockDescriptor->pucData + pstDataBlockDescriptor->ulDataLength));		if(pstDataBlockDescriptor->ulType == pstNextDataBlockDescriptor->ulType			&& ulReferenceCount == 1			&& ulRemainingSpace >= pstNextDataBlockDescriptor->ulDataLength			&& pstNextDataBlockDescriptor->ulDataLength < 500)		{			if( NULL == aos_memcpy(pstDataBlockDescriptor->pucData + pstDataBlockDescriptor->ulDataLength,\				pstNextDataBlockDescriptor->pucData, \				pstNextDataBlockDescriptor->ulDataLength) )			{								pstDataBlockDescriptor = pstNextDataBlockDescriptor;							}			else			{								pstDataBlockDescriptor->ulDataLength += pstNextDataBlockDescriptor->ulDataLength;				pstDataBlockDescriptor->pstNextDataBlockDescriptor = pstNextDataBlockDescriptor->pstNextDataBlockDescriptor;				(VOID)aos_dmem_free(pstNextDataBlockDescriptor->pucDataBlock);				pstNextDataBlockDescriptor->ulDBMagic = 0;				(VOID)aos_dmem_free(pstNextDataBlockDescriptor);				pstDestinationMBuf->ulDataBlockNumber --;							}		}		else		{						pstDataBlockDescriptor = pstNextDataBlockDescriptor;					}	}	* ppstLastDataBlockDescriptor = pstDataBlockDescriptor;	return MBUF_OK;}MBUF_S * mbuf_reference_copy_by_dbdes(MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor, \										U32 ulOffset, U32 ulLength,  U32 mpe){	MBUF_S * pstMBuf;	U32 ulResult;	if(pstDataBlockDescriptor == NULL)	{		return NULL;	}	if(ulOffset > pstDataBlockDescriptor->ulDataLength)	{		return NULL;	}	if(ulLength > pstDataBlockDescriptor->ulDataLength - ulOffset)	{		return NULL;	} 		pstMBuf = aos_dmem_alloc(mpe, SID_MBUF, MBUF_MBUF_SIZE);	if(pstMBuf == NULL)	{		return (NULL);	}	pstMBuf->ulMbufMagic = MBUF_MAGIC_NUMBER;	pstMBuf->stDataBlockDescriptor.ulDBMagic = DBES_MAGIC_NUMBER;		ulResult = aos_dmem_ref_inc(pstDataBlockDescriptor->pucDataBlock);	if(ulResult != 0)	{		pstMBuf->ulMbufMagic = 0;		(VOID)aos_dmem_free(pstMBuf);		return NULL;	}	pstMBuf->stDataBlockDescriptor.ulType = pstDataBlockDescriptor->ulType;	pstMBuf->stDataBlockDescriptor.ulOption = pstDataBlockDescriptor->ulOption;	pstMBuf->stDataBlockDescriptor.pucDataBlock = pstDataBlockDescriptor->pucDataBlock;	pstMBuf->stDataBlockDescriptor.pucData = pstDataBlockDescriptor->pucData + ulOffset;	pstMBuf->stDataBlockDescriptor.ulDataLength = ulLength;	pstMBuf->stDataBlockDescriptor.ulDataBlockLength = pstDataBlockDescriptor->ulDataBlockLength;	pstMBuf->stDataBlockDescriptor.pstNextDataBlockDescriptor = NULL;		pstMBuf->ulTotalDataLength = ulLength;	pstMBuf->ulDataBlockNumber = 1;	pstMBuf->pstNextMBuf = NULL;	(VOID)aos_memset( (VOID *) (& pstMBuf->stUserTagData), 0 , sizeof(MBUF_USERTAGDATA_S));	return pstMBuf;}MBUF_S * mbuf_raw_copy_by_dbdes(MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor, \								  U32 ulOffset, U32 ulLength,  U32 mpe){	MBUF_S * pstMBuf;	MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptorTemp;	if(pstDataBlockDescriptor == NULL)	{		return NULL;	}	if(ulOffset > pstDataBlockDescriptor->ulDataLength)	{		return NULL;	}	if(ulLength > pstDataBlockDescriptor->ulDataLength - ulOffset)	{		return NULL;	}		pstMBuf = mbuf_create_and_copy_buf(0, ulLength, \		pstDataBlockDescriptor->pucData + ulOffset, pstDataBlockDescriptor->ulType, mpe);	if(pstMBuf != NULL)	{		for(pstDataBlockDescriptorTemp = & pstMBuf->stDataBlockDescriptor;\			pstDataBlockDescriptorTemp != NULL;\			pstDataBlockDescriptorTemp = pstDataBlockDescriptorTemp->pstNextDataBlockDescriptor)		{			pstDataBlockDescriptorTemp->ulOption = pstDataBlockDescriptor->ulOption;		}	}	return pstMBuf;}U32 mbuf_free_zero_db(MBUF_S * pstMBuf){        MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;	MBUF_DATABLOCKDESCRIPTOR_S * pstLastDataBlockDescriptor;	if (MBUF_IS_BAD(pstMBuf))	{		AOS_ASSERT(0);		return MBUF_FAIL;	}		pstDataBlockDescriptor = (pstMBuf->stDataBlockDescriptor).pstNextDataBlockDescriptor;	pstLastDataBlockDescriptor = & (pstMBuf->stDataBlockDescriptor);

⌨️ 快捷键说明

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