📄 mbuf_pub.h
字号:
#ifdef __cplusplus#if __cplusplusextern "C"{#endif #endif #ifndef __INC_MBUF_PUB_H__#define __INC_MBUF_PUB_H__#define MBUF_MBUF_SIZE ( sizeof(MBUF_S) )#define MBUF_DATA_BLOCK_DESC_SIZE ( sizeof(MBUF_DATABLOCKDESCRIPTOR_S) )#define MBUF_DATA_BLOCK2048_SIZE 2048#define MBUF_DATA_BLOCK4096_SIZE 4096#define MBUF_MAGIC_WORD 0x12345678#define MBUF_MIN(a,b) (((a) < (b)) ? (a) : (b))#define MBUF_TYPE_DATA 1#define MBUF_TYPE_CONTROL 2#define MBUF_TYPE_NAME 3#define MBUF_TYPE_OOBDATA 4#define MBUF_TYPE_SOOPTS 5#define MBUF_PRI_LOOPAD 4#define MBUF_PRI_TOP 3#define MBUF_PRI_HIGH 0#define MBUF_PRI_MEDI 1#define MBUF_PRI_LOW 2#define MBUF_GET_PRI(pstMBufM) ( (pstMBufM)->stUserTagData.stCommonInfo.ulPRI )#define MBUF_ASSIGN_PRI(pstMBufM, ulPri) \ (pstMBufM)->stUserTagData.stCommonInfo.ulPRI = (ulPri)#define MBUF_CREATE_BY_DATA_BLOCK(pstMBufM, pucDataBlockM, ulDataBlockLengthM, pucDataM, \ ulDataLengthM, ulReceiveIfnetIndexM, ulMpeM)\{\ (pstMBufM) = aos_dmem_alloc( ulMpeM, SID_MBUF, MBUF_MBUF_SIZE);\ if( (pstMBufM) != NULL)\ {\ (pstMBufM)->ulMbufMagic = MBUF_MAGIC_NUMBER;\ (pstMBufM)->stDataBlockDescriptor.ulDBMagic = DBES_MAGIC_NUMBER;\ (pstMBufM)->stDataBlockDescriptor.pstNextDataBlockDescriptor = (MBUF_DATABLOCKDESCRIPTOR_S*)NULL;\ (pstMBufM)->stDataBlockDescriptor.pucDataBlock = (pucDataBlockM);\ (pstMBufM)->stDataBlockDescriptor.ulDataBlockLength = (ulDataBlockLengthM);\ (pstMBufM)->stDataBlockDescriptor.pucData = (pucDataM);\ (pstMBufM)->stDataBlockDescriptor.ulDataLength = (ulDataLengthM);\ (pstMBufM)->stDataBlockDescriptor.ulType = MBUF_TYPE_DATA;\ (pstMBufM)->stDataBlockDescriptor.ulOption = 0;\ \ aos_memset( (VOID *) (& pstMBufM->stUserTagData), 0 , sizeof(MBUF_USERTAGDATA_S));\ (pstMBufM)->ulTotalDataLength = (ulDataLengthM);\ (pstMBufM)->ulDataBlockNumber = 1;\ (pstMBufM)->stUserTagData.stCommonInfo.ulReceiveIfnetIndex = (ulReceiveIfnetIndexM);\ (pstMBufM)->pstNextMBuf = NULL;\ }\}struct tagMBuf;extern VOID mbuf_cut_head(struct tagMBuf * pstMBuf, U32 ulLength);#define MBUF_CUT_HEAD(pstMBufM, ulLengthM)\{\ if(MBUF_IS_OK(pstMBufM))\ {\ if( (pstMBufM)->stDataBlockDescriptor.ulDataLength >= (ulLengthM) )\ {\ (pstMBufM)->stDataBlockDescriptor.pucData += (ulLengthM);\ (pstMBufM)->stDataBlockDescriptor.ulDataLength -= (ulLengthM);\ (pstMBufM)->ulTotalDataLength -= (ulLengthM);\ }\ else\ {\ mbuf_cut_head( (pstMBufM), (ulLengthM) );\ }\ }\ else\ {\ AOS_ASSERT(0);\ }\}extern U32 mbuf_pullup(struct tagMBuf * pstMBuf, U32 ulLength, U32 mpe);#define MBUF_MAKE_MEMORY_CONTINUOUS(pstMBufM, ulLengthM, ulMpeM, ulResultM) \{\ if(MBUF_IS_OK(pstMBufM))\ {\ if( (pstMBufM)->stDataBlockDescriptor.ulDataLength < (ulLengthM) )\ {\ (ulResultM) = mbuf_pullup( (pstMBufM), (ulLengthM), (ulMpeM) );\ }\ else\ {\ (ulResultM) = MBUF_OK;\ }\ }\ else\ {\ AOS_ASSERT(0);\ (ulResultM) = MBUF_FAIL;\ }\}extern U32 mbuf_prepend_db(struct tagMBuf * pstMBuf, U32 ulLength, U32 mpe);#define MBUF_PREPEND_MEMORY_SPACE(pstMBufM, ulLengthM, ulMpeM, ulResultM)\{\ U32 ulReferenceCount;\ MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;\ U32 ulReturn;\ \ if(MBUF_IS_OK(pstMBufM)) \ {\ pstDataBlockDescriptor = &( (pstMBufM)->stDataBlockDescriptor );\ ulReturn = aos_dmem_ref_get(pstDataBlockDescriptor->pucDataBlock, & ulReferenceCount);\ if(ulReturn != 0)\ {\ ulReferenceCount = 2;\ }\ if(ulReferenceCount == 1 \ && (U32) (pstDataBlockDescriptor->pucData - pstDataBlockDescriptor->pucDataBlock) >= (ulLengthM) )\ {\ pstDataBlockDescriptor->pucData -= (ulLengthM);\ pstDataBlockDescriptor->ulDataLength += (ulLengthM);\ (pstMBufM)->ulTotalDataLength += (ulLengthM);\ (ulResultM) = MBUF_OK;\ }\ else\ {\ (ulResultM) = mbuf_prepend_db( (pstMBufM), (ulLengthM), (ulMpeM) );\ }\ }\ else\ {\ AOS_ASSERT(0);\ (ulResultM) = MBUF_FAIL;\ }\}#define MBUF_COMPRESS(pstMBufM, ulDataBlockNumberM, ulMpeM, ulResultM)\{\ if(MBUF_IS_OK(pstMBufM))\ {\ if( (pstMBufM)->ulDataBlockNumber > (ulDataBlockNumberM) )\ {\ (ulResultM) = mbuf_compress((pstMBufM), (ulDataBlockNumberM), (ulMpeM) );\ }\ else\ {\ (ulResultM) = MBUF_OK;\ }\ }\ else\ {\ (ulResultM) = MBUF_FAIL;\ }\}#define MBUF_GET_DATA_BLOCK_DESC(pstMBufM) ( & ( (pstMBufM)->stDataBlockDescriptor) )#define MBUF_GET_DATA_BLOCK_DESC_INFO(pstDataBlockDescriptorM, pucDataM, ulDataLengthM, pstNextDataBlockDescriptorM)\{\ (pucDataM) = (pstDataBlockDescriptorM)->pucData;\ (ulDataLengthM) = (pstDataBlockDescriptorM)->ulDataLength;\ (pstNextDataBlockDescriptorM) = (pstDataBlockDescriptorM)->pstNextDataBlockDescriptor;\}#define MBUF_MTOD(pstMBufM, DataTypeM) ( (DataTypeM) (pstMBufM)->stDataBlockDescriptor.pucData )#define MBUF_GET_PTR_NEXT_MBUF(pstMBufM) ( (pstMBufM)->pstNextMBuf )#define MBUF_ASSIGN_PTR_NEXT_MBUF(pstMBufM, pstNextMBufM) (pstMBufM)->pstNextMBuf = (pstNextMBufM)#define MBUF_GET_TOTAL_DATA_LENGTH(pstMBufM) ( (pstMBufM)->ulTotalDataLength )#define MBUF_GET_DATA_BLOCK_NUMBER(pstMBufM) ( (pstMBufM)->ulDataBlockNumber )#define MBUF_GET_DATA_BLOCK_DESC_TYPE(pstDataBlockDescriptorM) (pstDataBlockDescriptorM)->ulType#define MBUF_ASSIGN_DATA_BLOCK_DESC_TYPE(pstDataBlockDescriptorM, ulTypeM) (pstDataBlockDescriptorM)->ulType = (ulTypeM)#define MBUF_GET_DATA_BLOCK_DESC_OPTION(pstDataBlockDescriptorM) (pstDataBlockDescriptorM)->ulOption#define MBUF_SET_DATA_BLOCK_DESC_OPTION(pstDataBlockDescriptorM, ulOptionM) (pstDataBlockDescriptorM)->ulOption |= (ulOptionM)#define MBUF_CLEAR_DATA_BLOCK_DESC_OPTION(pstDataBlockDescriptorM, ulOptionM) (pstDataBlockDescriptorM)->ulOption &= (~(ulOptionM))#define MBUF_GET_NONZERO_DATA_BLOCK_NUMBER(pstMBufM, ulNonzeroDataBlockNumberM)\{\ MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor;\ \ (ulNonzeroDataBlockNumberM) = 0;\ for(pstDataBlockDescriptor = MBUF_GET_DATA_BLOCK_DESC(pstMBufM);\ pstDataBlockDescriptor != NULL;\ pstDataBlockDescriptor = pstDataBlockDescriptor->pstNextDataBlockDescriptor)\ {\ if(pstDataBlockDescriptor->ulDataLength != 0)\ {\ (ulNonzeroDataBlockNumberM) ++;\ }\ }\} #define MBUF_FAIL ((U32) 1)#define MBUF_OK ((U32) 0)typedef struct tagMBufCommonInfo{ U32 ulReceiveIfnetIndex; U32 ulSendIfnetIndex; U32 ulSendAtIndex; U32 ulChannelCID; U32 ulSlotInfo; U32 ulQueueID; U32 ulPRI; MBUF_USERTAGDATA_S stUserTagData; MBUF_DATABLOCKDESCRIPTOR_S stDataBlockDescriptor;}MBUF_S;MBUF_S * mbuf_create_and_copy_buf(U32 ulReserveHeadSpace, U32 ulLength, U8 * pucBuffer, U32 ulType, U32 mpe);MBUF_S * mbuf_create(U32 ulReserveHeadSpace, U32 ulLength, U32 ulType, U32 mpe);U32 mbuf_destroy(MBUF_S * pstMBuf);U32 mbuf_copy_from_buff(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength, U8 * pucBuffer, U32 mpe);U32 mbuf_copy_to_buff(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength, U8 * pucBuffer);MBUF_S * mbuf_reference_copy(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength, U32 mpe);MBUF_S * mbuf_raw_copy(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength, U32 ulReserveHeadSpace, U32 mpe);U32 mbuf_concatenate(MBUF_S * pstDestinationMBuf, MBUF_S * pstSourceMBuf, U32 mpe);MBUF_S * mbuf_fragment(MBUF_S * pstMBuf, U32 ulLength, U32 mpe);U32 mbuf_cut_and_free_head(MBUF_S * pstMBuf, U32 ulLength);U32 mbuf_cut_part(MBUF_S * pstMBuf, U32 ulOffset, U32 ulLength);U32 mbuf_cut_tail(MBUF_S * pstMBuf, U32 ulLength);U8 * mbuf_append(MBUF_S * pstMBuf, U32 ulLength, U32 mpe);U32 mbuf_assign_zero(MBUF_S * pstMBuf);MBUF_S * mbuf_reference_copy_by_dbdes(MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor, U32 ulOffset, U32 ulLength, U32 mpe);MBUF_S * mbuf_raw_copy_by_dbdes(MBUF_DATABLOCKDESCRIPTOR_S * pstDataBlockDescriptor, U32 ulOffset, U32 ulLength, U32 mpe);U32 mbuf_neat_concatenate(MBUF_S * pstDestinationMBuf, MBUF_S * pstSourceMBuf, MBUF_DATABLOCKDESCRIPTOR_S ** ppstLastDataBlockDescriptor, U32 mpe);U32 mbuf_free_zero_db(MBUF_S * pstMBuf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -