detect-flowbits: locking update

Make matches that can be in the POSTMATCH list aware of the lock hint.
pull/1391/head
Victor Julien 11 years ago
parent 4609495c60
commit e1efa7a0b5

@ -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;

@ -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);
}

@ -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);

Loading…
Cancel
Save