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