aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/suricata/src/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/suricata/src/stream.c')
-rw-r--r--framework/src/suricata/src/stream.c290
1 files changed, 0 insertions, 290 deletions
diff --git a/framework/src/suricata/src/stream.c b/framework/src/suricata/src/stream.c
deleted file mode 100644
index 8aabd6dc..00000000
--- a/framework/src/suricata/src/stream.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/* Copyright (C) 2007-2013 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- *
- * Stream Chunk Handling API
- */
-
-#include "suricata-common.h"
-#include "decode.h"
-#include "threads.h"
-#include "stream.h"
-#include "util-pool.h"
-#include "util-debug.h"
-#include "stream-tcp.h"
-#include "flow-util.h"
-
-#ifdef DEBUG
-static SCMutex stream_pool_memuse_mutex;
-static uint64_t stream_pool_memuse = 0;
-static uint64_t stream_pool_memcnt = 0;
-#endif
-
-/* per queue setting */
-static uint16_t toserver_min_chunk_len = 2560;
-static uint16_t toclient_min_chunk_len = 2560;
-
-static Pool *stream_msg_pool = NULL;
-static SCMutex stream_msg_pool_mutex = SCMUTEX_INITIALIZER;
-
-static void StreamMsgEnqueue (StreamMsgQueue *q, StreamMsg *s)
-{
- SCEnter();
- SCLogDebug("s %p", s);
- /* more packets in queue */
- if (q->top != NULL) {
- s->next = q->top;
- q->top->prev = s;
- q->top = s;
- /* only packet */
- } else {
- q->top = s;
- q->bot = s;
- }
- q->len++;
-#ifdef DBG_PERF
- if (q->len > q->dbg_maxlen)
- q->dbg_maxlen = q->len;
-#endif /* DBG_PERF */
- SCReturn;
-}
-
-static StreamMsg *StreamMsgDequeue (StreamMsgQueue *q)
-{
- SCEnter();
-
- /* if the queue is empty there are no packets left.
- * In that case we sleep and try again. */
- if (q->len == 0) {
- SCReturnPtr(NULL, "StreamMsg");
- }
-
- /* pull the bottom packet from the queue */
- StreamMsg *s = q->bot;
-
- /* more packets in queue */
- if (q->bot->prev != NULL) {
- q->bot = q->bot->prev;
- q->bot->next = NULL;
- /* just the one we remove, so now empty */
- } else {
- q->top = NULL;
- q->bot = NULL;
- }
- q->len--;
-
- s->next = NULL;
- s->prev = NULL;
- SCReturnPtr(s, "StreamMsg");
-}
-
-/* Used by stream reassembler to get msgs */
-StreamMsg *StreamMsgGetFromPool(void)
-{
- SCMutexLock(&stream_msg_pool_mutex);
- StreamMsg *s = (StreamMsg *)PoolGet(stream_msg_pool);
- SCMutexUnlock(&stream_msg_pool_mutex);
- return s;
-}
-
-/* Used by l7inspection to return msgs to pool */
-void StreamMsgReturnToPool(StreamMsg *s)
-{
- SCLogDebug("s %p", s);
- SCMutexLock(&stream_msg_pool_mutex);
- PoolReturn(stream_msg_pool, (void *)s);
- SCMutexUnlock(&stream_msg_pool_mutex);
-}
-
-/* Used by l7inspection to get msgs with data */
-StreamMsg *StreamMsgGetFromQueue(StreamMsgQueue *q)
-{
- if (q->len > 0) {
- StreamMsg *s = StreamMsgDequeue(q);
- return s;
- } else {
- /* return NULL if we have no stream msg. Should only happen on signals. */
- return NULL;
- }
-}
-
-/* Used by stream reassembler to fill the queue for l7inspect reading */
-void StreamMsgPutInQueue(StreamMsgQueue *q, StreamMsg *s)
-{
- StreamMsgEnqueue(q, s);
- SCLogDebug("q->len %" PRIu32 "", q->len);
-}
-
-#define SIZE 4072
-void *StreamMsgPoolAlloc(void)
-{
- if (StreamTcpReassembleCheckMemcap((uint32_t)(sizeof(StreamMsg)+SIZE)) == 0)
- return NULL;
-
- StreamMsg *m = SCCalloc(1, (sizeof(StreamMsg) + SIZE));
- if (m != NULL) {
- m->data = (uint8_t *)m + sizeof(StreamMsg);
- m->data_size = SIZE;
-
- StreamTcpReassembleIncrMemuse((uint32_t)(sizeof(StreamMsg)+SIZE));
- }
-
- return m;
-}
-
-int StreamMsgInit(void *data, void *initdata)
-{
- StreamMsg *s = data;
- memset(s->data, 0, s->data_size);
-
-#ifdef DEBUG
- SCMutexLock(&stream_pool_memuse_mutex);
- stream_pool_memuse += (sizeof(StreamMsg) + SIZE);
- stream_pool_memcnt ++;
- SCMutexUnlock(&stream_pool_memuse_mutex);
-#endif
- return 1;
-}
-
-void StreamMsgPoolFree(void *ptr)
-{
- if (ptr) {
- SCFree(ptr);
- StreamTcpReassembleDecrMemuse((uint32_t)(sizeof(StreamMsg)+SIZE));
- }
-}
-
-void StreamMsgQueuesInit(uint32_t prealloc)
-{
-#ifdef DEBUG
- SCMutexInit(&stream_pool_memuse_mutex, NULL);
-#endif
- SCMutexLock(&stream_msg_pool_mutex);
- stream_msg_pool = PoolInit(0, prealloc, 0,
- StreamMsgPoolAlloc,StreamMsgInit,
- NULL,NULL,StreamMsgPoolFree);
- if (stream_msg_pool == NULL)
- exit(EXIT_FAILURE); /* XXX */
- SCMutexUnlock(&stream_msg_pool_mutex);
-}
-
-void StreamMsgQueuesDeinit(char quiet)
-{
- if (quiet == FALSE) {
- if (stream_msg_pool->max_outstanding > stream_msg_pool->allocated)
- SCLogInfo("TCP segment chunk pool had a peak use of %u chunks, "
- "more than the prealloc setting of %u",
- stream_msg_pool->max_outstanding, stream_msg_pool->allocated);
- }
-
- SCMutexLock(&stream_msg_pool_mutex);
- PoolFree(stream_msg_pool);
- SCMutexUnlock(&stream_msg_pool_mutex);
-
-#ifdef DEBUG
- SCMutexDestroy(&stream_pool_memuse_mutex);
-
- if (quiet == FALSE)
- SCLogDebug("stream_pool_memuse %"PRIu64", stream_pool_memcnt %"PRIu64"", stream_pool_memuse, stream_pool_memcnt);
-#endif
-}
-
-/** \brief alloc a stream msg queue
- * \retval smq ptr to the queue or NULL */
-StreamMsgQueue *StreamMsgQueueGetNew(void)
-{
- if (StreamTcpReassembleCheckMemcap((uint32_t)sizeof(StreamMsgQueue)) == 0)
- return NULL;
-
- StreamMsgQueue *smq = SCMalloc(sizeof(StreamMsgQueue));
- if (unlikely(smq == NULL))
- return NULL;
-
- StreamTcpReassembleIncrMemuse((uint32_t)sizeof(StreamMsgQueue));
-
- memset(smq, 0x00, sizeof(StreamMsgQueue));
- return smq;
-}
-
-/** \brief Free a StreamMsgQueue
- * \param q the queue to free
- * \todo we may want to consider non empty queue's
- */
-void StreamMsgQueueFree(StreamMsgQueue *q)
-{
- SCFree(q);
- StreamTcpReassembleDecrMemuse((uint32_t)sizeof(StreamMsgQueue));
-}
-
-void StreamMsgQueueSetMinChunkLen(uint8_t dir, uint16_t len)
-{
- if (dir == FLOW_PKT_TOSERVER) {
- toserver_min_chunk_len = len;
- } else {
- toclient_min_chunk_len = len;
- }
-}
-
-uint16_t StreamMsgQueueGetMinChunkLen(uint8_t dir)
-{
- if (dir == FLOW_PKT_TOSERVER) {
- return toserver_min_chunk_len;
- } else {
- return toclient_min_chunk_len;
- }
-}
-
-/** \brief Return a list of smsgs to the pool */
-void StreamMsgReturnListToPool(void *list)
-{
- /* if we have (a) smsg(s), return to the pool */
- StreamMsg *smsg = (StreamMsg *)list;
- while (smsg != NULL) {
- StreamMsg *smsg_next = smsg->next;
- SCLogDebug("returning smsg %p to pool", smsg);
- smsg->next = NULL;
- smsg->prev = NULL;
- StreamMsgReturnToPool(smsg);
- smsg = smsg_next;
- }
-}
-
-/** \brief Run callback for all segments
- *
- * \return -1 in case of error, the number of segment in case of success
- */
-int StreamSegmentForEach(const Packet *p, uint8_t flag, StreamSegmentCallback CallbackFunc, void *data)
-{
- switch(p->proto) {
- case IPPROTO_TCP:
- return StreamTcpSegmentForEach(p, flag, CallbackFunc, data);
- break;
-#ifdef DEBUG
- case IPPROTO_UDP:
- SCLogWarning(SC_ERR_UNKNOWN_PROTOCOL, "UDP is currently unsupported");
- break;
- default:
- SCLogWarning(SC_ERR_UNKNOWN_PROTOCOL, "This protocol is currently unsupported");
- break;
-#endif
- }
- return 0;
-}