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) if (p->flow == NULL)
return 0; return 0;
FlowBitToggle(p->flow,fd->idx); if (flow_locked)
FlowBitToggleNoLock(p->flow,fd->idx);
else
FlowBitToggle(p->flow,fd->idx);
return 1; 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) if (p->flow == NULL)
return 0; return 0;
FlowBitUnset(p->flow,fd->idx); if (flow_locked)
FlowBitUnsetNoLock(p->flow,fd->idx);
else
FlowBitUnset(p->flow,fd->idx);
return 1; 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) if (p->flow == NULL)
return 0; return 0;
FlowBitSet(p->flow,fd->idx); if (flow_locked)
FlowBitSetNoLock(p->flow,fd->idx);
else
FlowBitSet(p->flow,fd->idx);
return 1; return 1;
} }
@ -146,6 +155,7 @@ int DetectFlowbitMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p
const DetectFlowbitsData *fd = (const DetectFlowbitsData *)ctx; const DetectFlowbitsData *fd = (const DetectFlowbitsData *)ctx;
if (fd == NULL) if (fd == NULL)
return 0; return 0;
const int flow_locked = det_ctx->flow_locked;
switch (fd->cmd) { switch (fd->cmd) {
case DETECT_FLOWBITS_CMD_ISSET: case DETECT_FLOWBITS_CMD_ISSET:
@ -153,11 +163,11 @@ int DetectFlowbitMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p
case DETECT_FLOWBITS_CMD_ISNOTSET: case DETECT_FLOWBITS_CMD_ISNOTSET:
return DetectFlowbitMatchIsnotset(p,fd); return DetectFlowbitMatchIsnotset(p,fd);
case DETECT_FLOWBITS_CMD_SET: case DETECT_FLOWBITS_CMD_SET:
return DetectFlowbitMatchSet(p,fd); return DetectFlowbitMatchSet(p,fd,flow_locked);
case DETECT_FLOWBITS_CMD_UNSET: case DETECT_FLOWBITS_CMD_UNSET:
return DetectFlowbitMatchUnset(p,fd); return DetectFlowbitMatchUnset(p,fd,flow_locked);
case DETECT_FLOWBITS_CMD_TOGGLE: case DETECT_FLOWBITS_CMD_TOGGLE:
return DetectFlowbitMatchToggle(p,fd); return DetectFlowbitMatchToggle(p,fd,flow_locked);
default: default:
SCLogError(SC_ERR_UNKNOWN_VALUE, "unknown cmd %" PRIu32 "", fd->cmd); SCLogError(SC_ERR_UNKNOWN_VALUE, "unknown cmd %" PRIu32 "", fd->cmd);
return 0; return 0;

@ -103,41 +103,50 @@ static void FlowBitRemove(Flow *f, uint16_t idx)
#endif /* FLOWBITS_STATS */ #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); FlowBit *fb = FlowBitGet(f, idx);
if (fb == NULL) { if (fb == NULL) {
FlowBitAdd(f, idx); FlowBitAdd(f, idx);
} }
FLOWLOCK_UNLOCK(f);
} }
void FlowBitUnset(Flow *f, uint16_t idx) void FlowBitSet(Flow *f, uint16_t idx)
{ {
FLOWLOCK_WRLOCK(f); FLOWLOCK_WRLOCK(f);
FlowBitSetNoLock(f, idx);
FLOWLOCK_UNLOCK(f);
}
void FlowBitUnsetNoLock(Flow *f, uint16_t idx)
{
FlowBit *fb = FlowBitGet(f, idx); FlowBit *fb = FlowBitGet(f, idx);
if (fb != NULL) { if (fb != NULL) {
FlowBitRemove(f, idx); FlowBitRemove(f, idx);
} }
FLOWLOCK_UNLOCK(f);
} }
void FlowBitToggle(Flow *f, uint16_t idx) void FlowBitUnset(Flow *f, uint16_t idx)
{ {
FLOWLOCK_WRLOCK(f); FLOWLOCK_WRLOCK(f);
FlowBitUnsetNoLock(f, idx);
FLOWLOCK_UNLOCK(f);
}
void FlowBitToggleNoLock(Flow *f, uint16_t idx)
{
FlowBit *fb = FlowBitGet(f, idx); FlowBit *fb = FlowBitGet(f, idx);
if (fb != NULL) { if (fb != NULL) {
FlowBitRemove(f, idx); FlowBitRemove(f, idx);
} else { } else {
FlowBitAdd(f, idx); FlowBitAdd(f, idx);
} }
}
void FlowBitToggle(Flow *f, uint16_t idx)
{
FLOWLOCK_WRLOCK(f);
FlowBitToggleNoLock(f, idx);
FLOWLOCK_UNLOCK(f); FLOWLOCK_UNLOCK(f);
} }

@ -38,8 +38,11 @@ typedef struct FlowBit_ {
void FlowBitFree(FlowBit *); void FlowBitFree(FlowBit *);
void FlowBitRegisterTests(void); void FlowBitRegisterTests(void);
void FlowBitSetNoLock(Flow *, uint16_t);
void FlowBitSet(Flow *, uint16_t); void FlowBitSet(Flow *, uint16_t);
void FlowBitUnsetNoLock(Flow *, uint16_t);
void FlowBitUnset(Flow *, uint16_t); void FlowBitUnset(Flow *, uint16_t);
void FlowBitToggleNoLock(Flow *, uint16_t);
void FlowBitToggle(Flow *, uint16_t); void FlowBitToggle(Flow *, uint16_t);
int FlowBitIsset(Flow *, uint16_t); int FlowBitIsset(Flow *, uint16_t);
int FlowBitIsnotset(Flow *, uint16_t); int FlowBitIsnotset(Flow *, uint16_t);

Loading…
Cancel
Save