From c37f7df44e178c87cbce9e716c7b4aadd02c9ff2 Mon Sep 17 00:00:00 2001 From: Felix Brack Date: Thu, 7 May 2026 15:23:22 +0200 Subject: [PATCH] Add a hook function called on buffer release This patch adds a hook function to FreeRTOS-Plus-TCP to notify the network driver whenever a buffer is released. One could use iptraceNETWORK_BUFFER_RELEASED (what I did at first) but this is not what it was designed for. A network driver allocates a buffer to store incoming frames from the network. Once a frame has been received the buffer is passed to FreeRTOS-Plus-TCP which will consume it and then probably release it or not. For a zero-copy network driver using BufferAllocation_1.c it is helpful or even necessary to get a notification once FreeRTOS-Plus-TCP releases a buffer. The notification can be used for memory management, for instance to re-allocate a new buffer to receive further frames. --- source/include/NetworkBufferManagement.h | 4 ++++ source/portable/BufferManagement/BufferAllocation_1.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/source/include/NetworkBufferManagement.h b/source/include/NetworkBufferManagement.h index c209217c2..977097eab 100644 --- a/source/include/NetworkBufferManagement.h +++ b/source/include/NetworkBufferManagement.h @@ -80,6 +80,10 @@ NetworkBufferDescriptor_t * pxResizeNetworkBufferWithDescriptor( NetworkBufferDe BaseType_t prvIsFreeBuffer( const NetworkBufferDescriptor_t * pxDescr ); #endif +#if ipconfigBUFFER_AND_DESCRIPTOR_RELEASE_HOOK + void vReleaseNetworkBufferAndDescriptorHook( NetworkBufferDescriptor_t * const pxNetworkBuffer ); +#endif + /* *INDENT-OFF* */ #ifdef __cplusplus } /* extern "C" */ diff --git a/source/portable/BufferManagement/BufferAllocation_1.c b/source/portable/BufferManagement/BufferAllocation_1.c index 817bf6f17..2d5e160a2 100644 --- a/source/portable/BufferManagement/BufferAllocation_1.c +++ b/source/portable/BufferManagement/BufferAllocation_1.c @@ -416,6 +416,10 @@ void vReleaseNetworkBufferAndDescriptor( NetworkBufferDescriptor_t * const pxNet prvShowWarnings(); } + #if ( ipconfigBUFFER_AND_DESCRIPTOR_RELEASE_HOOK == 1 ) + vReleaseNetworkBufferAndDescriptorHook( pxNetworkBuffer ); + #endif /* if ( ipconfigBUFFER_AND_DESCRIPTOR_RELEASE_HOOK ) */ + iptraceNETWORK_BUFFER_RELEASED( pxNetworkBuffer ); } }