Go to the documentation of this file.
67 "toserver TCP packet",
68 "toclient TCP packet",
69 "toserver TCP stream",
70 "toclient TCP stream",
71 "toserver UDP packet",
72 "toclient UDP packet",
91 AppProto alproto,
int tx_min_progress)
93 SCLogDebug(
"registering %s/%d/%d/%p/%p/%u/%d", name, direction, priority,
94 PrefilterRegister, GetData, alproto, tx_min_progress);
96 BUG_ON(tx_min_progress >= 48);
107 FatalError(
"MPM engine registration for %s failed", name);
116 am->
sm_list = (int16_t)sm_list;
122 am->
app_v2.GetData = GetData;
123 am->
app_v2.alproto = alproto;
124 am->
app_v2.tx_min_progress = tx_min_progress;
130 while (t->
next != NULL) {
144 const int id,
const int parent_id,
147 SCLogDebug(
"registering %d/%d",
id, parent_id);
170 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
175 char xforms[1024] =
"";
176 for (
int i = 0; i < transforms->
cnt; i++) {
178 (void)snprintf(ttstr,
sizeof(ttstr),
"%s,",
180 strlcat(xforms, ttstr,
sizeof(xforms));
182 xforms[strlen(xforms)-1] =
'\0';
184 size_t space =
sizeof(am->
pname) - strlen(am->
name) - 3;
185 char toprint[space + 1];
186 memset(toprint, 0x00, space + 1);
187 if (space < strlen(xforms)) {
190 strlcpy(toprint, xforms,
sizeof(toprint));
192 (void)snprintf(am->
pname,
sizeof(am->
pname),
"%s#%d (%s)",
193 am->
name, id, toprint);
195 (void)snprintf(am->
pname,
sizeof(am->
pname),
"%s#%d",
202 SCLogDebug(
"copied mpm registration for %s id %u "
203 "with parent %u and GetData %p",
215 while (list != NULL) {
235 char confstring[256] =
"detect.mpm.";
237 strlcat(confstring,
".shared",
sizeof(confstring));
271 if (mpm_ctx != NULL) {
291 SCLogDebug(
"registering %s/%d/%p/%s/%u", name, priority, PrefilterRegister,
298 if (sm_list < 0 || sm_list > UINT16_MAX) {
299 FatalError(
"MPM engine registration for %s failed", name);
306 am->
sm_list = (uint16_t)sm_list;
321 while (t->
next != NULL) {
337 SCLogDebug(
"registering %d/%d",
id, parent_id);
358 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
364 SCLogDebug(
"copied mpm registration for %s id %u "
366 t->
name,
id, parent_id);
379 SCLogDebug(
"registering %s/%d/%p/%s/%u", name, priority, PrefilterRegister,
383 if (sm_list < 0 || sm_list > UINT16_MAX) {
384 FatalError(
"MPM engine registration for %s failed", name);
395 am->
sm_list = (uint16_t)sm_list;
410 if (
ConfGetBool(
"detect.mpm.frame.shared", &confshared) == 1)
424 while (t->
next != NULL) {
439 while (list != NULL) {
450 while (t->
next != NULL) {
462 char confstring[256] =
"detect.mpm.";
464 strlcat(confstring,
".shared",
sizeof(confstring));
500 if (mpm_ctx != NULL) {
521 SCLogDebug(
"registering %s/%d/%p/%p", name, priority,
522 PrefilterRegister, GetData);
533 FatalError(
"MPM engine registration for %s failed", name);
541 am->
sm_list = (uint16_t)sm_list;
546 am->
pkt_v1.GetData = GetData;
552 while (t->
next != NULL) {
566 const int id,
const int parent_id,
569 SCLogDebug(
"registering %d/%d",
id, parent_id);
588 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
594 SCLogDebug(
"copied mpm registration for %s id %u "
595 "with parent %u and GetData %p",
606 while (list != NULL) {
617 while (t->
next != NULL) {
629 char confstring[256] =
"detect.mpm.";
631 strlcat(confstring,
".shared",
sizeof(confstring));
665 if (mpm_ctx != NULL) {
684 char confstring[256] =
"detect.mpm.";
685 strlcat(confstring, name,
sizeof(confstring));
686 strlcat(confstring,
".shared",
sizeof(confstring));
693 SCLogDebug(
"using unique mpm ctx' for %s", name);
696 SCLogDebug(
"using shared mpm ctx' for %s", name);
779 if (!(s->
proto.
proto[IPPROTO_TCP / 8] & 1 << (IPPROTO_TCP % 8))) {
815 if (!(s->
proto.
proto[IPPROTO_TCP / 8] & 1 << (IPPROTO_TCP % 8))) {
843 const char *mpm_algo;
847 if ((
ConfGet(
"mpm-algo", &mpm_algo)) == 1) {
848 if (mpm_algo != NULL) {
849 #if __BYTE_ORDER == __BIG_ENDIAN
850 if (strcmp(mpm_algo,
"ac-ks") == 0) {
852 "not work on big endian systems at this time.");
855 if (strcmp(
"auto", mpm_algo) == 0) {
862 if (strcmp(
mpm_table[u].name, mpm_algo) == 0) {
868 #ifndef BUILD_HYPERSCAN
869 if ((strcmp(mpm_algo,
"hs") == 0)) {
870 FatalError(
"Hyperscan (hs) support for mpm-algo is "
871 "not compiled into Suricata.");
876 "in the yaml conf file: \"%s\"",
886 SCLogDebug(
"mpm_ctx %p, mpm_matcher %"PRIu16
"", mpm_ctx, mpm_matcher);
892 SCLogDebug(
"mpm_thread_ctx %p, mpm_matcher %"PRIu16
" defunct", mpm_thread_ctx, mpm_matcher);
897 SCLogDebug(
"mpm_thread_ctx %p, mpm_matcher %"PRIu16
"", mpm_thread_ctx, mpm_matcher);
898 if (
mpm_table[mpm_matcher].DestroyThreadCtx != NULL)
903 SCLogDebug(
"mpm_thread_ctx %p, type %"PRIu16, mpm_thread_ctx, mpm_matcher);
923 memset(&a, 0 ,
sizeof(a));
927 for (u = 0; u < patlen; u++) {
928 if (a[pat[u]] == 0) {
931 else if (isprint(pat[u]) || pat[u] == 0x00 || pat[u] == 0x01 || pat[u] == 0xFF)
945 static void PopulateMpmHelperAddPattern(
MpmCtx *mpm_ctx,
950 uint16_t pat_offset = cd->
offset;
951 uint16_t pat_depth = cd->
depth;
954 if (chop && (pat_depth || pat_offset)) {
966 pat_depth = pat_offset = 0;
973 pat_offset, pat_depth,
978 pat_offset, pat_depth,
985 pat_offset, pat_depth,
990 pat_offset, pat_depth,
998 #define SGH_PROTO(sgh, p) ((sgh)->init->protos[(p)] == 1)
999 #define SGH_DIRECTION_TS(sgh) ((sgh)->init->direction & SIG_FLAG_TOSERVER)
1000 #define SGH_DIRECTION_TC(sgh) ((sgh)->init->direction & SIG_FLAG_TOCLIENT)
1004 if (s == NULL || mpm_sm == NULL)
1031 uint16_t max_len,
bool skip_negated_content)
1046 if (mpm_sm == NULL) {
1055 }
else if (ls == ss) {
1073 int pos_sm_list[nlists];
1074 int neg_sm_list[nlists];
1075 memset(pos_sm_list, 0, nlists *
sizeof(
int));
1076 memset(neg_sm_list, 0, nlists *
sizeof(
int));
1077 int pos_sm_list_cnt = 0;
1078 int neg_sm_list_cnt = 0;
1124 SetMpm(s, sm, list_id);
1129 neg_sm_list[list_id] = 1;
1132 pos_sm_list[list_id] = 1;
1140 SCLogDebug(
"neg_sm_list_cnt %d pos_sm_list_cnt %d", neg_sm_list_cnt, pos_sm_list_cnt);
1143 int *curr_sm_list = NULL;
1144 int skip_negated_content = 1;
1145 if (pos_sm_list_cnt > 0) {
1146 curr_sm_list = pos_sm_list;
1147 }
else if (neg_sm_list_cnt > 0) {
1148 curr_sm_list = neg_sm_list;
1149 skip_negated_content = 0;
1154 int final_sm_list[nlists];
1155 memset(&final_sm_list, 0, (nlists *
sizeof(
int)));
1157 int count_final_sm_list = 0;
1161 while (tmp != NULL) {
1163 tmp != NULL && priority == tmp->
priority;
1169 if (curr_sm_list[tmp->
list_id] == 0)
1171 final_sm_list[count_final_sm_list++] = tmp->
list_id;
1174 if (count_final_sm_list != 0)
1178 BUG_ON(count_final_sm_list == 0);
1179 SCLogDebug(
"count_final_sm_list %d skip_negated_content %d", count_final_sm_list,
1180 skip_negated_content);
1182 uint16_t max_len = 0;
1183 for (
int i = 0; i < count_final_sm_list; i++) {
1184 SCLogDebug(
"i %d final_sm_list[i] %d", i, final_sm_list[i]);
1202 if (final_sm_list[i] == list_id) {
1223 int mpm_sm_list = -1;
1224 for (
int i = 0; i < count_final_sm_list; i++) {
1230 skip_negated_content);
1231 if (mpm_sm != prev_mpm_sm) {
1232 mpm_sm_list = final_sm_list[i];
1239 if (final_sm_list[i] == list_id) {
1245 skip_negated_content);
1247 if (mpm_sm != prev_mpm_sm) {
1248 mpm_sm_list = list_id;
1256 if (mpm_sm != NULL) {
1257 BUG_ON(mpm_sm_list == -1);
1259 BUG_ON(check_list != mpm_sm_list);
1263 SetMpm(s, mpm_sm, mpm_sm_list);
1276 static uint32_t MpmStoreHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
1298 static char MpmStoreCompareFunc(
void *data1, uint16_t len1,
void *data2,
1328 static void MpmStoreFreeFunc(
void *ptr)
1358 MpmStoreCompareFunc,
1403 while (am != NULL) {
1411 while (am != NULL) {
1426 uint32_t appstats[app_mpms_cnt + 1];
1427 memset(&appstats, 0x00,
sizeof(appstats));
1429 uint32_t pktstats[pkt_mpms_cnt + 1];
1430 memset(&pktstats, 0x00,
sizeof(pktstats));
1432 uint32_t framestats[frame_mpms_cnt + 1];
1433 memset(&framestats, 0x00,
sizeof(framestats));
1440 if (ms == NULL || ms->
mpm_ctx == NULL) {
1450 SCLogDebug(
"%s: %u patterns. Min %u, Max %u. Ctx %p",
1458 SCLogDebug(
"%s %s %s: %u patterns. Min %u, Max %u. Ctx %p",
1479 for (
int x = 0; x <
MPMB_MAX; x++) {
1483 while (am != NULL) {
1484 if (appstats[am->
sm_list] > 0) {
1485 const char *name = am->
name;
1487 SCLogPerf(
"AppLayer MPM \"%s %s (%s)\": %u", direction, name,
1493 while (pm != NULL) {
1494 if (pktstats[pm->
sm_list] > 0) {
1495 const char *name = pm->
name;
1501 while (um != NULL) {
1502 if (framestats[um->
sm_list] > 0) {
1503 const char *name = um->
name;
1571 if (ms->
sid_array[sig / 8] & (1 << (sig % 8))) {
1591 SCLogDebug(
"not adding negated mpm as it's not 'single'");
1595 PopulateMpmHelperAddPattern(ms->
mpm_ctx,
1625 uint8_t sids_array[max_sid];
1626 memset(sids_array, 0x00, max_sid);
1627 int sgh_mpm_context = 0;
1692 sids_array[s->
num / 8] |= 1 << (s->
num % 8);
1700 sids_array[s->
num / 8] |= 1 << (s->
num % 8);
1706 sids_array[s->
num / 8] |= 1 << (s->
num % 8);
1710 sids_array[s->
num / 8] |= 1 << (s->
num % 8);
1721 MpmStore lookup = { sids_array, max_sid, direction, buf, sm_list, 0, 0, NULL };
1724 if (result == NULL) {
1728 uint8_t *sids =
SCCalloc(1, max_sid);
1734 memcpy(sids, sids_array, max_sid);
1742 MpmStoreSetup(
de_ctx, copy);
1743 MpmStoreAdd(
de_ctx, copy);
1770 0, am->
app_v2.alproto, NULL };
1775 if (result == NULL) {
1797 MpmStoreSetup(
de_ctx, copy);
1798 MpmStoreAdd(
de_ctx, copy);
1821 if (result == NULL) {
1841 MpmStoreSetup(
de_ctx, copy);
1842 MpmStoreAdd(
de_ctx, copy);
1864 if (result == NULL) {
1885 MpmStoreSetup(
de_ctx, copy);
1886 MpmStoreAdd(
de_ctx, copy);
1907 SCLogDebug(
"rule group %p has SIG_GROUP_HEAD_HAVERAWSTREAM set", sgh);
1911 SCLogDebug(
"rule group %p does NOT have SIG_GROUP_HEAD_HAVERAWSTREAM set", sgh);
1923 static uint32_t DetectBufferInstanceHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
1930 static char DetectBufferInstanceCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
1937 static void DetectBufferInstanceFreeFunc(
void *ptr)
1949 return HashListTableInit(4096, DetectBufferInstanceHashFunc, DetectBufferInstanceCompareFunc,
1950 DetectBufferInstanceFreeFunc);
1962 memset(engines, 0,
sizeof(engines));
1963 int engines_idx[max_buffer_id];
1964 memset(engines_idx, 0,
sizeof(engines_idx));
1965 int types[max_buffer_id];
1966 memset(types, 0,
sizeof(types));
1970 types[a->sm_list] = a->type;
1974 if (instance == NULL) {
1975 instance =
SCCalloc(1,
sizeof(*instance));
1976 BUG_ON(instance == NULL);
1977 instance->
list = a->sm_list;
1987 if (add_ts || add_tc) {
1988 types[a->sm_list] = a->type;
1989 engines[a->sm_list][engines_idx[a->sm_list]++] = a->frame_v1.alproto;
1993 if (instance == NULL) {
1994 instance =
SCCalloc(1,
sizeof(*instance));
1995 BUG_ON(instance == NULL);
1996 instance->
list = a->sm_list;
1997 instance->
alproto = a->frame_v1.alproto;
2007 if (add_ts || add_tc) {
2008 types[a->sm_list] = a->type;
2009 engines[a->sm_list][engines_idx[a->sm_list]++] = a->app_v2.alproto;
2013 if (instance == NULL) {
2014 instance =
SCCalloc(1,
sizeof(*instance));
2015 BUG_ON(instance == NULL);
2016 instance->
list = a->sm_list;
2017 instance->
alproto = a->app_v2.alproto;
2025 for (uint32_t sig = 0; sig < sh->
init->
sig_cnt; sig++) {
2037 switch (types[list]) {
2041 for (
int e = 0; e < engines_idx[list]; e++) {
2042 const AppProto alproto = engines[list][e];
2048 if (instance == NULL)
2081 if (instance == NULL)
2112 if (instance == NULL) {
2119 MpmStore *mpm_store = MpmStorePrepareBufferPkt(
de_ctx, sh, a, sa);
2120 if (mpm_store != NULL) {
2123 SCLogDebug(
"a %p a->name %s a->reg->PrefilterRegisterWithListId %p "
2124 "mpm_store->mpm_ctx %p", a, a->name,
2125 a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2129 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2132 a, a->sm_list) != 0);
2133 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2142 if (instance == NULL) {
2150 SCLogDebug(
"a %s direction %d PrefilterRegisterWithListId %p", a->name, a->direction,
2151 a->PrefilterRegisterWithListId);
2152 MpmStore *mpm_store = MpmStorePrepareBufferFrame(
de_ctx, sh, a, sa);
2153 if (mpm_store != NULL) {
2156 SCLogDebug(
"a %p a->name %s a->reg->PrefilterRegisterWithListId %p "
2157 "mpm_store->mpm_ctx %p",
2158 a, a->name, a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2163 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2164 BUG_ON(a->PrefilterRegisterWithListId(
2166 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2177 if (instance == NULL) {
2185 MpmStore *mpm_store = MpmStorePrepareBufferAppLayer(
de_ctx, sh, a, sa);
2186 if (mpm_store != NULL) {
2189 SCLogDebug(
"a %p a->name %s a->PrefilterRegisterWithListId %p "
2190 "mpm_store->mpm_ctx %p",
2191 a, a->name, a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2195 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2196 BUG_ON(a->PrefilterRegisterWithListId(
2198 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2215 if (mpm_store != NULL) {
2220 if (mpm_store != NULL) {
2224 SetRawReassemblyFlag(
de_ctx, sh);
2228 if (mpm_store != NULL) {
2233 if (mpm_store != NULL) {
2237 SetRawReassemblyFlag(
de_ctx, sh);
2239 }
else if (
SGH_PROTO(sh, IPPROTO_UDP)) {
2242 if (mpm_store != NULL) {
2248 if (mpm_store != NULL) {
2254 if (mpm_store != NULL) {
2278 static uint32_t PatternChopHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
2281 uint32_t hash = p->
sm_list + ContentFlagsForHash(p->
cd);
2283 const uint8_t *content = p->
cd->
content;
2301 static uint32_t PatternNoChopHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
2304 uint32_t hash = p->
sm_list + ContentFlagsForHash(p->
cd);
2320 static char PatternChopCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
2328 if (ContentFlagsForHash(p1->
cd) != ContentFlagsForHash(p2->
cd))
2344 if (p1_content_len != p2_content_len)
2347 if (memcmp(p1_content, p2_content, p1_content_len) != 0) {
2365 static char PatternNoChopCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
2373 if (ContentFlagsForHash(p1->
cd) != ContentFlagsForHash(p2->
cd))
2386 static void PatternFreeFunc(
void *ptr)
2418 HashListTableInit(4096, PatternChopHashFunc, PatternChopCompareFunc, PatternFreeFunc);
2449 SCLogDebug(
"%u: add id %u cnt %u", s->
id, add->cd->id, add->cnt);
2466 4096, PatternNoChopHashFunc, PatternNoChopCompareFunc, PatternFreeFunc);
2472 switch (smd->
type) {
2502 for (; app != NULL; app = app->
next) {
2506 switch (smd->
type) {
2511 .
cd = cd, .sm_list = app->
sm_list, .cnt = 0, .mpm = 0
2536 for (; pkt != NULL; pkt = pkt->
next) {
2543 switch (smd->
type) {
2548 .
cd = cd, .sm_list = pkt->
sm_list, .cnt = 0, .mpm = 0
2573 for (; frame != NULL; frame = frame->
next) {
2580 switch (smd->
type) {
2585 .
cd = cd, .sm_list = frame->
sm_list, .cnt = 0, .mpm = 0
void MpmInitThreadCtx(MpmThreadCtx *mpm_thread_ctx, uint16_t matcher)
#define DETECT_CONTENT_NOCASE
int SignatureHasPacketContent(const Signature *s)
check if a signature has patterns that are to be inspected against a packets payload (as opposed to t...
uint32_t pkt_mpms_list_cnt
#define HashListTableGetListData(hb)
uint32_t frame_mpms_list_cnt
uint32_t max_content_list_id
#define SGH_DIRECTION_TC(sgh)
void DetectAppLayerMpmRegister2(const char *name, int direction, int priority, PrefilterRegisterFunc PrefilterRegister, InspectionBufferGetDataPtr GetData, AppProto alproto, int tx_min_progress)
register a MPM engine
#define DETECT_CONTENT_FAST_PATTERN_CHOP
struct SigMatch_ * smlists[DETECT_SM_LIST_MAX]
void PatternMatchDestroy(MpmCtx *mpm_ctx, uint16_t mpm_matcher)
int32_t sgh_mpm_context_proto_tcp_packet
int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh)
Prepare the pattern matcher ctx in a sig group head.
struct SCFPSupportSMList_ * next
struct DetectEngineAppInspectionEngine_ * next
void MpmStoreFree(DetectEngineCtx *de_ctx)
Frees the hash table - DetectEngineCtx->mpm_hash_table, allocated by MpmStoreInit() function.
void DetectFrameMpmRegisterByParentId(DetectEngineCtx *de_ctx, const int id, const int parent_id, DetectEngineTransforms *transforms)
copy a mpm engine from parent_id, add in transforms
int ConfGetBool(const char *name, int *val)
Retrieve a configuration value as a boolean.
Container for matching data for a signature group.
HashListTable * pattern_hash_table
void MpmFactoryReClaimMpmCtx(const DetectEngineCtx *de_ctx, MpmCtx *mpm_ctx)
void MpmStoreReportStats(const DetectEngineCtx *de_ctx)
void DetectPktMpmRegister(const char *name, int priority, int(*PrefilterRegister)(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id), InspectionBufferGetPktDataPtr GetData)
register a MPM engine
void DetectBufferTypeSupportsFrames(const char *name)
void DetectMpmInitializeFrameMpms(DetectEngineCtx *de_ctx)
@ DETECT_SM_LIST_DYNAMIC_START
#define DETECT_CONTENT_NO_DOUBLE_INSPECTION_REQUIRED
uint32_t PatternStrength(uint8_t *pat, uint16_t patlen)
Predict a strength value for patterns.
DetectBufferMpmRegistry * pkt_mpms_list
@ DETECT_BUFFER_MPM_TYPE_FRAME
int DetectSetFastPatternAndItsId(DetectEngineCtx *de_ctx)
Figure out the FP and their respective content ids for all the sigs in the engine.
InspectionBuffer *(* InspectionBufferGetDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Flow *f, const uint8_t flow_flags, void *txv, const int list_id)
const char * AppProtoToString(AppProto alproto)
Maps the ALPROTO_*, to its string equivalent.
main detection engine ctx
#define DETECT_CONTENT_MPM_IS_CONCLUSIVE(c)
HashListTableBucket * HashListTableGetListHead(HashListTable *ht)
#define DETECT_CONTENT_DEPTH_VAR
InspectionBuffer *(* InspectionBufferGetPktDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Packet *p, const int list_id)
const char * DetectEngineBufferTypeGetNameById(const DetectEngineCtx *de_ctx, const int id)
void DetectMpmInitializeBuiltinMpms(DetectEngineCtx *de_ctx)
struct DetectBufferMpmRegistry_ * next
#define SIG_FLAG_REQUIRE_STREAM
one time registration of keywords at start up
const struct DetectContentData_ * cd
#define SIG_GROUP_HEAD_HAVERAWSTREAM
uint8_t mpm_default_matcher
SigMatchData * sm_arrays[DETECT_SM_LIST_MAX]
void * HashListTableLookup(HashListTable *ht, void *data, uint16_t datalen)
#define SIG_FLAG_TOCLIENT
int32_t sgh_mpm_context_proto_udp_packet
DetectEngineTransforms transforms
void ShortenString(const char *input, char *output, size_t output_size, char c)
void DetectEngineRegisterFastPatternForId(DetectEngineCtx *de_ctx, int list_id, int priority)
void EngineAnalysisAddAllRulePatterns(DetectEngineCtx *de_ctx, const Signature *s)
add all patterns on our stats hash Used to fill the hash later used by DumpPatterns()
DetectEngineFrameInspectionEngine * frame_inspect
int DetectBufferTypeGetByName(const char *name)
int HashListTableAdd(HashListTable *ht, void *data, uint16_t datalen)
size_t strlcpy(char *dst, const char *src, size_t siz)
void DetectAppLayerMpmRegisterByParentId(DetectEngineCtx *de_ctx, const int id, const int parent_id, DetectEngineTransforms *transforms)
copy a mpm engine from parent_id, add in transforms
void MpmInitCtx(MpmCtx *mpm_ctx, uint8_t matcher)
int32_t sgh_mpm_context_proto_other_packet
int ConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
#define HashListTableGetListNext(hb)
#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 *))
#define DETECT_CONTENT_ENDS_WITH
MpmCtx * MpmFactoryGetMpmCtxForProfile(const DetectEngineCtx *de_ctx, int32_t id, int direction)
void DetectMpmInitializePktMpms(DetectEngineCtx *de_ctx)
#define MPM_PATTERN_CTX_OWNS_ID
size_t strlcat(char *, const char *src, size_t siz)
#define DetectEngineGetMaxSigId(de_ctx)
#define DETECT_CONTENT_DEPTH
DetectEnginePktInspectionEngine * pkt_inspect
struct DetectBufferMpmRegistry_::@86::@89 pkt_v1
#define DETECT_CONTENT_IS_SINGLE(c)
#define DETECT_CONTENT_NEGATED
int PrefilterGenericMpmRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
void PatternMatchThreadPrepare(MpmThreadCtx *mpm_thread_ctx, uint16_t mpm_matcher)
int DetectEngineBufferTypeRegister(DetectEngineCtx *de_ctx, const char *name)
SigGroupHeadInitData * init
DetectEngineAppInspectionEngine * app_inspect
#define MPMCTX_FLAGS_GLOBAL
int(* PrefilterRegisterFunc)(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
int32_t MpmFactoryRegisterMpmCtxProfile(DetectEngineCtx *de_ctx, const char *name, const int sm_list, const AppProto alproto)
Register a new Mpm Context.
void PatternMatchThreadPrint(MpmThreadCtx *mpm_thread_ctx, uint16_t mpm_matcher)
int32_t sgh_mpm_context_stream
void DetectEngineBufferTypeSupportsFrames(DetectEngineCtx *de_ctx, const char *name)
DetectBufferMpmRegistry * frame_mpms_list
int PrefilterPktPayloadRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx)
@ ENGINE_SGH_MPM_FACTORY_CONTEXT_SINGLE
@ DETECT_BUFFER_MPM_TYPE_PKT
int(* Prepare)(struct MpmCtx_ *)
SignatureInitData * init_data
int FastPatternSupportEnabledForSigMatchList(const DetectEngineCtx *de_ctx, const int list_id)
Checks if a particular buffer is in the list of lists that need to be searched for a keyword that has...
enum DetectBufferMpmType type
int MpmAddPatternCS(struct MpmCtx_ *mpm_ctx, uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
void DetectEngineBufferTypeSupportsTransformations(DetectEngineCtx *de_ctx, const char *name)
#define SGH_DIRECTION_TS(sgh)
int PrefilterGenericMpmPktRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
MpmStore * MpmStorePrepareBuffer(DetectEngineCtx *de_ctx, SigGroupHead *sgh, enum MpmBuiltinBuffers buf)
Get MpmStore for a built-in buffer type.
int DetectMpmPrepareFrameMpms(DetectEngineCtx *de_ctx)
initialize mpm contexts for applayer buffers that are in "single or "shared" mode.
void DetectEngineFrameMpmRegister(DetectEngineCtx *de_ctx, const char *name, int direction, int priority, int(*PrefilterRegister)(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id), AppProto alproto, uint8_t type)
int SignatureHasStreamContent(const Signature *s)
check if a signature has patterns that are to be inspected against the stream payload (as opposed to ...
enum DetectBufferMpmType type
int MpmStoreInit(DetectEngineCtx *de_ctx)
Initializes the MpmStore mpm hash table to be used by the detection engine context.
DetectBufferMpmRegistry * app_mpms_list
@ DETECT_BUFFER_MPM_TYPE_APP
void DetectBufferTypeSupportsMpm(const char *name)
struct DetectBufferMpmRegistry_::@86::@88 app_v2
void HashListTableFree(HashListTable *ht)
void SupportFastPatternForSigMatchList(int list_id, int priority)
Lets one add a sm list id to be searched for potential fp supported keywords later.
SigTableElmt sigmatch_table[DETECT_TBLSIZE]
struct DetectEngineFrameInspectionEngine * next
struct DetectEnginePktInspectionEngine * next
uint8_t PatternMatchDefaultMatcher(void)
Function to return the multi pattern matcher algorithm to be used by the engine, based on the mpm-alg...
int DetectMpmPreparePktMpms(DetectEngineCtx *de_ctx)
initialize mpm contexts for applayer buffers that are in "single or "shared" mode.
void DetectEngineBufferTypeSupportsMpm(DetectEngineCtx *de_ctx, const char *name)
uint32_t app_mpms_list_cnt
void DetectBufferTypeSupportsTransformations(const char *name)
const char * builtin_mpms[]
SignatureInitDataBuffer * buffers
HashListTable * mpm_hash_table
void(* DestroyCtx)(struct MpmCtx_ *)
int SigMatchListSMBelongsTo(const Signature *s, const SigMatch *key_sm)
#define MPM_CTX_FACTORY_UNIQUE_CONTEXT
int DetectMpmPrepareBuiltinMpms(DetectEngineCtx *de_ctx)
initialize mpm contexts for builtin buffers that are in "single or "shared" mode.
#define DETECT_CONTENT_OFFSET
int(* PrefilterRegisterWithListId)(struct DetectEngineCtx_ *de_ctx, struct SigGroupHead_ *sgh, MpmCtx *mpm_ctx, const struct DetectBufferMpmRegistry_ *mpm_reg, int list_id)
#define DETECT_CONTENT_MPM
a single match condition for a signature
MpmTableElmt mpm_table[MPM_TABLE_SIZE]
void DetectMpmInitializeAppMpms(DetectEngineCtx *de_ctx)
@ DETECT_BUFFER_MPM_TYPE_SIZE
void(* DestroyThreadCtx)(struct MpmCtx_ *, struct MpmThreadCtx_ *)
#define SGH_PROTO(sgh, p)
#define DETECT_CONTENT_REPLACE
void DetectPktMpmRegisterByParentId(DetectEngineCtx *de_ctx, const int id, const int parent_id, DetectEngineTransforms *transforms)
copy a mpm engine from parent_id, add in transforms
#define DETECT_CONTENT_FAST_PATTERN
void DetectFrameMpmRegister(const char *name, int direction, int priority, int(*PrefilterRegister)(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id), AppProto alproto, uint8_t type)
register a MPM engine
struct DetectBufferInstance DetectBufferInstance
int MpmAddPatternCI(struct MpmCtx_ *mpm_ctx, uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
#define SCMemcmp(a, b, c)
int DetectMpmPrepareAppMpms(DetectEngineCtx *de_ctx)
initialize mpm contexts for applayer buffers that are in "single or "shared" mode.
SCFPSupportSMList * fp_support_smlist_list
#define DEBUG_VALIDATE_BUG_ON(exp)
#define SIG_FLAG_PREFILTER
void PatternMatchThreadDestroy(MpmThreadCtx *mpm_thread_ctx, uint16_t mpm_matcher)
enum MpmBuiltinBuffers buffer
struct DetectBufferMpmRegistry_::@86::@90 frame_v1
void RetrieveFPForSig(const DetectEngineCtx *de_ctx, Signature *s)
uint32_t StringHashDjb2(const uint8_t *data, uint32_t datalen)
int PrefilterPktStreamRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx)
#define DETECT_CONTENT_OFFSET_VAR
#define SIG_FLAG_REQUIRE_PACKET