📄 ssp_mbuf.c
字号:
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 + -