git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git]
/
KernelLand
/
Modules
/
IPStack
/
buffer.c
diff --git
a/KernelLand/Modules/IPStack/buffer.c
b/KernelLand/Modules/IPStack/buffer.c
index
b8462e6
..
3fe8b89
100644
(file)
--- a/
KernelLand/Modules/IPStack/buffer.c
+++ b/
KernelLand/Modules/IPStack/buffer.c
@@
-5,6
+5,7
@@
* buffer.c
* - Scatter-gather handling
*/
* buffer.c
* - Scatter-gather handling
*/
+#define DEBUG 0
#include "ipstack.h"
#include "include/buffer.h"
#include "ipstack.h"
#include "include/buffer.h"
@@
-14,6
+15,8
@@
struct sIPStackBuffer
int MaxSubBufffers;
int nSubBuffers;
size_t TotalLength;
int MaxSubBufffers;
int nSubBuffers;
size_t TotalLength;
+ tMutex lBufferLock;
+
struct _subbuffer
{
const void *Data;
struct _subbuffer
{
const void *Data;
@@
-21,7
+24,6
@@
struct sIPStackBuffer
size_t PostLength;
tIPStackBufferCb Cb;
void *CbArg;
size_t PostLength;
tIPStackBufferCb Cb;
void *CbArg;
- // TODO: Callbacks?
} SubBuffers[];
};
} SubBuffers[];
};
@@
-31,15
+33,19
@@
tIPStackBuffer *IPStack_Buffer_CreateBuffer(int MaxBuffers)
tIPStackBuffer *ret;
ret = malloc( sizeof(*ret) + MaxBuffers * sizeof(ret->SubBuffers[0]) );
tIPStackBuffer *ret;
ret = malloc( sizeof(*ret) + MaxBuffers * sizeof(ret->SubBuffers[0]) );
+ ASSERTR(ret, NULL);
ret->MaxSubBufffers = MaxBuffers;
ret->nSubBuffers = 0;
ret->TotalLength = 0;
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)
{
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 )
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
);
}
Buffer->SubBuffers[i].Data
);
}
- // TODO: Fire callbacks?
Buffer->nSubBuffers = 0;
Buffer->nSubBuffers = 0;
+ IPStack_Buffer_UnlockBuffer(Buffer);
}
void IPStack_Buffer_DestroyBuffer(tIPStackBuffer *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);
}
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
)
{
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",
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)
{
size_t IPStack_Buffer_GetLength(tIPStackBuffer *Buffer)
{
+ ASSERT(Buffer);
return Buffer->TotalLength;
}
size_t IPStack_Buffer_GetData(tIPStackBuffer *Buffer, void *Dest, size_t MaxBytes)
{
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;
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);
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
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);
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;
}
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 *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;
if(!ret) {
*Length = 0;
return NULL;
@@
-141,13
+168,14
@@
void *IPStack_Buffer_CompactBuffer(tIPStackBuffer *Buffer, size_t *Length)
int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, const void **DataPtr)
{
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 ) {
return -1;
}
if( Index == -1 ) Index = 0;
if( Index >= Buffer->nSubBuffers*2 ) {
return -1;
}
- if( Index > Buffer->nSubBuffers )
+ if( Index >
=
Buffer->nSubBuffers )
{
// Appended buffers
Index -= Buffer->nSubBuffers;
{
// Appended buffers
Index -= Buffer->nSubBuffers;
@@
-159,18
+187,23
@@
int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length,
return -1;
}
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;
}
else
{
return (Index + 1) + Buffer->nSubBuffers;
}
else
{
- Index = Buffer->nSubBuffers - Index;
+ int rv = Index + 1;
+ Index = Buffer->nSubBuffers - Index - 1;
// Prepended buffers
// Prepended buffers
- *DataPtr = Buffer->SubBuffers[Index].Data;
- *Length = Buffer->SubBuffers[Index].PreLength;
- return Buffer->nSubBuffers - (Index - 1);
+ if( DataPtr )
+ *DataPtr = Buffer->SubBuffers[Index].Data;
+ if( Length )
+ *Length = Buffer->SubBuffers[Index].PreLength;
+ return rv;
}
}
}
}
UCC
git Repository :: git.ucc.asn.au