Go to the documentation of this file.
64 const char *
name,
void (*FreeFunc)(
void *));
68 static inline void QuickSortSigIntId(
SigIntId *sids, uint32_t n)
88 QuickSortSigIntId(sids, (uint32_t)(r - sids) + 1);
89 QuickSortSigIntId(l, (uint32_t)(sids + n - l));
98 const uint8_t ipproto,
99 const uint8_t flow_flags,
107 SCLogDebug(
"packet %" PRIu64
" tx %p id %" PRIu64
" progress %d tx->detect_progress %02x",
112 SCLogDebug(
"%" PRIu64
": engine %p for %s progress %u sub_state %u tx %u",
119 engine->
ctx.
app.sub_state != 0);
122 SCLogDebug(
"%" PRIu64
": engine %p sub_state %u mismatch with tx %u",
129 if (tx_ptr == NULL) {
134 if (engine->
ctx.
app.tx_min_progress != -1) {
138 engine->
ctx.
app.tx_min_progress,
139 flow_flags & (STREAM_TOSERVER | STREAM_TOCLIENT));
140 SCLogDebug(
"engine %p min_progress %d %s:%s", engine, engine->
ctx.
app.tx_min_progress,
147 SCLogDebug(
"tx->tx_progress %u > engine->ctx.app.tx_min_progress %d",
153 SCLogDebug(
"tx already marked progress as beyond engine: %u > %u",
157 SCLogDebug(
"tx->tx_progress %u > engine->ctx.app.tx_min_progress %d: "
158 "tx->detect_progress %u",
169 SCLogDebug(
"engine %p min_progress %d %s:%s: results %u", engine,
181 SCLogDebug(
"tx->tx_progress %d engine->ctx.app.tx_min_progress %d "
182 "engine->is_last_for_progress %d => tx->detect_progress updated to %02x",
260 if (((engine->
ctx.
pkt.mask & mask) == engine->
ctx.
pkt.mask) &&
307 if (sgh == NULL || PrefilterFunc == NULL || pectx == NULL)
313 memset(e, 0x00,
sizeof(*e));
328 while (t->
next != NULL) {
343 PrefilterPktFn PrefilterFunc,
void *pectx,
void (*FreeFunc)(
void *pectx),
const char *
name)
345 if (sgh == NULL || PrefilterFunc == NULL || pectx == NULL)
351 memset(e, 0x00,
sizeof(*e));
361 while (t->
next != NULL) {
376 const int8_t tx_min_progress,
void *pectx,
void (*FreeFunc)(
void *pectx),
const char *
name)
379 if (sgh == NULL || PrefilterTxFunc == NULL || pectx == NULL)
385 memset(e, 0x00,
sizeof(*e));
398 while (t->
next != NULL) {
414 void (*FreeFunc)(
void *pectx),
const char *
name)
417 de_ctx, sgh, PrefilterTxFunc, alproto, 0, tx_min_progress, pectx, FreeFunc,
name);
422 void (*FreeFunc)(
void *pectx),
const char *
name)
424 if (sgh == NULL || PrefilterFrameFunc == NULL || pectx == NULL)
430 memset(e, 0x00,
sizeof(*e));
442 while (t->
next != NULL) {
456 void (*PrefilterPostRuleFunc)(
458 void *pectx,
void (*FreeFunc)(
void *pectx),
const char *
name)
460 if (sgh == NULL || PrefilterPostRuleFunc == NULL || pectx == NULL)
466 memset(e, 0x00,
sizeof(*e));
475 while (t->
next != NULL) {
502 PrefilterFreeEngineList(t);
548 static int PrefilterSetupRuleGroupSortHelper(
const void *a,
const void *b)
553 if (s1->
ctx.
app.tx_min_progress == s0->
ctx.
app.tx_min_progress) {
560 return s0->
ctx.
app.tx_min_progress > s1->
ctx.
app.tx_min_progress ? 1 : -1;
563 return s0->
ctx.
app.sub_state > s1->
ctx.
app.sub_state ? 1 : -1;
600 static void PrefilterNonPFDataFree(
void *data)
610 PrefilterAddSids(&det_ctx->
pmq, data->
array, data->
size);
613 #ifdef NONPF_PKT_STATS
614 static thread_local uint64_t prefilter_pkt_nonpf_called = 0;
615 static thread_local uint64_t prefilter_pkt_nonpf_mask_fail = 0;
616 static thread_local uint64_t prefilter_pkt_nonpf_alproto_fail = 0;
617 static thread_local uint64_t prefilter_pkt_nonpf_dsize_fail = 0;
618 static thread_local uint64_t prefilter_pkt_nonpf_dport_fail = 0;
619 static thread_local uint64_t prefilter_pkt_nonpf_sids = 0;
620 #define NONPF_PKT_STATS_INCR(s) (s)++
622 #define NONPF_PKT_STATS_INCR(s)
627 #ifdef NONPF_PKT_STATS
628 SCLogDebug(
"prefilter non-pf: called:%" PRIu64
", mask_fail:%" PRIu64
", alproto fail:%" PRIu64
629 ", dport fail:%" PRIu64
", dsize fail:%" PRIu64
", sids:%" PRIu64
630 ", avg sids:%" PRIu64,
631 prefilter_pkt_nonpf_called, prefilter_pkt_nonpf_mask_fail,
632 prefilter_pkt_nonpf_alproto_fail, prefilter_pkt_nonpf_dport_fail,
633 prefilter_pkt_nonpf_dsize_fail, prefilter_pkt_nonpf_sids,
634 prefilter_pkt_nonpf_called ? prefilter_pkt_nonpf_sids / prefilter_pkt_nonpf_called : 0);
645 for (uint32_t i = 0; i < data->
size; i++) {
648 if ((rule_mask & mask) == rule_mask) {
652 const uint32_t
sid = ds->
sid;
653 PrefilterAddSids(&det_ctx->
pmq, &
sid, 1);
661 const uint32_t
sid = ds->
sid;
662 PrefilterAddSids(&det_ctx->
pmq, &
sid, 1);
670 const uint32_t
sid = ds->
sid;
671 PrefilterAddSids(&det_ctx->
pmq, &
sid, 1);
684 static void PrefilterPktNonPFHookFlowStart(
688 PrefilterPktNonPF(det_ctx,
p, pectx);
703 for (uint32_t i = 0; i < data->
size; i++) {
707 const uint32_t
sid = ds->
sid;
708 PrefilterAddSids(&det_ctx->
pmq, &
sid, 1);
715 static uint32_t NonPFNamesHash(
HashTable *h,
void *data, uint16_t _len)
717 const char *
str = data;
721 static char NonPFNamesCompare(
void *data1, uint16_t _len1,
void *data2, uint16_t len2)
723 const char *s1 = data1;
724 const char *s2 = data2;
728 static void NonPFNamesFree(
void *data)
747 static uint32_t TxNonPFHash(
HashListTable *h,
void *data, uint16_t _len)
753 static char TxNonPFCompare(
void *data1, uint16_t _len1,
void *data2, uint16_t len2)
761 static void TxNonPFFree(
void *data)
788 for (uint32_t y = 0; y < e->
sigs_cnt; y++) {
813 if (add->
sigs == NULL) {
824 dir == 0 ?
"toserver" :
"toclient");
826 if (engine_name_heap == NULL) {
840 SCLogDebug(
"engine_name_heap %s", engine_name_heap);
864 if (pkt_non_pf_array == NULL) {
867 uint32_t pkt_non_pf_array_size = 0;
869 SCCalloc(max_sids,
sizeof(*frame_non_pf_array));
870 if (frame_non_pf_array == NULL) {
874 uint32_t frame_non_pf_array_size = 0;
877 SCCalloc(max_sids,
sizeof(*pkt_hook_flow_start_non_pf_array));
878 if (pkt_hook_flow_start_non_pf_array == NULL) {
880 SCFree(frame_non_pf_array);
883 uint32_t pkt_hook_flow_start_non_pf_array_size = 0;
885 bool pkt_hook_flow_start_mask_init =
false;
889 if (tx_engines_hash == NULL) {
891 SCFree(pkt_hook_flow_start_non_pf_array);
892 SCFree(frame_non_pf_array);
898 HashTableInit(512, NonPFNamesHash, NonPFNamesCompare, NonPFNamesFree);
901 SCFree(pkt_hook_flow_start_non_pf_array);
902 SCFree(frame_non_pf_array);
909 bool pkt_mask_init =
false;
910 #ifdef NONPF_PKT_STATS
911 uint32_t nonpf_pkt_alproto = 0;
912 uint32_t nonpf_pkt_dsize = 0;
913 uint32_t nonpf_pkt_dport = 0;
916 SCLogDebug(
"app_events_list_id %d", app_events_list_id);
918 SCLogDebug(
"app_state_list_id %d", app_state_list_id);
919 for (uint32_t sig = 0; sig < sgh->
init->
sig_cnt; sig++) {
930 SCLogDebug(
"setting up sid %u for non-prefilter", s->
id);
932 uint8_t frame_type = 0;
933 bool tx_non_pf =
false;
934 bool frame_non_pf =
false;
935 bool pkt_non_pf =
false;
956 pkt_hook_flow_start_non_pf_array[pkt_hook_flow_start_non_pf_array_size].
sid = s->
iid;
957 pkt_hook_flow_start_non_pf_array[pkt_hook_flow_start_non_pf_array_size].
value =
value;
958 pkt_hook_flow_start_non_pf_array[pkt_hook_flow_start_non_pf_array_size].
type =
type;
959 pkt_hook_flow_start_non_pf_array[pkt_hook_flow_start_non_pf_array_size].
pkt.sig_mask =
961 pkt_hook_flow_start_non_pf_array_size++;
963 if (pkt_hook_flow_start_mask_init) {
964 pkt_hook_flow_start_mask &= s->
mask;
966 pkt_hook_flow_start_mask = s->
mask;
967 pkt_hook_flow_start_mask_init =
true;
984 s->
alproto, sub_state, state, dir == 0 ? STREAM_TOSERVER : STREAM_TOCLIENT);
988 const uint8_t direction = dir == 0 ? STREAM_TOSERVER : STREAM_TOCLIENT;
991 if (TxNonPFAddSig(
de_ctx, tx_engines_hash, s->
alproto, sub_state, dir, state,
992 sm_list, pname, s) != 0) {
1006 SCLogDebug(
"list_id %d buf %p", list_id, buf);
1007 if (list_id == app_events_list_id)
1013 }
else if (buf->
frame) {
1015 f != NULL; f = f->
next) {
1018 list_id == (
int)f->sm_list &&
1023 frame_type = f->
type;
1024 frame_non_pf =
true;
1026 frame_non_pf_array[frame_non_pf_array_size].
sid = s->
iid;
1027 frame_non_pf_array[frame_non_pf_array_size].
value = s->
alproto;
1028 frame_non_pf_array[frame_non_pf_array_size].
frame.type = frame_type;
1029 frame_non_pf_array_size++;
1044 if (!AppProtoEqualsStrict(s->
alproto,
app->alproto))
1054 list_id == (
int)
app->sm_list &&
1060 if (list_id == app_state_list_id)
1061 sig_list = app_state_list_id;
1062 const uint8_t sub_state =
app->sub_state;
1063 if (TxNonPFAddSig(
de_ctx, tx_engines_hash,
app->alproto, sub_state,
app->dir,
1064 app->progress, sig_list, buf->
name, s) != 0) {
1082 dir == 0 ? STREAM_TOSERVER : STREAM_TOCLIENT);
1085 if (TxNonPFAddSig(
de_ctx, tx_engines_hash, s->
alproto, sub_state, dir,
1097 if (!(tx_non_pf || frame_non_pf)) {
1104 SCLogDebug(
"setting up sid %u for non-prefilter: %s", s->
id,
1105 tx_non_pf ?
"tx engine" : (frame_non_pf ?
"frame engine" :
"pkt engine"));
1116 #ifdef NONPF_PKT_STATS
1122 #ifdef NONPF_PKT_STATS
1128 #ifdef NONPF_PKT_STATS
1129 nonpf_pkt_alproto++;
1133 pkt_non_pf_array[pkt_non_pf_array_size].
sid = s->
iid;
1134 pkt_non_pf_array[pkt_non_pf_array_size].
value =
value;
1135 pkt_non_pf_array[pkt_non_pf_array_size].
type =
type;
1136 pkt_non_pf_array[pkt_non_pf_array_size].
pkt.sig_mask = s->
mask;
1137 pkt_non_pf_array_size++;
1139 if (pkt_mask_init) {
1140 pkt_mask &= s->
mask;
1143 pkt_mask_init =
true;
1153 SCLogDebug(
"%s engine for %s hook %d has %u non-pf sigs",
1165 int8_t engine_progress = (int8_t)t->
progress;
1166 if (t->
sig_list == app_state_list_id) {
1168 engine_progress = -1;
1176 for (uint32_t i = 0; i < t->
sigs_cnt; i++) {
1180 engine_progress, (
void *)data, PrefilterNonPFDataFree, t->
engine_name) < 0) {
1186 tx_engines_hash = NULL;
1188 if (pkt_non_pf_array_size) {
1189 SCLogDebug(
"pkt_non_pf_array_size %u", pkt_non_pf_array_size);
1191 SCCalloc(1,
sizeof(*data) + pkt_non_pf_array_size *
sizeof(data->
array[0]));
1194 data->
size = pkt_non_pf_array_size;
1195 memcpy((uint8_t *)&data->
array, pkt_non_pf_array,
1196 pkt_non_pf_array_size *
sizeof(data->
array[0]));
1199 PrefilterNonPFDataFree,
"packet:non_pf") < 0) {
1204 if (pkt_hook_flow_start_non_pf_array_size) {
1206 1,
sizeof(*data) + pkt_hook_flow_start_non_pf_array_size *
sizeof(data->
array[0]));
1209 data->
size = pkt_hook_flow_start_non_pf_array_size;
1210 memcpy((uint8_t *)&data->
array, pkt_hook_flow_start_non_pf_array,
1211 pkt_hook_flow_start_non_pf_array_size *
sizeof(data->
array[0]));
1212 SCLogDebug(
"packet:flow_start:non_pf added with %u rules", data->
size);
1215 PrefilterPktNonPFHookFlowStart,
1217 pkt_hook_flow_start_mask, hook, (
void *)data, PrefilterNonPFDataFree,
1218 "packet:flow_start:non_pf") < 0) {
1223 if (frame_non_pf_array_size) {
1224 SCLogDebug(
"%u frame non-pf sigs", frame_non_pf_array_size);
1226 SCCalloc(1,
sizeof(*data) + frame_non_pf_array_size *
sizeof(data->
array[0]));
1229 data->
size = frame_non_pf_array_size;
1230 memcpy((uint8_t *)&data->
array, frame_non_pf_array,
1231 frame_non_pf_array_size *
sizeof(data->
array[0]));
1233 FRAME_ANY_TYPE, (
void *)data, PrefilterNonPFDataFree,
"frame:non_pf") < 0) {
1239 SCFree(pkt_hook_flow_start_non_pf_array);
1240 pkt_hook_flow_start_non_pf_array = NULL;
1241 SCFree(pkt_non_pf_array);
1242 pkt_non_pf_array = NULL;
1243 SCFree(frame_non_pf_array);
1244 frame_non_pf_array = NULL;
1248 if (tx_engines_hash) {
1251 SCFree(pkt_hook_flow_start_non_pf_array);
1252 SCFree(pkt_non_pf_array);
1253 SCFree(frame_non_pf_array);
1261 FatalError(
"failed to set up pattern matching");
1275 if (SetupNonPrefilter(
de_ctx, sgh) != 0) {
1307 if (el->
next == NULL) {
1336 if (el->
next == NULL) {
1353 uint16_t local_id = 0;
1369 PrefilterSetupRuleGroupSortHelper);
1380 for (uint8_t sub = 0; sub <= max_sub_state; sub++) {
1381 int last_tx_progress = 0;
1382 bool last_tx_progress_set =
false;
1386 if (engine->
ctx.
app.sub_state == sub) {
1387 if (engine->
ctx.
app.tx_min_progress != -1)
1388 BUG_ON(engine->
ctx.
app.tx_min_progress < last_tx_progress);
1390 if (last_tx_progress_set &&
1391 engine->
ctx.
app.tx_min_progress > last_tx_progress) {
1397 last_tx_progress_set =
true;
1398 prev_engine = engine;
1402 (next_engine->
ctx.
app.sub_state != sub);
1410 last_tx_progress = engine->
ctx.
app.tx_min_progress;
1422 SCLogDebug(
"engine: gid %u alproto %s sub_state %u tx_min_progress %d is_last %s "
1423 "is_last_for_progress %s",
1425 engine->
ctx.
app.tx_min_progress, engine->
is_last ?
"true" :
"false",
1453 if (el->
next == NULL) {
1471 uint16_t local_id = 0;
1482 SCLogDebug(
"sgh %p max local_id %u", sgh, local_id);
1490 static uint32_t PrefilterStoreHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
1494 uint32_t hash = (uint32_t)strlen(
ctx->name);
1496 for (
size_t u = 0; u < strlen(
ctx->name); u++) {
1497 hash +=
ctx->name[u];
1504 static char PrefilterStoreCompareFunc(
void *data1, uint16_t len1,
1505 void *data2, uint16_t len2)
1509 return (strcmp(ctx1->
name, ctx2->
name) == 0);
1512 static void PrefilterStoreFreeFunc(
void *ptr)
1529 PrefilterStoreHashFunc,
1530 PrefilterStoreCompareFunc,
1531 PrefilterStoreFreeFunc);
1536 const char *
name,
void (*FreeFunc)(
void *))
1579 if (
ctx->id ==
id) {
1618 det_ctx,
ctx->transforms, f,
flags, txv,
ctx->list_id,
ctx->GetDataSingle);
1623 const uint8_t *data = buffer->
inspect;
1628 if (data != NULL && data_len >= mpm_ctx->
minlen) {
1630 mpm_ctx, &det_ctx->
mtc, &det_ctx->
pmq, data, data_len);
1657 const uint8_t *data = buffer->
inspect;
1662 if (data != NULL && data_len >= mpm_ctx->
minlen) {
1664 mpm_ctx, &det_ctx->
mtc, &det_ctx->
pmq, data, data_len);
1669 static void PrefilterGenericMpmFree(
void *ptr)
1688 mpm_reg->
app_v2.sub_state, mpm_reg->
app_v2.tx_min_progress, pectx,
1689 PrefilterGenericMpmFree, mpm_reg->
pname);
1711 pectx, PrefilterGenericMpmFree, mpm_reg->
pname);
1718 static void PrefilterMultiGenericMpmFree(
void *ptr)
1732 uint32_t local_id = 0;
1737 det_ctx,
ctx->transforms, f,
flags, txv,
ctx->list_id, local_id,
ctx->GetData);
1765 mpm_reg->
app_v2.sub_state, mpm_reg->
app_v2.tx_min_progress, pectx,
1766 PrefilterMultiGenericMpmFree, mpm_reg->
pname);
1805 const uint8_t *data = buffer->
inspect;
1810 if (data != NULL && data_len >= mpm_ctx->
minlen) {
1812 mpm_ctx, &det_ctx->
mtc, &det_ctx->
pmq, data, data_len);
1817 static void PrefilterMpmPktFree(
void *ptr)
1836 de_ctx, sgh, PrefilterMpmPkt, 0, hook, pectx, PrefilterMpmPktFree, mpm_reg->
pname);
1843 #define QUEUE_STEP 16
#define HashListTableGetListData(hb)
int PrefilterGenericMpmPktRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
PrefilterEngine * tx_engines
InspectionBuffer * DetectGetMultiData(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Flow *f, const uint8_t flow_flags, void *txv, const int list_id, uint32_t index, InspectionMultiBufferGetDataPtr GetBuf)
int PrefilterAppendTxEngineSubState(DetectEngineCtx *de_ctx, SigGroupHead *sgh, PrefilterTxFn PrefilterTxFunc, AppProto alproto, uint8_t sub_state, const int8_t tx_min_progress, void *pectx, void(*FreeFunc)(void *pectx), const char *name)
struct AppLayerTxData * tx_data_ptr
const char * DetectEngineAppHookToName(const AppProto p, const uint8_t sub_state, const uint8_t state, const uint8_t direction)
void(* PrefilterPostRule)(DetectEngineThreadCtx *det_ctx, const void *pectx, Packet *p, Flow *f)
#define SIG_FLAG_FW_HOOK_LTE
InspectionBuffer * DetectGetSingleData(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Flow *f, const uint8_t flow_flags, void *txv, const int list_id, InspectionSingleBufferGetDataPtr GetBuf)
SigTableElmt * sigmatch_table
void PostRuleMatchWorkQueueAppend(DetectEngineThreadCtx *det_ctx, const Signature *s, const int type, const uint32_t value)
const char * AppLayerParserGetStateNameById(uint8_t ipproto, AppProto alproto, const int id, const uint8_t direction)
int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh)
Prepare the pattern matcher ctx in a sig group head.
struct PrefilterMpmPktCtx PrefilterMpmPktCtx
#define PREFILTER_PROFILING_END(ctx, profile_id)
uint32_t rule_id_array_cnt
Container for matching data for a signature group.
uint8_t app_progress_hook
uint64_t PcapPacketCntGet(const Packet *p)
int DetectEngineAppHookToSmlist(const AppProto p, const uint8_t sub_state, const uint8_t state, const uint8_t direction)
get the sm_list for a app hook
struct HtpBodyChunk_ * next
struct SignatureHook_::@87::@88 app
struct DetectBufferMpmRegistry_::@90::@92 app_v2
int PrefilterSingleMpmRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
InspectionBufferGetDataPtr GetData
union SignatureHook_::@87 t
int PrefilterAppendEngine(DetectEngineCtx *de_ctx, SigGroupHead *sgh, PrefilterPktFn PrefilterFunc, SignatureMask mask, enum SignatureHookPkt hook, void *pectx, void(*FreeFunc)(void *pectx), const char *name)
#define PREFILTER_PROFILING_START(det_ctx)
const char * AppProtoToString(AppProto alproto)
Maps the ALPROTO_*, to its string equivalent.
main detection engine ctx
@ SIGNATURE_HOOK_PKT_NOT_SET
HashListTableBucket * HashListTableGetListHead(HashListTable *ht)
InspectionBuffer *(* InspectionBufferGetPktDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Packet *p, const int list_id)
union PrefilterEngine_::@105 cb
void PrefilterDeinit(DetectEngineCtx *de_ctx)
void DetectEngineSetEvent(DetectEngineThreadCtx *det_ctx, uint8_t e)
one time registration of keywords at start up
struct DetectPort_ * next
PrefilterEngine * payload_engines
enum DetectEnginePrefilterSetting prefilter_setting
#define PKT_NOPAYLOAD_INSPECTION
struct PrefilterNonPFDataSig array[]
#define PACKET_PROFILING_DETECT_END(p, id)
void * HashListTableLookup(HashListTable *ht, void *data, uint16_t datalen)
void(* Free)(void *pectx)
char StringHashCompareFunc(void *data1, uint16_t datalen1, void *data2, uint16_t datalen2)
#define SIG_FLAG_TOCLIENT
int PrefilterAppendFrameEngine(DetectEngineCtx *de_ctx, SigGroupHead *sgh, PrefilterFrameFn PrefilterFrameFunc, AppProto alproto, uint8_t frame_type, void *pectx, void(*FreeFunc)(void *pectx), const char *name)
DetectEngineTransforms transforms
HashTable * non_pf_engine_names
int PrefilterMultiGenericMpmRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
int DetectBufferTypeGetByName(const char *name)
int HashListTableAdd(HashListTable *ht, void *data, uint16_t datalen)
struct DetectBufferMpmRegistry_::@90::@93 pkt_v1
bool is_last_for_progress
struct PrefilterEngineList_ * next
int(* SetupPrefilter)(DetectEngineCtx *de_ctx, struct SigGroupHead_ *sgh)
@ SIGNATURE_HOOK_TYPE_APP
AppLayerParserState * alparser
#define HashListTableGetListNext(hb)
HashListTable * prefilter_hash_table
#define SIG_FLAG_TOSERVER
HashListTable * HashListTableInit(uint32_t size, uint32_t(*Hash)(struct HashListTable_ *, void *, uint16_t), char(*Compare)(void *, uint16_t, void *, uint16_t), void(*Free)(void *))
char pname[DETECT_PROFILE_NAME_LEN]
enum SignatureHookPkt pkt_hook
void Prefilter(DetectEngineThreadCtx *det_ctx, const SigGroupHead *sgh, Packet *p, const uint8_t flags, const SignatureMask mask)
PrefilterEngineList * tx_engines
#define DetectEngineGetMaxSigId(de_ctx)
PrefilterFrameFn PrefilterFrame
union PrefilterEngine_::@104 ctx
PrefilterTxFn PrefilterTx
bool * sm_types_prefilter
InspectionBufferGetPktDataPtr GetData
#define PKT_DETECT_HAS_STREAMDATA
bool(* InspectionSingleBufferGetDataPtr)(const void *txv, const uint8_t flow_flags, const uint8_t **buf, uint32_t *buf_len)
#define FLOW_PKT_TOCLIENT_FIRST
struct PrefilterMpmCtx PrefilterMpmCtx
#define NONPF_PKT_STATS_INCR(s)
DetectEngineFrameInspectionEngine * frame_inspect_engines
int PrefilterGenericMpmRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
void(* PrefilterFrameFn)(DetectEngineThreadCtx *det_ctx, const void *pectx, Packet *p, const struct Frames *frames, const struct Frame *frame)
int HashTableAdd(HashTable *ht, void *data, uint16_t datalen)
SigGroupHeadInitData * init
struct SignatureHook_::@87::@89 pkt
const DetectEngineTransforms * transforms
struct PrefilterEngine_::@104::@106 pkt
const DetectBufferType * DetectEngineBufferTypeGetById(const DetectEngineCtx *de_ctx, const int id)
PrefilterFrameFn PrefilterFrame
SignatureInitData * init_data
void(* PrefilterTxFn)(DetectEngineThreadCtx *det_ctx, const void *pectx, Packet *p, Flow *f, void *tx, const uint64_t tx_id, const AppLayerTxData *tx_data, const uint8_t flags)
uint32_t(* Search)(const struct MpmCtx_ *, struct MpmThreadCtx_ *, PrefilterRuleStore *, const uint8_t *, uint32_t)
PrefilterEngine * frame_engines
int PrefilterAppendPayloadEngine(DetectEngineCtx *de_ctx, SigGroupHead *sgh, PrefilterPktFn PrefilterFunc, void *pectx, void(*FreeFunc)(void *pectx), const char *name)
#define SCRealloc(ptr, sz)
PrefilterEngineList * pkt_engines
PrefilterEngine * post_rule_match_engines
#define PREFILTER_PROFILING_ADD_BYTES(det_ctx, bytes)
PrefilterEngineList * frame_engines
PrefilterEngineList * payload_engines
void HashListTableFree(HashListTable *ht)
#define SCMallocAligned(size, align)
DetectEnginePrefilterSetting
enum SignatureHookType type
void(* PrefilterPostRule)(DetectEngineThreadCtx *det_ctx, const void *pectx, Packet *p, Flow *f)
void PrefilterCleanupRuleGroup(const DetectEngineCtx *de_ctx, SigGroupHead *sgh)
PostRuleMatchWorkQueueItem * q
struct PrefilterNonPFDataSig::@53::@57 app
@ SIGNATURE_HOOK_TYPE_PKT
const DetectEngineTransforms * transforms
void(* PrefilterPktFn)(DetectEngineThreadCtx *det_ctx, Packet *p, const void *pectx)
InspectionMultiBufferGetDataPtr GetData
SignatureInitDataBuffer * buffers
DetectEngineAppInspectionEngine * app_inspect_engines
int PrefilterAppendPostRuleEngine(DetectEngineCtx *de_ctx, SigGroupHead *sgh, void(*PrefilterPostRuleFunc)(DetectEngineThreadCtx *det_ctx, const void *pectx, Packet *p, Flow *f), void *pectx, void(*FreeFunc)(void *pectx), const char *name)
void PrefilterInit(DetectEngineCtx *de_ctx)
#define PACKET_PROFILING_DETECT_START(p, id)
const DetectEngineTransforms * transforms
PrefilterEngineList * post_rule_match_engines
HashTable * HashTableInit(uint32_t size, uint32_t(*Hash)(struct HashTable_ *, void *, uint16_t), char(*Compare)(void *, uint16_t, void *, uint16_t), void(*Free)(void *))
int PrefilterAppendTxEngine(DetectEngineCtx *de_ctx, SigGroupHead *sgh, PrefilterTxFn PrefilterTxFunc, AppProto alproto, const int8_t tx_min_progress, void *pectx, void(*FreeFunc)(void *pectx), const char *name)
MpmTableElmt mpm_table[MPM_TABLE_SIZE]
int PrefilterSetupRuleGroup(DetectEngineCtx *de_ctx, SigGroupHead *sgh)
@ SIGNATURE_HOOK_PKT_FLOW_START
InspectionBuffer *(* InspectionBufferGetDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Flow *f, const uint8_t flow_flags, void *txv, const int list_id)
void PrefilterPostRuleMatch(DetectEngineThreadCtx *det_ctx, const SigGroupHead *sgh, Packet *p, Flow *f)
invoke post-rule match "prefilter" engines
void * DetectGetInnerTx(void *tx_ptr, AppProto alproto, AppProto engine_alproto, uint8_t flow_flags)
uint8_t AppLayerParserGetMaxSubState(const AppProto alproto)
struct PrefilterNonPFDataSig::@53::@55 pkt
struct PrefilterEngine_::@104::@107 app
InspectionSingleBufferGetDataPtr GetDataSingle
struct PrefilterMpm PrefilterMpm
PrefilterEngine * pkt_engines
bool AppLayerParserSupportsSubStates(const AppProto alproto)
const uint8_t tx_progress
PrefilterTxFn PrefilterTx
AppProto alproto
application level protocol
struct PrefilterNonPFDataSig::@53::@56 frame
void PrefilterFreeEnginesList(PrefilterEngineList *list)
#define FLOW_PKT_TOSERVER_FIRST
#define DEBUG_VALIDATE_BUG_ON(exp)
#define SIG_FLAG_PREFILTER
void DetectRunPrefilterTx(DetectEngineThreadCtx *det_ctx, const SigGroupHead *sgh, Packet *p, const uint8_t ipproto, const uint8_t flow_flags, const AppProto alproto, void *alstate, DetectTransaction *tx)
run prefilter engines on a transaction
PostRuleMatchWorkQueue post_rule_work_queue
uint32_t StringHashDjb2(const uint8_t *data, uint32_t datalen)
@ DETECT_EVENT_POST_MATCH_QUEUE_FAILED
void PrefilterPktNonPFStatsDump(void)
struct PrefilterNonPFDataSig * sigs