]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect-flowbits: locking update
authorVictor Julien <victor@inliniac.net>
Fri, 20 Mar 2015 15:09:10 +0000 (16:09 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 20 Mar 2015 18:07:29 +0000 (19:07 +0100)
Make matches that can be in the POSTMATCH list aware of the lock hint.

src/detect-flowbits.c
src/flow-bit.c
src/flow-bit.h

index 9960348db955c8faae6e23a865c179282b22d444..e1ea8e60ae1e653d862e4370918f84103ac75b28 100644 (file)
@@ -92,30 +92,39 @@ error:
 }
 
 
-static int DetectFlowbitMatchToggle (Packet *p, const DetectFlowbitsData *fd)
+static int DetectFlowbitMatchToggle (Packet *p, const DetectFlowbitsData *fd, const int flow_locked)
 {
     if (p->flow == NULL)
         return 0;
 
-    FlowBitToggle(p->flow,fd->idx);
+    if (flow_locked)
+        FlowBitToggleNoLock(p->flow,fd->idx);
+    else
+        FlowBitToggle(p->flow,fd->idx);
     return 1;
 }
 
-static int DetectFlowbitMatchUnset (Packet *p, const DetectFlowbitsData *fd)
+static int DetectFlowbitMatchUnset (Packet *p, const DetectFlowbitsData *fd, const int flow_locked)
 {
     if (p->flow == NULL)
         return 0;
 
-    FlowBitUnset(p->flow,fd->idx);
+    if (flow_locked)
+        FlowBitUnsetNoLock(p->flow,fd->idx);
+    else
+        FlowBitUnset(p->flow,fd->idx);
     return 1;
 }
 
-static int DetectFlowbitMatchSet (Packet *p, const DetectFlowbitsData *fd)
+static int DetectFlowbitMatchSet (Packet *p, const DetectFlowbitsData *fd, const int flow_locked)
 {
     if (p->flow == NULL)
         return 0;
 
-    FlowBitSet(p->flow,fd->idx);
+    if (flow_locked)
+        FlowBitSetNoLock(p->flow,fd->idx);
+    else
+        FlowBitSet(p->flow,fd->idx);
     return 1;
 }
 
@@ -146,6 +155,7 @@ int DetectFlowbitMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p
     const DetectFlowbitsData *fd = (const DetectFlowbitsData *)ctx;
     if (fd == NULL)
         return 0;
+    const int flow_locked = det_ctx->flow_locked;
 
     switch (fd->cmd) {
         case DETECT_FLOWBITS_CMD_ISSET:
@@ -153,11 +163,11 @@ int DetectFlowbitMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p
         case DETECT_FLOWBITS_CMD_ISNOTSET:
             return DetectFlowbitMatchIsnotset(p,fd);
         case DETECT_FLOWBITS_CMD_SET:
-            return DetectFlowbitMatchSet(p,fd);
+            return DetectFlowbitMatchSet(p,fd,flow_locked);
         case DETECT_FLOWBITS_CMD_UNSET:
-            return DetectFlowbitMatchUnset(p,fd);
+            return DetectFlowbitMatchUnset(p,fd,flow_locked);
         case DETECT_FLOWBITS_CMD_TOGGLE:
-            return DetectFlowbitMatchToggle(p,fd);
+            return DetectFlowbitMatchToggle(p,fd,flow_locked);
         default:
             SCLogError(SC_ERR_UNKNOWN_VALUE, "unknown cmd %" PRIu32 "", fd->cmd);
             return 0;
index 81fe16413a24c95dc040d162c039f6fcd1445cf9..2e52b9ef1aa0052bc8cfbdec19eb20633dfa734e 100644 (file)
@@ -103,41 +103,50 @@ static void FlowBitRemove(Flow *f, uint16_t idx)
 #endif /* FLOWBITS_STATS */
 }
 
-void FlowBitSet(Flow *f, uint16_t idx)
+void FlowBitSetNoLock(Flow *f, uint16_t idx)
 {
-    FLOWLOCK_WRLOCK(f);
-
     FlowBit *fb = FlowBitGet(f, idx);
     if (fb == NULL) {
         FlowBitAdd(f, idx);
     }
-
-    FLOWLOCK_UNLOCK(f);
 }
 
-void FlowBitUnset(Flow *f, uint16_t idx)
+void FlowBitSet(Flow *f, uint16_t idx)
 {
     FLOWLOCK_WRLOCK(f);
+    FlowBitSetNoLock(f, idx);
+    FLOWLOCK_UNLOCK(f);
+}
 
+void FlowBitUnsetNoLock(Flow *f, uint16_t idx)
+{
     FlowBit *fb = FlowBitGet(f, idx);
     if (fb != NULL) {
         FlowBitRemove(f, idx);
     }
-
-    FLOWLOCK_UNLOCK(f);
 }
 
-void FlowBitToggle(Flow *f, uint16_t idx)
+void FlowBitUnset(Flow *f, uint16_t idx)
 {
     FLOWLOCK_WRLOCK(f);
+    FlowBitUnsetNoLock(f, idx);
+    FLOWLOCK_UNLOCK(f);
+}
 
+void FlowBitToggleNoLock(Flow *f, uint16_t idx)
+{
     FlowBit *fb = FlowBitGet(f, idx);
     if (fb != NULL) {
         FlowBitRemove(f, idx);
     } else {
         FlowBitAdd(f, idx);
     }
+}
 
+void FlowBitToggle(Flow *f, uint16_t idx)
+{
+    FLOWLOCK_WRLOCK(f);
+    FlowBitToggleNoLock(f, idx);
     FLOWLOCK_UNLOCK(f);
 }
 
index 633b5ee3d9a9b160c2ef41cc95e94fa42465909e..1b966a007198695ff53e5797ef1b3668c7c05ae7 100644 (file)
@@ -38,8 +38,11 @@ typedef struct FlowBit_ {
 void FlowBitFree(FlowBit *);
 void FlowBitRegisterTests(void);
 
+void FlowBitSetNoLock(Flow *, uint16_t);
 void FlowBitSet(Flow *, uint16_t);
+void FlowBitUnsetNoLock(Flow *, uint16_t);
 void FlowBitUnset(Flow *, uint16_t);
+void FlowBitToggleNoLock(Flow *, uint16_t);
 void FlowBitToggle(Flow *, uint16_t);
 int FlowBitIsset(Flow *, uint16_t);
 int FlowBitIsnotset(Flow *, uint16_t);