X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FIPStack%2Fbuffer.c;h=3fe8b895c072bbe591574ed69c26e4cc3b6c8312;hb=c1b33e91984102c1aa9a2ffe19f02c315b481726;hp=0048420ee736e2be8d98bae33e2aa863319b4724;hpb=d0b4559f2936f6d9f06be0f7c3c51527a480ec0d;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/buffer.c b/KernelLand/Modules/IPStack/buffer.c index 0048420e..3fe8b895 100644 --- a/KernelLand/Modules/IPStack/buffer.c +++ b/KernelLand/Modules/IPStack/buffer.c @@ -5,6 +5,7 @@ * buffer.c * - Scatter-gather handling */ +#define DEBUG 0 #include "ipstack.h" #include "include/buffer.h" @@ -14,6 +15,8 @@ struct sIPStackBuffer int MaxSubBufffers; int nSubBuffers; size_t TotalLength; + tMutex lBufferLock; + struct _subbuffer { const void *Data; @@ -21,7 +24,6 @@ struct sIPStackBuffer size_t PostLength; tIPStackBufferCb Cb; void *CbArg; - // TODO: Callbacks? } SubBuffers[]; }; @@ -31,15 +33,19 @@ tIPStackBuffer *IPStack_Buffer_CreateBuffer(int MaxBuffers) tIPStackBuffer *ret; ret = malloc( sizeof(*ret) + MaxBuffers * sizeof(ret->SubBuffers[0]) ); + ASSERTR(ret, NULL); ret->MaxSubBufffers = MaxBuffers; ret->nSubBuffers = 0; ret->TotalLength = 0; + memset(&ret->lBufferLock, 0, sizeof(ret->lBufferLock)); memset(ret->SubBuffers, 0, MaxBuffers * sizeof(ret->SubBuffers[0])); return ret; } void IPStack_Buffer_ClearBuffer(tIPStackBuffer *Buffer) { + ASSERT(Buffer); + IPStack_Buffer_LockBuffer(Buffer); for( int i = 0; i < Buffer->nSubBuffers; i ++ ) { if( Buffer->SubBuffers[i].Cb == NULL ) @@ -51,22 +57,36 @@ void IPStack_Buffer_ClearBuffer(tIPStackBuffer *Buffer) Buffer->SubBuffers[i].Data ); } - // TODO: Fire callbacks? Buffer->nSubBuffers = 0; + IPStack_Buffer_UnlockBuffer(Buffer); } void IPStack_Buffer_DestroyBuffer(tIPStackBuffer *Buffer) { + LOG("Called with %p by %p", Buffer, __builtin_return_address(0)); + ASSERT(Buffer); IPStack_Buffer_ClearBuffer(Buffer); Buffer->MaxSubBufffers = 0; free(Buffer); } +void IPStack_Buffer_LockBuffer(tIPStackBuffer *Buffer) +{ + ASSERT(Buffer); + Mutex_Acquire(&Buffer->lBufferLock); +} +void IPStack_Buffer_UnlockBuffer(tIPStackBuffer *Buffer) +{ + ASSERT(Buffer); + Mutex_Release(&Buffer->lBufferLock); +} + void IPStack_Buffer_AppendSubBuffer(tIPStackBuffer *Buffer, size_t HeaderLen, size_t FooterLen, const void *Data, tIPStackBufferCb Cb, void *Arg ) { + ASSERT(Buffer); if( Buffer->nSubBuffers == Buffer->MaxSubBufffers ) { // Ah, oops? Log_Error("IPStack", "Buffer %p only had %i sub-buffers allocated, which was not enough", @@ -86,11 +106,13 @@ void IPStack_Buffer_AppendSubBuffer(tIPStackBuffer *Buffer, size_t IPStack_Buffer_GetLength(tIPStackBuffer *Buffer) { + ASSERT(Buffer); return Buffer->TotalLength; } size_t IPStack_Buffer_GetData(tIPStackBuffer *Buffer, void *Dest, size_t MaxBytes) { + ASSERT(Buffer); Uint8 *dest = Dest; size_t rem_space = MaxBytes; size_t len; @@ -98,6 +120,13 @@ size_t IPStack_Buffer_GetData(tIPStackBuffer *Buffer, void *Dest, size_t MaxByte for( int i = Buffer->nSubBuffers; i -- && rem_space != 0; ) { len = MIN(Buffer->SubBuffers[i].PreLength, rem_space); + #if !DISABLE_ASSERTS + if( !CheckMem(Buffer->SubBuffers[i].Data, len) ) { + Log_Error("IPStack", "Buffer pre %i invalid (%p+0x%x)", + i, Buffer->SubBuffers[i].Data, len); + return 0; + } + #endif memcpy(dest, Buffer->SubBuffers[i].Data, len @@ -111,10 +140,9 @@ size_t IPStack_Buffer_GetData(tIPStackBuffer *Buffer, void *Dest, size_t MaxByte continue ; len = MIN(Buffer->SubBuffers[i].PostLength, rem_space); - memcpy(dest, - (Uint8*)Buffer->SubBuffers[i].Data + Buffer->SubBuffers[i].PreLength, - len - ); + void *ptr = (Uint8*)Buffer->SubBuffers[i].Data + Buffer->SubBuffers[i].PreLength; + ASSERT( CheckMem(ptr, len) ); + memcpy(dest, ptr, len); dest += len; rem_space -= len; } @@ -124,9 +152,8 @@ size_t IPStack_Buffer_GetData(tIPStackBuffer *Buffer, void *Dest, size_t MaxByte void *IPStack_Buffer_CompactBuffer(tIPStackBuffer *Buffer, size_t *Length) { - void *ret; - - ret = malloc(Buffer->TotalLength); + ASSERT(Buffer); + void *ret = malloc(Buffer->TotalLength); if(!ret) { *Length = 0; return NULL; @@ -141,6 +168,7 @@ void *IPStack_Buffer_CompactBuffer(tIPStackBuffer *Buffer, size_t *Length) int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, const void **DataPtr) { + ASSERT(Buffer); if( Index == -1 ) Index = 0; if( Index >= Buffer->nSubBuffers*2 ) { @@ -159,8 +187,10 @@ int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, return -1; } - *DataPtr = (Uint8*)Buffer->SubBuffers[Index].Data + Buffer->SubBuffers[Index].PreLength; - *Length = Buffer->SubBuffers[Index].PostLength; + if( DataPtr ) + *DataPtr = (Uint8*)Buffer->SubBuffers[Index].Data + Buffer->SubBuffers[Index].PreLength; + if( Length ) + *Length = Buffer->SubBuffers[Index].PostLength; return (Index + 1) + Buffer->nSubBuffers; } @@ -169,8 +199,10 @@ int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, int rv = Index + 1; Index = Buffer->nSubBuffers - Index - 1; // Prepended buffers - *DataPtr = Buffer->SubBuffers[Index].Data; - *Length = Buffer->SubBuffers[Index].PreLength; + if( DataPtr ) + *DataPtr = Buffer->SubBuffers[Index].Data; + if( Length ) + *Length = Buffer->SubBuffers[Index].PreLength; return rv; } }