From cc305da476108a4311d34fd3ec5cc34dd12b6057 Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Thu, 28 Apr 2022 09:38:24 +0200 Subject: [PATCH] flow: make FlowGetExistingFlowFromHash static For easier reasoning about the code --- src/flow-hash.c | 110 ++++++++++++++++++++++++------------------------ src/flow-hash.h | 1 - 2 files changed, 55 insertions(+), 56 deletions(-) diff --git a/src/flow-hash.c b/src/flow-hash.c index 768c3bd38e..26c7b1c60e 100644 --- a/src/flow-hash.c +++ b/src/flow-hash.c @@ -984,6 +984,61 @@ Flow *FlowGetExistingFlowFromFlowId(int64_t flow_id) return f; } +/** \brief Look for existing Flow using a FlowKey + * + * Hash retrieval function for flows. Looks up the hash bucket containing the + * flow pointer. Then compares the packet with the found flow to see if it is + * the flow we need. If it isn't, walk the list until the right flow is found. + * + * + * \param key Pointer to FlowKey build using flow to look for + * \param hash Value of the flow hash + * \retval f *LOCKED* flow or NULL + */ +static Flow *FlowGetExistingFlowFromHash(FlowKey *key, const uint32_t hash) +{ + /* get our hash bucket and lock it */ + FlowBucket *fb = &flow_hash[hash % flow_config.hash_size]; + FBLOCK_LOCK(fb); + + SCLogDebug("fb %p fb->head %p", fb, fb->head); + + /* return if the bucket don't have a flow */ + if (fb->head == NULL) { + FBLOCK_UNLOCK(fb); + return NULL; + } + + /* ok, we have a flow in the bucket. Let's find out if it is our flow */ + Flow *f = fb->head; + + /* see if this is the flow we are looking for */ + if (FlowCompareKey(f, key) == 0) { + while (f) { + f = f->next; + + if (f == NULL) { + FBLOCK_UNLOCK(fb); + return NULL; + } + + if (FlowCompareKey(f, key) != 0) { + /* found our flow, lock & return */ + FLOWLOCK_WRLOCK(f); + + FBLOCK_UNLOCK(fb); + return f; + } + } + } + + /* lock & return */ + FLOWLOCK_WRLOCK(f); + + FBLOCK_UNLOCK(fb); + return f; +} + /** \brief Get or create a Flow using a FlowKey * * Hash retrieval function for flows. Looks up the hash bucket containing the @@ -1048,61 +1103,6 @@ Flow *FlowGetFromFlowKey(FlowKey *key, struct timespec *ttime, const uint32_t ha return f; } -/** \brief Look for existing Flow using a FlowKey - * - * Hash retrieval function for flows. Looks up the hash bucket containing the - * flow pointer. Then compares the packet with the found flow to see if it is - * the flow we need. If it isn't, walk the list until the right flow is found. - * - * - * \param key Pointer to FlowKey build using flow to look for - * \param hash Value of the flow hash - * \retval f *LOCKED* flow or NULL - */ -Flow *FlowGetExistingFlowFromHash(FlowKey *key, const uint32_t hash) -{ - /* get our hash bucket and lock it */ - FlowBucket *fb = &flow_hash[hash % flow_config.hash_size]; - FBLOCK_LOCK(fb); - - SCLogDebug("fb %p fb->head %p", fb, fb->head); - - /* return if the bucket don't have a flow */ - if (fb->head == NULL) { - FBLOCK_UNLOCK(fb); - return NULL; - } - - /* ok, we have a flow in the bucket. Let's find out if it is our flow */ - Flow *f = fb->head; - - /* see if this is the flow we are looking for */ - if (FlowCompareKey(f, key) == 0) { - while (f) { - f = f->next; - - if (f == NULL) { - FBLOCK_UNLOCK(fb); - return NULL; - } - - if (FlowCompareKey(f, key) != 0) { - /* found our flow, lock & return */ - FLOWLOCK_WRLOCK(f); - - FBLOCK_UNLOCK(fb); - return f; - } - } - } - - /* lock & return */ - FLOWLOCK_WRLOCK(f); - - FBLOCK_UNLOCK(fb); - return f; -} - #define FLOW_GET_NEW_TRIES 5 /* inline locking wrappers to make profiling easier */ diff --git a/src/flow-hash.h b/src/flow-hash.h index a8c27f2ea4..201eb64145 100644 --- a/src/flow-hash.h +++ b/src/flow-hash.h @@ -82,7 +82,6 @@ typedef struct FlowBucket_ { Flow *FlowGetFlowFromHash(ThreadVars *tv, FlowLookupStruct *tctx, Packet *, Flow **); Flow *FlowGetFromFlowKey(FlowKey *key, struct timespec *ttime, const uint32_t hash); -Flow *FlowGetExistingFlowFromHash(FlowKey * key, uint32_t hash); Flow *FlowGetExistingFlowFromFlowId(int64_t flow_id); uint32_t FlowKeyGetHash(FlowKey *flow_key); uint32_t FlowGetIpPairProtoHash(const Packet *p);