From 19400a7d6902b2ba56b51b68473160850d40033c Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Fri, 26 Mar 2021 01:00:31 +0100 Subject: [PATCH] flow: add function to get flow using flow_id --- src/flow-hash.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ src/flow-hash.h | 1 + 2 files changed, 56 insertions(+) diff --git a/src/flow-hash.c b/src/flow-hash.c index c858b294a9..49c0a02acd 100644 --- a/src/flow-hash.c +++ b/src/flow-hash.c @@ -856,6 +856,61 @@ static inline int FlowCompareKey(Flow *f, FlowKey *key) return CmpFlowKey(f, key); } +/** \brief Look for existing Flow using a flow id value + * + * 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 flow_id Flow ID of the flow to look for + * \retval f *LOCKED* flow or NULL + */ + +Flow *FlowGetExistingFlowFromFlowId(int64_t flow_id) +{ + uint32_t hash = flow_id & 0x0000FFFF; + /* 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 (FlowGetId(f) != flow_id) { + while (f) { + f = f->next; + + if (f == NULL) { + FBLOCK_UNLOCK(fb); + return NULL; + } + if (FlowGetId(f) != flow_id) { + /* 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 diff --git a/src/flow-hash.h b/src/flow-hash.h index 20bd2d9013..e109e55316 100644 --- a/src/flow-hash.h +++ b/src/flow-hash.h @@ -83,6 +83,7 @@ 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); /** \note f->fb must be locked */