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
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 */
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);