((p)->action = ACTION_PASS)); \
} while (0)
+#define TEST_PACKET_ACTION(p, a) \
+ ((p)->root ? \
+ ((p)->root->action & a) : \
+ ((p)->action & a))
+
+#define UPDATE_PACKET_ACTION(p, a) do { \
+ ((p)->root ? \
+ ((p)->root->action |= a) : \
+ ((p)->action |= a)); \
+} while (0)
+
#define TUNNEL_INCR_PKT_RTV(p) do { \
SCMutexLock((p)->root ? &(p)->root->tunnel_mutex : &(p)->tunnel_mutex); \
((p)->root ? (p)->root->tunnel_rtv_cnt++ : (p)->tunnel_rtv_cnt++); \
}
/* set verdict on packet */
- p->action |= p->alerts.alerts[i].action;
+ UPDATE_PACKET_ACTION(p, p->alerts.alerts[i].action);
if (p->action & ACTION_PASS) {
/* Ok, reset the alert cnt to end in the previous of pass
PacketAlertAppend(det_ctx, s, p, 0);
} else {
/* apply actions for noalert/rule suppressed as well */
- p->action |= s->action;
+ UPDATE_PACKET_ACTION(p, s->action);
}
}
}
if (!(s->flags & SIG_FLAG_NOALERT)) {
PacketAlertAppend(det_ctx, s, p, 0);
} else {
- p->action |= s->action;
+ UPDATE_PACKET_ACTION(p, s->action);
}
}
if (p->flow->flags & FLOW_ACTION_DROP)
{
alert_flags = PACKET_ALERT_FLAG_DROP_FLOW;
- p->action |= ACTION_DROP;
+ UPDATE_PACKET_ACTION(p, ACTION_DROP);
}
}
PacketAlertAppend(det_ctx, s, p, alert_flags);
} else {
/* apply actions even if not alerting */
- p->action |= s->action;
+ UPDATE_PACKET_ACTION(p, s->action);
}
next:
DetectFlowvarProcessList(det_ctx, p->flow);
FlowSetNoPacketInspectionFlag(p->flow);
DecodeSetNoPacketInspectionFlag(p);
FlowSetSessionNoApplayerInspectionFlag(p->flow);
- p->action |= ACTION_DROP;
+ UPDATE_PACKET_ACTION(p, ACTION_DROP);
/* return the segments to the pool */
StreamTcpSessionPktFree(p);
SCReturnInt(0);
}
if (StreamTcpInlineMode()) {
- p->action |= ACTION_DROP;
+ UPDATE_PACKET_ACTION(p, ACTION_DROP);
}
SCReturnInt(-1);
}