Merge branch 'threading' into t

remotes/origin/master-1.0.x
Victor Julien 16 years ago
commit 968dc45d27

@ -39,7 +39,9 @@ static int DetectAddressCut(DetectAddressData *, DetectAddressData *, DetectAddr
static int DetectAddressCutNot(DetectAddressData *, DetectAddressData **); static int DetectAddressCutNot(DetectAddressData *, DetectAddressData **);
static int DetectAddressGroupCut(DetectEngineCtx *, DetectAddressGroup *, DetectAddressGroup *, DetectAddressGroup **); static int DetectAddressGroupCut(DetectEngineCtx *, DetectAddressGroup *, DetectAddressGroup *, DetectAddressGroup **);
/* memory usage counters */ /** memory usage counters
* \todo not MT safe */
#ifdef DEBUG
static uint32_t detect_address_group_memory = 0; static uint32_t detect_address_group_memory = 0;
static uint32_t detect_address_group_init_cnt = 0; static uint32_t detect_address_group_init_cnt = 0;
static uint32_t detect_address_group_free_cnt = 0; static uint32_t detect_address_group_free_cnt = 0;
@ -51,6 +53,7 @@ static uint32_t detect_address_group_head_free_cnt = 0;
static uint32_t detect_address_memory = 0; static uint32_t detect_address_memory = 0;
static uint32_t detect_address_init_cnt = 0; static uint32_t detect_address_init_cnt = 0;
static uint32_t detect_address_free_cnt = 0; static uint32_t detect_address_free_cnt = 0;
#endif
DetectAddressGroup *DetectAddressGroupInit(void) { DetectAddressGroup *DetectAddressGroupInit(void) {
DetectAddressGroup *ag = malloc(sizeof(DetectAddressGroup)); DetectAddressGroup *ag = malloc(sizeof(DetectAddressGroup));
@ -58,10 +61,10 @@ DetectAddressGroup *DetectAddressGroupInit(void) {
return NULL; return NULL;
} }
memset(ag,0,sizeof(DetectAddressGroup)); memset(ag,0,sizeof(DetectAddressGroup));
#ifdef DEBUG
detect_address_group_memory += sizeof(DetectAddressGroup); detect_address_group_memory += sizeof(DetectAddressGroup);
detect_address_group_init_cnt++; detect_address_group_init_cnt++;
#endif
return ag; return ag;
} }
@ -91,13 +94,15 @@ void DetectAddressGroupFree(DetectAddressGroup *ag) {
} }
ag->port = NULL; ag->port = NULL;
} }
#ifdef DEBUG
detect_address_group_memory -= sizeof(DetectAddressGroup); detect_address_group_memory -= sizeof(DetectAddressGroup);
detect_address_group_free_cnt++; detect_address_group_free_cnt++;
#endif
free(ag); free(ag);
} }
void DetectAddressGroupPrintMemory(void) { void DetectAddressGroupPrintMemory(void) {
#ifdef DEBUG
printf(" * Address group memory stats (DetectAddressGroup %" PRIuMAX "):\n", (uintmax_t)sizeof(DetectAddressGroup)); printf(" * Address group memory stats (DetectAddressGroup %" PRIuMAX "):\n", (uintmax_t)sizeof(DetectAddressGroup));
printf(" - detect_address_group_memory %" PRIu32 "\n", detect_address_group_memory); printf(" - detect_address_group_memory %" PRIu32 "\n", detect_address_group_memory);
printf(" - detect_address_group_init_cnt %" PRIu32 "\n", detect_address_group_init_cnt); printf(" - detect_address_group_init_cnt %" PRIu32 "\n", detect_address_group_init_cnt);
@ -117,6 +122,7 @@ void DetectAddressGroupPrintMemory(void) {
printf(" - outstanding addresses %" PRIu32 "\n", detect_address_init_cnt - detect_address_free_cnt); printf(" - outstanding addresses %" PRIu32 "\n", detect_address_init_cnt - detect_address_free_cnt);
printf(" * Address memory stats done\n"); printf(" * Address memory stats done\n");
printf(" X Total %" PRIu32 "\n", detect_address_group_memory + detect_address_group_head_memory + detect_address_memory); printf(" X Total %" PRIu32 "\n", detect_address_group_memory + detect_address_group_head_memory + detect_address_memory);
#endif
} }
/* used to see if the exact same address group exists in the list /* used to see if the exact same address group exists in the list
@ -832,10 +838,10 @@ DetectAddressGroupsHead *DetectAddressGroupsHeadInit(void) {
return NULL; return NULL;
} }
memset(gh,0,sizeof(DetectAddressGroupsHead)); memset(gh,0,sizeof(DetectAddressGroupsHead));
#ifdef DEBUG
detect_address_group_head_init_cnt++; detect_address_group_head_init_cnt++;
detect_address_group_head_memory += sizeof(DetectAddressGroupsHead); detect_address_group_head_memory += sizeof(DetectAddressGroupsHead);
#endif
return gh; return gh;
} }
@ -854,9 +860,10 @@ void DetectAddressGroupsHeadFree(DetectAddressGroupsHead *gh) {
if (gh != NULL) { if (gh != NULL) {
DetectAddressGroupsHeadCleanup(gh); DetectAddressGroupsHeadCleanup(gh);
free(gh); free(gh);
#ifdef DEBUG
detect_address_group_head_free_cnt++; detect_address_group_head_free_cnt++;
detect_address_group_head_memory -= sizeof(DetectAddressGroupsHead); detect_address_group_head_memory -= sizeof(DetectAddressGroupsHead);
#endif
} }
} }
@ -1124,10 +1131,10 @@ DetectAddressData *DetectAddressDataInit(void) {
goto error; goto error;
} }
memset(dd,0,sizeof(DetectAddressData)); memset(dd,0,sizeof(DetectAddressData));
#ifdef DEBUG
detect_address_init_cnt++; detect_address_init_cnt++;
detect_address_memory += sizeof(DetectAddressData); detect_address_memory += sizeof(DetectAddressData);
#endif
return dd; return dd;
error: error:
@ -1168,9 +1175,10 @@ int DetectAddressSetup (DetectEngineCtx * de_ctx, Signature *s, SigMatch *m, cha
void DetectAddressDataFree(DetectAddressData *dd) { void DetectAddressDataFree(DetectAddressData *dd) {
if (dd != NULL) { if (dd != NULL) {
free(dd); free(dd);
#ifdef DEBUG
detect_address_free_cnt++; detect_address_free_cnt++;
detect_address_memory -= sizeof(DetectAddressData); detect_address_memory -= sizeof(DetectAddressData);
#endif
} }
} }

@ -1553,7 +1553,6 @@ int main(int argc, char **argv)
AlpDetectRegisterTests(); AlpDetectRegisterTests();
ConfRegisterTests(); ConfRegisterTests();
TmqhFlowRegisterTests(); TmqhFlowRegisterTests();
StreamTcpRegisterTests();
FlowRegisterTests(); FlowRegisterTests();
uint32_t failed = UtRunTests(); uint32_t failed = UtRunTests();
UtCleanup(); UtCleanup();

@ -37,6 +37,7 @@
#include "util-unittest.h" #include "util-unittest.h"
#include "util-print.h" #include "util-print.h"
#include "stream-tcp.h"
#include "stream-tcp-private.h" #include "stream-tcp-private.h"
#include "stream-tcp-reassemble.h" #include "stream-tcp-reassemble.h"
@ -113,7 +114,7 @@ static uint64_t segment_pool_cnt = 0;
/* index to the right pool for all packet sizes. */ /* index to the right pool for all packet sizes. */
static uint16_t segment_pool_idx[65536]; /* O(1) lookups of the pool */ static uint16_t segment_pool_idx[65536]; /* O(1) lookups of the pool */
int StreamTcpReassembleInit(void) { int StreamTcpReassembleInit(char quiet) {
StreamMsgQueuesInit(); StreamMsgQueuesInit();
#ifdef DEBUG #ifdef DEBUG
pthread_mutex_init(&segment_pool_memuse_mutex, NULL); pthread_mutex_init(&segment_pool_memuse_mutex, NULL);
@ -144,13 +145,16 @@ int StreamTcpReassembleInit(void) {
return 0; return 0;
} }
void StreamTcpReassembleFree(void) { void StreamTcpReassembleFree(char quiet) {
uint16_t u16 = 0; uint16_t u16 = 0;
for (u16 = 0; u16 < segment_pool_num; u16++) { for (u16 = 0; u16 < segment_pool_num; u16++) {
PoolPrintSaturation(segment_pool[u16]); if (quiet == FALSE) {
PoolPrintSaturation(segment_pool[u16]);
printf("segment_pool[u16]->empty_list_size %"PRIu32", segment_pool[u16]->alloc_list_size %"PRIu32", alloced %"PRIu32"\n", segment_pool[u16]->empty_list_size, segment_pool[u16]->alloc_list_size, segment_pool[u16]->allocated); printf("segment_pool[u16]->empty_list_size %"PRIu32", segment_pool[u16]->alloc_list_size %"PRIu32", alloced %"PRIu32"\n", segment_pool[u16]->empty_list_size, segment_pool[u16]->alloc_list_size, segment_pool[u16]->allocated);
}
PoolFree(segment_pool[u16]); PoolFree(segment_pool[u16]);
pthread_mutex_destroy(&segment_pool_mutex[u16]);
} }
#ifdef DEBUG #ifdef DEBUG
@ -159,7 +163,7 @@ void StreamTcpReassembleFree(void) {
printf("segment_pool_memcnt %"PRIu64"\n", segment_pool_memcnt); printf("segment_pool_memcnt %"PRIu64"\n", segment_pool_memcnt);
#endif #endif
StreamMsgQueuesDeinit(); StreamMsgQueuesDeinit(quiet);
} }
void PrintList2(TcpSegment *seg) { void PrintList2(TcpSegment *seg) {
@ -1966,15 +1970,19 @@ static int StreamTcpReassembleTest01(void) {
0x4c, 0x4d, 0x4d, 0x4d}; 0x4c, 0x4d, 0x4d, 0x4d};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_BSD; stream.os_policy = OS_POLICY_BSD;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
} }
if (StreamTcpCheckStreamContents(stream_before_bsd,sizeof(stream_before_bsd), &stream) == 0) { if (StreamTcpCheckStreamContents(stream_before_bsd,sizeof(stream_before_bsd), &stream) == 0) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
exit(1);
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -1989,6 +1997,9 @@ static int StreamTcpReassembleTest02(void) {
0x49, 0x51}; 0x49, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_BSD; stream.os_policy = OS_POLICY_BSD;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -1997,6 +2008,7 @@ static int StreamTcpReassembleTest02(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2011,6 +2023,9 @@ static int StreamTcpReassembleTest03(void) {
0x47, 0x47}; 0x47, 0x47};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_BSD; stream.os_policy = OS_POLICY_BSD;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2019,6 +2034,7 @@ static int StreamTcpReassembleTest03(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2034,6 +2050,7 @@ static int StreamTcpReassembleTest04(void) {
0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51}; 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_BSD; stream.os_policy = OS_POLICY_BSD;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2042,6 +2059,7 @@ static int StreamTcpReassembleTest04(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2056,6 +2074,7 @@ static int StreamTcpReassembleTest05(void) {
0x4c, 0x4d, 0x45, 0x45}; 0x4c, 0x4d, 0x45, 0x45};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_VISTA; stream.os_policy = OS_POLICY_VISTA;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2064,6 +2083,7 @@ static int StreamTcpReassembleTest05(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2078,6 +2098,9 @@ static int StreamTcpReassembleTest06(void) {
0x49, 0x51}; 0x49, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_VISTA; stream.os_policy = OS_POLICY_VISTA;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2086,6 +2109,7 @@ static int StreamTcpReassembleTest06(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2100,6 +2124,9 @@ static int StreamTcpReassembleTest07(void) {
0x47, 0x47}; 0x47, 0x47};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_VISTA; stream.os_policy = OS_POLICY_VISTA;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2108,6 +2135,7 @@ static int StreamTcpReassembleTest07(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2123,6 +2151,7 @@ static int StreamTcpReassembleTest08(void) {
0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51}; 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_VISTA; stream.os_policy = OS_POLICY_VISTA;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2131,6 +2160,7 @@ static int StreamTcpReassembleTest08(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2145,6 +2175,7 @@ static int StreamTcpReassembleTest09(void) {
0x4c, 0x4d, 0x4d, 0x4d}; 0x4c, 0x4d, 0x4d, 0x4d};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LINUX; stream.os_policy = OS_POLICY_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2153,6 +2184,7 @@ static int StreamTcpReassembleTest09(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2167,6 +2199,7 @@ static int StreamTcpReassembleTest10(void) {
0x51, 0x51}; 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LINUX; stream.os_policy = OS_POLICY_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2175,6 +2208,7 @@ static int StreamTcpReassembleTest10(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2189,6 +2223,7 @@ static int StreamTcpReassembleTest11(void) {
0x47, 0x47}; 0x47, 0x47};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LINUX; stream.os_policy = OS_POLICY_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2197,6 +2232,7 @@ static int StreamTcpReassembleTest11(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2212,6 +2248,7 @@ static int StreamTcpReassembleTest12(void) {
0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LINUX; stream.os_policy = OS_POLICY_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2220,6 +2257,7 @@ static int StreamTcpReassembleTest12(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2234,6 +2272,7 @@ static int StreamTcpReassembleTest13(void) {
0x4c, 0x4d, 0x4d, 0x4d}; 0x4c, 0x4d, 0x4d, 0x4d};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_OLD_LINUX; stream.os_policy = OS_POLICY_OLD_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2242,6 +2281,7 @@ static int StreamTcpReassembleTest13(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2256,6 +2296,7 @@ static int StreamTcpReassembleTest14(void) {
0x51, 0x51}; 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_OLD_LINUX; stream.os_policy = OS_POLICY_OLD_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2264,6 +2305,7 @@ static int StreamTcpReassembleTest14(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2278,6 +2320,7 @@ static int StreamTcpReassembleTest15(void) {
0x47, 0x47}; 0x47, 0x47};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_OLD_LINUX; stream.os_policy = OS_POLICY_OLD_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2286,6 +2329,7 @@ static int StreamTcpReassembleTest15(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2301,6 +2345,7 @@ static int StreamTcpReassembleTest16(void) {
0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_OLD_LINUX; stream.os_policy = OS_POLICY_OLD_LINUX;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2309,6 +2354,7 @@ static int StreamTcpReassembleTest16(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2323,6 +2369,7 @@ static int StreamTcpReassembleTest17(void) {
0x4c, 0x4d, 0x4d, 0x4d}; 0x4c, 0x4d, 0x4d, 0x4d};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_SOLARIS; stream.os_policy = OS_POLICY_SOLARIS;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2331,6 +2378,7 @@ static int StreamTcpReassembleTest17(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2345,6 +2393,7 @@ static int StreamTcpReassembleTest18(void) {
0x51, 0x51}; 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_SOLARIS; stream.os_policy = OS_POLICY_SOLARIS;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2353,6 +2402,7 @@ static int StreamTcpReassembleTest18(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2367,6 +2417,7 @@ static int StreamTcpReassembleTest19(void) {
0x47, 0x47}; 0x47, 0x47};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_SOLARIS; stream.os_policy = OS_POLICY_SOLARIS;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2375,6 +2426,7 @@ static int StreamTcpReassembleTest19(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2390,6 +2442,7 @@ static int StreamTcpReassembleTest20(void) {
0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_SOLARIS; stream.os_policy = OS_POLICY_SOLARIS;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2398,6 +2451,7 @@ static int StreamTcpReassembleTest20(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2412,6 +2466,7 @@ static int StreamTcpReassembleTest21(void) {
0x4c, 0x4d, 0x4d, 0x4d}; 0x4c, 0x4d, 0x4d, 0x4d};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LAST; stream.os_policy = OS_POLICY_LAST;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2420,6 +2475,7 @@ static int StreamTcpReassembleTest21(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2434,6 +2490,7 @@ static int StreamTcpReassembleTest22(void) {
0x51, 0x51}; 0x51, 0x51};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LAST; stream.os_policy = OS_POLICY_LAST;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
return 0; return 0;
@ -2442,6 +2499,7 @@ static int StreamTcpReassembleTest22(void) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2455,6 +2513,7 @@ static int StreamTcpReassembleTest23(void) {
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LAST; stream.os_policy = OS_POLICY_LAST;
StreamTcpInitConfig(TRUE);
if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { if (StreamTcpTestStartsAfterListSegment(&stream) == 0) {
printf("failed in segments reassembly!!\n"); printf("failed in segments reassembly!!\n");
@ -2462,9 +2521,9 @@ static int StreamTcpReassembleTest23(void) {
} }
if (StreamTcpCheckStreamContents(stream_after_last, sizeof(stream_after_last), &stream) == 0) { if (StreamTcpCheckStreamContents(stream_after_last, sizeof(stream_after_last), &stream) == 0) {
printf("failed in stream matching!!\n"); printf("failed in stream matching!!\n");
exit(1);
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2481,6 +2540,7 @@ static int StreamTcpReassembleTest24(void) {
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
stream.os_policy = OS_POLICY_LAST; stream.os_policy = OS_POLICY_LAST;
StreamTcpInitConfig(TRUE);
if (StreamTcpReassembleStreamTest(&stream) == 0) { if (StreamTcpReassembleStreamTest(&stream) == 0) {
printf("failed in segments reassembly: "); printf("failed in segments reassembly: ");
@ -2490,6 +2550,7 @@ static int StreamTcpReassembleTest24(void) {
printf("failed in stream matching: "); printf("failed in stream matching: ");
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2580,6 +2641,7 @@ static int StreamTcpReassembleTest25 (void) {
flowflags = FLOW_PKT_TOSERVER; flowflags = FLOW_PKT_TOSERVER;
th_flag = TH_ACK|TH_PUSH; th_flag = TH_ACK|TH_PUSH;
ack = 20; ack = 20;
StreamTcpInitConfig(TRUE);
StreamTcpCreateTestPacket(payload, 0x42, 2); /*BB*/ StreamTcpCreateTestPacket(payload, 0x42, 2); /*BB*/
seq = 10; seq = 10;
@ -2607,6 +2669,7 @@ static int StreamTcpReassembleTest25 (void) {
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2630,6 +2693,7 @@ static int StreamTcpReassembleTest26 (void) {
flowflags = FLOW_PKT_TOSERVER; flowflags = FLOW_PKT_TOSERVER;
th_flag = TH_ACK|TH_PUSH; th_flag = TH_ACK|TH_PUSH;
ack = 20; ack = 20;
StreamTcpInitConfig(TRUE);
StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/ StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/
seq = 10; seq = 10;
@ -2658,6 +2722,7 @@ static int StreamTcpReassembleTest26 (void) {
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2681,6 +2746,7 @@ static int StreamTcpReassembleTest27 (void) {
flowflags = FLOW_PKT_TOSERVER; flowflags = FLOW_PKT_TOSERVER;
th_flag = TH_ACK|TH_PUSH; th_flag = TH_ACK|TH_PUSH;
ack = 20; ack = 20;
StreamTcpInitConfig(TRUE);
StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/ StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/
seq = 10; seq = 10;
@ -2708,7 +2774,7 @@ static int StreamTcpReassembleTest27 (void) {
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2732,6 +2798,8 @@ static int StreamTcpReassembleTest28 (void) {
uint8_t check_contents[5] = {0x41, 0x41, 0x42, 0x42, 0x42}; uint8_t check_contents[5] = {0x41, 0x41, 0x42, 0x42, 0x42};
memset(&stream, 0, sizeof (TcpStream)); memset(&stream, 0, sizeof (TcpStream));
StreamTcpInitConfig(TRUE);
flowflags = FLOW_PKT_TOSERVER; flowflags = FLOW_PKT_TOSERVER;
th_flag = TH_ACK|TH_PUSH; th_flag = TH_ACK|TH_PUSH;
th_flags = TH_ACK; th_flags = TH_ACK;
@ -2782,6 +2850,7 @@ static int StreamTcpReassembleTest28 (void) {
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2812,6 +2881,7 @@ static int StreamTcpReassembleTest29 (void) {
stream.last_ack = 22; stream.last_ack = 22;
stream.ra_base_seq = 9; stream.ra_base_seq = 9;
stream.isn = 9; stream.isn = 9;
StreamTcpInitConfig(TRUE);
StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/ StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/
seq = 10; seq = 10;
@ -2855,6 +2925,7 @@ static int StreamTcpReassembleTest29 (void) {
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }
@ -2886,6 +2957,7 @@ static int StreamTcpReassembleTest30 (void) {
stream.ra_base_seq = 9; stream.ra_base_seq = 9;
stream.isn = 9; stream.isn = 9;
StreamTcpInitConfig(TRUE);
StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/ StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/
seq = 10; seq = 10;
ack = 20; ack = 20;
@ -2947,6 +3019,7 @@ static int StreamTcpReassembleTest30 (void) {
return 0; return 0;
} }
StreamTcpFreeConfig(TRUE);
return 1; return 1;
} }

@ -30,8 +30,8 @@ enum
#define OS_POLICY_DEFAULT OS_POLICY_BSD #define OS_POLICY_DEFAULT OS_POLICY_BSD
int StreamTcpReassembleHandleSegment(TcpSession *, TcpStream *, Packet *); int StreamTcpReassembleHandleSegment(TcpSession *, TcpStream *, Packet *);
int StreamTcpReassembleInit(void); int StreamTcpReassembleInit(char);
void StreamTcpReassembleFree(void); void StreamTcpReassembleFree(char);
void StreamTcpReassembleRegisterTests(void); void StreamTcpReassembleRegisterTests(void);
void StreamTcpCreateTestPacket(u_int8_t *, u_int8_t, u_int8_t); void StreamTcpCreateTestPacket(u_int8_t *, u_int8_t, u_int8_t);

@ -61,7 +61,7 @@ int StreamTcpGetFlowState(void *);
#define STREAMTCP_EMERG_EST_TIMEOUT 300 #define STREAMTCP_EMERG_EST_TIMEOUT 300
#define STREAMTCP_EMERG_CLOSED_TIMEOUT 20 #define STREAMTCP_EMERG_CLOSED_TIMEOUT 20
static Pool *ssn_pool; static Pool *ssn_pool = NULL;
static pthread_mutex_t ssn_pool_mutex; static pthread_mutex_t ssn_pool_mutex;
#ifdef DEBUG #ifdef DEBUG
@ -195,6 +195,7 @@ void StreamTcpInitConfig(char quiet) {
printf("Initializing Stream:\n"); printf("Initializing Stream:\n");
memset(&stream_config, 0, sizeof(stream_config)); memset(&stream_config, 0, sizeof(stream_config));
/** set config defaults */ /** set config defaults */
stream_config.max_sessions = STREAMTCP_DEFAULT_SESSIONS; stream_config.max_sessions = STREAMTCP_DEFAULT_SESSIONS;
stream_config.prealloc_sessions = STREAMTCP_DEFAULT_PREALLOC; stream_config.prealloc_sessions = STREAMTCP_DEFAULT_PREALLOC;
@ -207,7 +208,7 @@ void StreamTcpInitConfig(char quiet) {
pthread_mutex_init(&ssn_pool_mutex, NULL); pthread_mutex_init(&ssn_pool_mutex, NULL);
StreamTcpReassembleInit(); StreamTcpReassembleInit(quiet);
/* set the default TCP timeout, free function and flow state function values. */ /* set the default TCP timeout, free function and flow state function values. */
FlowSetProtoTimeout(IPPROTO_TCP, STREAMTCP_NEW_TIMEOUT, STREAMTCP_EST_TIMEOUT, STREAMTCP_CLOSED_TIMEOUT); FlowSetProtoTimeout(IPPROTO_TCP, STREAMTCP_NEW_TIMEOUT, STREAMTCP_EST_TIMEOUT, STREAMTCP_CLOSED_TIMEOUT);
@ -218,12 +219,19 @@ void StreamTcpInitConfig(char quiet) {
} }
void StreamTcpFreeConfig(char quiet) { void StreamTcpFreeConfig(char quiet) {
StreamTcpReassembleFree(); StreamTcpReassembleFree(quiet);
PoolFree(ssn_pool); if (ssn_pool != NULL) {
PoolFree(ssn_pool);
ssn_pool = NULL;
} else {
printf("ERROR: ssn_pool is NULL\n");
exit(1);
}
#ifdef DEBUG #ifdef DEBUG
printf("ssn_pool_cnt %"PRIu64"\n", ssn_pool_cnt); printf("ssn_pool_cnt %"PRIu64"\n", ssn_pool_cnt);
#endif #endif
pthread_mutex_destroy(&ssn_pool_mutex);
} }
/** \brief The function is used to to fetch a TCP session from the /** \brief The function is used to to fetch a TCP session from the
@ -1032,7 +1040,6 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, StreamTcpThre
printf("StreamTcpPacketStateFinWait1 (%p): Reset received state changed to TCP_CLOSED\n", ssn); printf("StreamTcpPacketStateFinWait1 (%p): Reset received state changed to TCP_CLOSED\n", ssn);
#endif #endif
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
//StreamTcpSessionPktFree(p);
} }
else else
return -1; return -1;
@ -1125,7 +1132,6 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, StreamTcpThre
printf("StreamTcpPacketStateFinWait2 (%p): Reset received state changed to TCP_CLOSED\n", ssn); printf("StreamTcpPacketStateFinWait2 (%p): Reset received state changed to TCP_CLOSED\n", ssn);
#endif #endif
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
//StreamTcpSessionPktFree(p);
} }
else else
return -1; return -1;
@ -1429,7 +1435,6 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, StreamTcpThre
printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n", printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n",
ssn, ssn->client.next_seq, ssn->server.last_ack); ssn, ssn->client.next_seq, ssn->server.last_ack);
#endif #endif
//StreamTcpSessionPktFree(p);
} else { } else {
#ifdef DEBUG #ifdef DEBUG
printf("StreamTcpPacketStateTimeWait (%p): pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 ", ACK %" PRIu32 "\n", printf("StreamTcpPacketStateTimeWait (%p): pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 ", ACK %" PRIu32 "\n",
@ -1456,7 +1461,6 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, StreamTcpThre
printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n", printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n",
ssn, ssn->server.next_seq, ssn->client.last_ack); ssn, ssn->server.next_seq, ssn->client.last_ack);
#endif #endif
//StreamTcpSessionPktFree(p);
} }
break; break;
default: default:
@ -1760,30 +1764,35 @@ int StreamTcpGetFlowState(void *s) {
static int StreamTcpTest01 (void) { static int StreamTcpTest01 (void) {
Packet p; Packet p;
Flow f; Flow f;
TcpSession ssn1;
memset (&p, 0, sizeof(Packet)); memset (&p, 0, sizeof(Packet));
memset (&f, 0, sizeof(Flow)); memset (&f, 0, sizeof(Flow));
memset(&ssn1, 0, sizeof (TcpSession));
f.protoctx = &ssn1;
p.flow = &f; p.flow = &f;
int ret = 0;
StreamTcpInitConfig(TRUE); StreamTcpInitConfig(TRUE);
TcpSession *ssn = StreamTcpNewSession(&p); TcpSession *ssn = StreamTcpNewSession(&p);
if (ssn == NULL) { if (ssn == NULL) {
printf("Session can not be allocated \n"); printf("Session can not be allocated \n");
return 0; goto end;
} }
f.protoctx = ssn;
if (ssn->aldata != NULL) { if (ssn->aldata != NULL) {
printf("AppLayer field not set to NULL \n"); printf("AppLayer field not set to NULL \n");
return 0; goto end;
} }
if (ssn->state != 0) { if (ssn->state != 0) {
printf("TCP state field not set to 0 \n"); printf("TCP state field not set to 0 \n");
return 0; goto end;
} }
StreamTcpSessionPktFree(&p); StreamTcpSessionPktFree(&p);
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
/** /**
@ -1797,34 +1806,33 @@ static int StreamTcpTest01 (void) {
static int StreamTcpTest02 (void) { static int StreamTcpTest02 (void) {
Packet p; Packet p;
Flow f; Flow f;
TcpSession ssn;
ThreadVars tv; ThreadVars tv;
StreamTcpThread stt; StreamTcpThread stt;
u_int8_t payload[4]; u_int8_t payload[4];
TCPHdr tcph; TCPHdr tcph;
memset (&p, 0, sizeof(Packet)); memset (&p, 0, sizeof(Packet));
memset (&f, 0, sizeof(Flow)); memset (&f, 0, sizeof(Flow));
memset(&ssn, 0, sizeof (TcpSession));
memset(&tv, 0, sizeof (ThreadVars)); memset(&tv, 0, sizeof (ThreadVars));
memset(&stt, 0, sizeof (StreamTcpThread)); memset(&stt, 0, sizeof (StreamTcpThread));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
f.protoctx = &ssn;
p.flow = &f; p.flow = &f;
tcph.th_win = htons(5480); tcph.th_win = htons(5480);
tcph.th_flags = TH_SYN; tcph.th_flags = TH_SYN;
p.tcph = &tcph; p.tcph = &tcph;
p.flowflags = FLOW_PKT_TOSERVER; p.flowflags = FLOW_PKT_TOSERVER;
int ret = 0;
StreamTcpInitConfig(TRUE);
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_ack = htonl(1); p.tcph->th_ack = htonl(1);
p.tcph->th_flags = TH_SYN | TH_ACK; p.tcph->th_flags = TH_SYN | TH_ACK;
p.flowflags = FLOW_PKT_TOCLIENT; p.flowflags = FLOW_PKT_TOCLIENT;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_ack = htonl(1); p.tcph->th_ack = htonl(1);
p.tcph->th_seq = htonl(1); p.tcph->th_seq = htonl(1);
@ -1832,7 +1840,7 @@ static int StreamTcpTest02 (void) {
p.flowflags = FLOW_PKT_TOSERVER; p.flowflags = FLOW_PKT_TOSERVER;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_ack = htonl(1); p.tcph->th_ack = htonl(1);
p.tcph->th_seq = htonl(2); p.tcph->th_seq = htonl(2);
@ -1844,11 +1852,11 @@ static int StreamTcpTest02 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.flowflags = FLOW_PKT_TOCLIENT; p.flowflags = FLOW_PKT_TOCLIENT;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_ack = htonl(1); p.tcph->th_ack = htonl(1);
p.tcph->th_seq = htonl(6); p.tcph->th_seq = htonl(6);
@ -1860,16 +1868,20 @@ static int StreamTcpTest02 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.flowflags = FLOW_PKT_TOCLIENT; p.flowflags = FLOW_PKT_TOCLIENT;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
StreamTcpSessionPktFree(&p); StreamTcpSessionPktFree(&p);
if (p.flow->protoctx != NULL) if (p.flow->protoctx != NULL)
return 0; goto end;
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
/** /**
@ -1883,27 +1895,27 @@ static int StreamTcpTest02 (void) {
static int StreamTcpTest03 (void) { static int StreamTcpTest03 (void) {
Packet p; Packet p;
Flow f; Flow f;
TcpSession ssn;
ThreadVars tv; ThreadVars tv;
StreamTcpThread stt; StreamTcpThread stt;
TCPHdr tcph; TCPHdr tcph;
memset (&p, 0, sizeof(Packet)); memset (&p, 0, sizeof(Packet));
memset (&f, 0, sizeof(Flow)); memset (&f, 0, sizeof(Flow));
memset(&ssn, 0, sizeof (TcpSession));
memset(&tv, 0, sizeof (ThreadVars)); memset(&tv, 0, sizeof (ThreadVars));
memset(&stt, 0, sizeof (StreamTcpThread)); memset(&stt, 0, sizeof (StreamTcpThread));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
f.protoctx = &ssn;
p.flow = &f; p.flow = &f;
StreamTcpInitConfig(TRUE);
tcph.th_win = htons(5480); tcph.th_win = htons(5480);
tcph.th_seq = htonl(10); tcph.th_seq = htonl(10);
tcph.th_ack = htonl(20); tcph.th_ack = htonl(20);
tcph.th_flags = TH_SYN|TH_ACK; tcph.th_flags = TH_SYN|TH_ACK;
p.tcph = &tcph; p.tcph = &tcph;
int ret = 0;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(20); p.tcph->th_seq = htonl(20);
p.tcph->th_ack = htonl(11); p.tcph->th_ack = htonl(11);
@ -1911,7 +1923,7 @@ static int StreamTcpTest03 (void) {
p.flowflags = FLOW_PKT_TOSERVER; p.flowflags = FLOW_PKT_TOSERVER;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(19); p.tcph->th_seq = htonl(19);
p.tcph->th_ack = htonl(11); p.tcph->th_ack = htonl(11);
@ -1919,19 +1931,25 @@ static int StreamTcpTest03 (void) {
p.flowflags = FLOW_PKT_TOSERVER; p.flowflags = FLOW_PKT_TOSERVER;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
if (stream_config.midstream != TRUE) if (stream_config.midstream != TRUE) {
return 1; ret = 1;
goto end;
}
if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED)
return 0; goto end;
if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 20 || if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 20 ||
((TcpSession *)(p.flow->protoctx))->server.next_seq != 11) ((TcpSession *)(p.flow->protoctx))->server.next_seq != 11)
return 0; goto end;
StreamTcpSessionPktFree(&p); StreamTcpSessionPktFree(&p);
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
/** /**
@ -1945,27 +1963,28 @@ static int StreamTcpTest03 (void) {
static int StreamTcpTest04 (void) { static int StreamTcpTest04 (void) {
Packet p; Packet p;
Flow f; Flow f;
TcpSession ssn;
ThreadVars tv; ThreadVars tv;
StreamTcpThread stt; StreamTcpThread stt;
TCPHdr tcph; TCPHdr tcph;
memset (&p, 0, sizeof(Packet)); memset (&p, 0, sizeof(Packet));
memset (&f, 0, sizeof(Flow)); memset (&f, 0, sizeof(Flow));
memset(&ssn, 0, sizeof (TcpSession));
memset(&tv, 0, sizeof (ThreadVars)); memset(&tv, 0, sizeof (ThreadVars));
memset(&stt, 0, sizeof (StreamTcpThread)); memset(&stt, 0, sizeof (StreamTcpThread));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
f.protoctx = &ssn;
p.flow = &f; p.flow = &f;
StreamTcpInitConfig(TRUE);
tcph.th_win = htons(5480); tcph.th_win = htons(5480);
tcph.th_seq = htonl(10); tcph.th_seq = htonl(10);
tcph.th_ack = htonl(20); tcph.th_ack = htonl(20);
tcph.th_flags = TH_ACK; tcph.th_flags = TH_ACK;
p.tcph = &tcph; p.tcph = &tcph;
int ret = 0;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(9); p.tcph->th_seq = htonl(9);
p.tcph->th_ack = htonl(19); p.tcph->th_ack = htonl(19);
@ -1973,19 +1992,25 @@ static int StreamTcpTest04 (void) {
p.flowflags = FLOW_PKT_TOSERVER; p.flowflags = FLOW_PKT_TOSERVER;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
if (stream_config.midstream != TRUE) if (stream_config.midstream != TRUE) {
return 1; ret = 1;
goto end;
}
if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED)
return 0; goto end;
if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 10 || if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 10 ||
((TcpSession *)(p.flow->protoctx))->server.next_seq != 20) ((TcpSession *)(p.flow->protoctx))->server.next_seq != 20)
return 0; goto end;
StreamTcpSessionPktFree(&p); StreamTcpSessionPktFree(&p);
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
/** /**
@ -1999,19 +2024,19 @@ static int StreamTcpTest04 (void) {
static int StreamTcpTest05 (void) { static int StreamTcpTest05 (void) {
Packet p; Packet p;
Flow f; Flow f;
TcpSession ssn;
ThreadVars tv; ThreadVars tv;
StreamTcpThread stt; StreamTcpThread stt;
TCPHdr tcph; TCPHdr tcph;
u_int8_t payload[4]; u_int8_t payload[4];
memset (&p, 0, sizeof(Packet)); memset (&p, 0, sizeof(Packet));
memset (&f, 0, sizeof(Flow)); memset (&f, 0, sizeof(Flow));
memset(&ssn, 0, sizeof (TcpSession));
memset(&tv, 0, sizeof (ThreadVars)); memset(&tv, 0, sizeof (ThreadVars));
memset(&stt, 0, sizeof (StreamTcpThread)); memset(&stt, 0, sizeof (StreamTcpThread));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
f.protoctx = &ssn;
p.flow = &f; p.flow = &f;
int ret = 0;
StreamTcpInitConfig(TRUE);
/* prevent L7 from kicking in */ /* prevent L7 from kicking in */
StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOSERVER, 4096);
@ -2030,7 +2055,7 @@ static int StreamTcpTest05 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(20); p.tcph->th_seq = htonl(20);
p.tcph->th_ack = htonl(13); p.tcph->th_ack = htonl(13);
@ -2042,7 +2067,7 @@ static int StreamTcpTest05 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(13); p.tcph->th_seq = htonl(13);
p.tcph->th_ack = htonl(23); p.tcph->th_ack = htonl(23);
@ -2054,7 +2079,7 @@ static int StreamTcpTest05 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
p.tcph->th_seq = htonl(19); p.tcph->th_seq = htonl(19);
p.tcph->th_ack = htonl(16); p.tcph->th_ack = htonl(16);
@ -2066,18 +2091,25 @@ static int StreamTcpTest05 (void) {
p.payload_len = 3; p.payload_len = 3;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
if (stream_config.midstream != TRUE) if (stream_config.midstream != TRUE) {
return 1; ret = 1;
goto end;
}
if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED)
return 0; goto end;
if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 16 || if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 16 ||
((TcpSession *)(p.flow->protoctx))->server.next_seq != 23) ((TcpSession *)(p.flow->protoctx))->server.next_seq != 23)
return 0; goto end;
StreamTcpSessionPktFree(&p); StreamTcpSessionPktFree(&p);
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
/** /**
@ -2102,23 +2134,30 @@ static int StreamTcpTest06 (void) {
memset(&stt, 0, sizeof (StreamTcpThread)); memset(&stt, 0, sizeof (StreamTcpThread));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
p.flow = &f; p.flow = &f;
int ret = 0;
StreamTcpInitConfig(TRUE);
tcph.th_flags = TH_FIN; tcph.th_flags = TH_FIN;
p.tcph = &tcph; p.tcph = &tcph;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
if (((TcpSession *)(p.flow->protoctx)) != NULL) if (((TcpSession *)(p.flow->protoctx)) != NULL)
return 0; goto end;
p.tcph->th_flags = TH_RST; p.tcph->th_flags = TH_RST;
if (StreamTcpPacket(&tv, &p, &stt) == -1) if (StreamTcpPacket(&tv, &p, &stt) == -1)
return 0; goto end;
if (((TcpSession *)(p.flow->protoctx)) != NULL) if (((TcpSession *)(p.flow->protoctx)) != NULL)
return 0; goto end;
return 1;
ret = 1;
end:
StreamTcpFreeConfig(TRUE);
return ret;
} }
#endif /* UNITTESTS */ #endif /* UNITTESTS */

@ -144,19 +144,20 @@ void StreamMsgPutInQueue(StreamMsg *s)
} }
void StreamMsgQueuesInit(void) { void StreamMsgQueuesInit(void) {
pthread_mutex_init(&stream_pool_memuse_mutex, NULL);
memset(&stream_q, 0, sizeof(stream_q)); memset(&stream_q, 0, sizeof(stream_q));
stream_msg_pool = PoolInit(5000,250,StreamMsgAlloc,NULL,StreamMsgFree); stream_msg_pool = PoolInit(5000,250,StreamMsgAlloc,NULL,StreamMsgFree);
if (stream_msg_pool == NULL) if (stream_msg_pool == NULL)
exit(1); /* XXX */ exit(1); /* XXX */
pthread_mutex_init(&stream_pool_memuse_mutex, NULL);
} }
void StreamMsgQueuesDeinit(void) { void StreamMsgQueuesDeinit(char quiet) {
PoolFree(stream_msg_pool); PoolFree(stream_msg_pool);
pthread_mutex_destroy(&stream_pool_memuse_mutex);
printf("StreamMsgQueuesDeinit: stream_pool_memuse %"PRIu64", stream_pool_memcnt %"PRIu64"\n", stream_pool_memuse, stream_pool_memcnt); if (quiet == FALSE)
printf("StreamMsgQueuesDeinit: stream_pool_memuse %"PRIu64", stream_pool_memcnt %"PRIu64"\n", stream_pool_memuse, stream_pool_memcnt);
} }
StreamMsgQueue *StreamMsgQueueGetByPort(uint16_t port) { StreamMsgQueue *StreamMsgQueueGetByPort(uint16_t port) {

@ -49,7 +49,7 @@ typedef struct StreamMsgQueue_ {
/* prototypes */ /* prototypes */
void StreamMsgQueuesInit(void); void StreamMsgQueuesInit(void);
void StreamMsgQueuesDeinit(void); void StreamMsgQueuesDeinit(char);
StreamMsg *StreamMsgGetFromPool(void); StreamMsg *StreamMsgGetFromPool(void);
void StreamMsgReturnToPool(StreamMsg *); void StreamMsgReturnToPool(StreamMsg *);

@ -81,6 +81,7 @@ void PoolFree(Pool *p) {
PoolBucket *pb = p->alloc_list; PoolBucket *pb = p->alloc_list;
p->alloc_list = pb->next; p->alloc_list = pb->next;
p->Free(pb->data); p->Free(pb->data);
pb->data = NULL;
free(pb); free(pb);
} }

Loading…
Cancel
Save