mirror of
https://github.com/OISF/suricata.git
synced 2026-05-28 04:32:12 -04:00
flow: add function to get flow using flow_id
This commit is contained in:
parent
06756314d6
commit
19400a7d69
2 changed files with 56 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in a new issue