/*************************************************************************************************/ /*! * \file wsf_buf.h * * \brief Buffer pool service. * * Copyright (c) 2009-2018 Arm Ltd. All Rights Reserved. * * Copyright (c) 2019-2020 Packetcraft, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*************************************************************************************************/ #ifndef WSF_BUF_H #define WSF_BUF_H #include "wsf_types.h" #ifdef __cplusplus extern "C" { #endif /*! \addtogroup WSF_BUF_API * \{ */ /************************************************************************************************** Configuration **************************************************************************************************/ /*! \brief Check if trying to free a buffer that is already free */ #ifndef WSF_BUF_FREE_CHECK_ASSERT #define WSF_BUF_FREE_CHECK_ASSERT TRUE #endif /*! \brief Assert on best-fit buffer allocation failure */ #ifndef WSF_BUF_ALLOC_BEST_FIT_FAIL_ASSERT #define WSF_BUF_ALLOC_BEST_FIT_FAIL_ASSERT FALSE #endif /*! \brief Assert on buffer allocation failure */ #ifndef WSF_BUF_ALLOC_FAIL_ASSERT #define WSF_BUF_ALLOC_FAIL_ASSERT TRUE #endif /*! \brief Buffer histogram stats */ #ifndef WSF_BUF_STATS_HIST #define WSF_BUF_STATS_HIST FALSE #endif /************************************************************************************************** Macros **************************************************************************************************/ /*! \brief Length of the buffer statistics array */ #define WSF_BUF_STATS_MAX_LEN 128 /*! \brief Max number of pools can allocate */ #define WSF_BUF_STATS_MAX_POOL 32 /*! \brief Failure Codes */ #define WSF_BUF_ALLOC_FAILED 1 #ifndef WSF_BUF_STATS /*! \brief Enable buffer allocation statistics. */ #define WSF_BUF_STATS FALSE #endif /************************************************************************************************** Data Types **************************************************************************************************/ /*! \brief Buffer pool descriptor structure */ typedef struct { uint16_t len; /*!< \brief Length of buffers in pool */ uint8_t num; /*!< \brief Number of buffers in pool */ } wsfBufPoolDesc_t; /*! \brief Pool statistics */ typedef struct { uint16_t bufSize; /*!< \brief Pool buffer size. */ uint8_t numBuf; /*!< \brief Total number of buffers. */ uint8_t numAlloc; /*!< \brief Number of outstanding allocations. */ uint8_t maxAlloc; /*!< \brief High allocation watermark. */ uint16_t maxReqLen; /*!< \brief Maximum requested buffer length. */ } WsfBufPoolStat_t; /*! \brief WSF buffer diagnostics - buffer allocation failure */ typedef struct { uint8_t taskId; /*!< \brief Task handler ID where failure occured */ uint16_t len; /*!< \brief Length of buffer being allocated */ } wsfBufDiagAllocFail_t; /*! \brief WSF buffer diagnostics message */ typedef struct { union { wsfBufDiagAllocFail_t alloc; /*!< \brief Buffer allocation failure */ } param; /*!< \brief Union of diagnostic data types. */ uint8_t type; /*!< \brief Type of error */ } WsfBufDiag_t; /************************************************************************************************** Callback Function Datatypes **************************************************************************************************/ /*************************************************************************************************/ /*! * \brief Callback providing WSF buffer diagnostic messages. * * \param pInfo Diagnostics message. */ /*************************************************************************************************/ typedef void (*WsfBufDiagCback_t)(WsfBufDiag_t *pInfo); /************************************************************************************************** Function Declarations **************************************************************************************************/ /*************************************************************************************************/ /*! * \brief Calculate size required by the buffer pool. * * \param numPools Number of buffer pools. * \param pDesc Array of buffer pool descriptors, one for each pool. * * \return Amount of pBufMem used. */ /*************************************************************************************************/ uint32_t WsfBufCalcSize(uint8_t numPools, wsfBufPoolDesc_t *pDesc); /*************************************************************************************************/ /*! * \brief Initialize the buffer pool service. This function should only be called once * upon system initialization. * * \param numPools Number of buffer pools. * \param pDesc Array of buffer pool descriptors, one for each pool. * * \return Amount of pBufMem used or 0 for failures. */ /*************************************************************************************************/ uint32_t WsfBufInit(uint8_t numPools, wsfBufPoolDesc_t *pDesc); /*************************************************************************************************/ /*! * \brief Allocate a buffer. * * \param len Length of buffer to allocate. * * \return Pointer to allocated buffer or NULL if allocation fails. */ /*************************************************************************************************/ void *WsfBufAlloc(uint16_t len); /*************************************************************************************************/ /*! * \brief Free a buffer. * * \param pBuf Buffer to free. */ /*************************************************************************************************/ void WsfBufFree(void *pBuf); /*************************************************************************************************/ /*! * \brief Diagnostic function to get the buffer allocation statistics. * * \return Buffer allocation statistics array. */ /*************************************************************************************************/ uint8_t *WsfBufGetAllocStats(void); /*************************************************************************************************/ /*! * \brief Diagnostic function to get the number of overflow times for each pool. * * \return Overflow times statistics array */ /*************************************************************************************************/ uint8_t *WsfBufGetPoolOverFlowStats(void); /*************************************************************************************************/ /*! * \brief Get number of pools. * * \return Number of pools. */ /*************************************************************************************************/ uint8_t WsfBufGetNumPool(void); /*************************************************************************************************/ /*! * \brief Get statistics for each pool. * * \param pStat Buffer to store the statistics. * \param numPool Number of pool elements. * * \return Pool statistics. */ /*************************************************************************************************/ void WsfBufGetPoolStats(WsfBufPoolStat_t *pStat, uint8_t numPool); /*************************************************************************************************/ /*! * \brief Called to register the buffer diagnostics callback function. * * \param callback Pointer to the callback function. */ /*************************************************************************************************/ void WsfBufDiagRegister(WsfBufDiagCback_t callback); /*! \} */ /* WSF_BUF_API */ #ifdef __cplusplus }; #endif #endif /* WSF_BUF_H */