From: Eric Leblond Date: Wed, 20 Mar 2013 10:28:58 +0000 (+0100) Subject: flow tag: conversion to flow storage API X-Git-Tag: suricata-2.0beta2~470 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fb55931c304d03c0afa028a7cb7483eeb0b9a883;p=thirdparty%2Fsuricata.git flow tag: conversion to flow storage API This patch is updating the flow tag system to use the flow storage API. The tag_list member of Flow structure is suppressed and its cleaning operation are suppressed too as this is handled transparently by the flow storage API. --- diff --git a/src/detect-engine-tag.c b/src/detect-engine-tag.c index 59db17d4e2..53207882c0 100644 --- a/src/detect-engine-tag.c +++ b/src/detect-engine-tag.c @@ -34,16 +34,19 @@ #include "detect-tag.h" #include "host.h" #include "host-storage.h" +#include "flow-storage.h" SC_ATOMIC_DECLARE(unsigned int, num_tags); /**< Atomic counter, to know if we have tagged hosts/sessions, to avoid locking */ static int tag_id = 0; /**< Host storage id for tags */ +static int flow_tag_id = 0; /**< Flow storage id for tags */ void TagInitCtx(void) { SC_ATOMIC_INIT(num_tags); tag_id = HostStorageRegister("tag", sizeof(void *), NULL, DetectTagDataListFree); + flow_tag_id = FlowStorageRegister("tag", sizeof(void *), NULL, DetectTagDataListFree); } /** @@ -111,10 +114,8 @@ int TagFlowAdd(Packet *p, DetectTagDataEntry *tde) { return 1; FLOWLOCK_WRLOCK(p->flow); - - if (p->flow->tag_list != NULL) { - iter = p->flow->tag_list; - + iter = FlowGetStorageById(p->flow, flow_tag_id); + if (iter != NULL) { /* First iterate installed entries searching a duplicated sid/gid */ for (; iter != NULL; iter = iter->next) { num_tags++; @@ -140,8 +141,8 @@ int TagFlowAdd(Packet *p, DetectTagDataEntry *tde) { if (updated == 0 && num_tags < DETECT_TAG_MAX_TAGS) { DetectTagDataEntry *new_tde = DetectTagDataCopy(tde); if (new_tde != NULL) { - new_tde->next = p->flow->tag_list; - p->flow->tag_list = new_tde; + new_tde->next = FlowGetStorageById(p->flow, flow_tag_id); + FlowSetStorageById(p->flow, flow_tag_id, new_tde); (void) SC_ATOMIC_ADD(num_tags, 1); } } else if (num_tags == DETECT_TAG_MAX_TAGS) { @@ -232,12 +233,12 @@ int TagHashAddTag(DetectTagDataEntry *tde, Packet *p) } static void TagHandlePacketFlow(Flow *f, Packet *p) { - if (f->tag_list == NULL) + if (FlowGetStorageById(f, flow_tag_id) == NULL) return; DetectTagDataEntry *tde = NULL; DetectTagDataEntry *prev = NULL; - DetectTagDataEntry *iter = f->tag_list; + DetectTagDataEntry *iter = FlowGetStorageById(f, flow_tag_id); uint8_t flag_added = 0; while (iter != NULL) { @@ -270,7 +271,7 @@ static void TagHandlePacketFlow(Flow *f, Packet *p) { (void) SC_ATOMIC_SUB(num_tags, 1); continue; } else { - p->flow->tag_list = iter->next; + FlowSetStorageById(p->flow, flow_tag_id, iter->next); tde = iter; iter = iter->next; SCFree(tde); @@ -295,7 +296,7 @@ static void TagHandlePacketFlow(Flow *f, Packet *p) { (void) SC_ATOMIC_SUB(num_tags, 1); continue; } else { - p->flow->tag_list = iter->next; + FlowSetStorageById(p->flow, flow_tag_id, iter->next); tde = iter; iter = iter->next; SCFree(tde); @@ -322,7 +323,7 @@ static void TagHandlePacketFlow(Flow *f, Packet *p) { (void) SC_ATOMIC_SUB(num_tags, 1); continue; } else { - p->flow->tag_list = iter->next; + FlowSetStorageById(p->flow, flow_tag_id, iter->next); tde = iter; iter = iter->next; SCFree(tde); diff --git a/src/flow-util.h b/src/flow-util.h index ef7d8de878..09a177c845 100644 --- a/src/flow-util.h +++ b/src/flow-util.h @@ -56,7 +56,6 @@ (f)->de_state = NULL; \ (f)->sgh_toserver = NULL; \ (f)->sgh_toclient = NULL; \ - (f)->tag_list = NULL; \ (f)->flowvar = NULL; \ SCMutexInit(&(f)->de_state_m, NULL); \ (f)->hnext = NULL; \ @@ -92,8 +91,6 @@ } \ (f)->sgh_toserver = NULL; \ (f)->sgh_toclient = NULL; \ - DetectTagDataListFree((f)->tag_list); \ - (f)->tag_list = NULL; \ GenericVarFree((f)->flowvar); \ (f)->flowvar = NULL; \ if (SC_ATOMIC_GET((f)->autofp_tmqh_flow_qid) != -1) { \ @@ -110,11 +107,9 @@ if ((f)->de_state != NULL) { \ DetectEngineStateFree((f)->de_state); \ } \ - DetectTagDataListFree((f)->tag_list); \ GenericVarFree((f)->flowvar); \ SCMutexDestroy(&(f)->de_state_m); \ SC_ATOMIC_DESTROY((f)->autofp_tmqh_flow_qid); \ - (f)->tag_list = NULL; \ } while(0) /** \brief check if a memory alloc would fit in the memcap diff --git a/src/flow.h b/src/flow.h index aa6311d00b..2afe4f8bf3 100644 --- a/src/flow.h +++ b/src/flow.h @@ -342,9 +342,6 @@ typedef struct Flow_ * has been set. */ struct SigGroupHead_ *sgh_toserver; - /** List of tags of this flow (from "tag" keyword of type "session") */ - void *tag_list; - /* pointer to the var list */ GenericVar *flowvar;