}
-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;
}
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:
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;
#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);
}
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);