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",
89 static void RegisterInternal(
const char *
name,
int direction,
int priority,
94 SCLogDebug(
"registering %s/%d/%d/%p/%p/%u/%d",
name, direction, priority,
95 PrefilterRegister, GetData, alproto, tx_min_progress);
97 BUG_ON(tx_min_progress >= 48);
111 RegisterInternal(
name, direction, priority, PrefilterRegister, GetData, GetDataSingle,
120 am->
sm_list = (int16_t)sm_list;
126 if (GetData != NULL) {
127 am->
app_v2.GetData = GetData;
128 }
else if (GetDataSingle != NULL) {
129 am->
app_v2.GetDataSingle = GetDataSingle;
130 }
else if (GetMultiData != NULL) {
131 am->
app_v2.GetMultiData = GetMultiData;
133 am->
app_v2.alproto = alproto;
134 am->
app_v2.tx_min_progress = tx_min_progress;
140 while (t->
next != NULL) {
154 AppProto alproto,
int tx_min_progress)
156 RegisterInternal(
name, direction, priority, PrefilterRegister, GetData, NULL, NULL, alproto,
162 AppProto alproto,
int tx_min_progress)
164 RegisterInternal(
name, direction, priority, PrefilterRegister, NULL, GetData, NULL, alproto,
170 AppProto alproto,
int tx_min_progress)
172 RegisterInternal(
name, direction, priority, PrefilterRegister, NULL, NULL, GetData, alproto,
179 static void BuildBasicPname(
char *out,
const size_t out_size,
const char *
name,
const uint16_t
id)
192 size_t name_space = out_size - (id_space + 1);
193 char pname[name_space];
194 if (strlen(
name) >= name_space) {
199 snprintf(out, out_size,
"%s#%u", pname,
id);
207 static void AppendTransformsToPname(
210 if (transforms == NULL || transforms->
cnt == 0)
213 ssize_t left = (ssize_t)out_size - (ssize_t)strlen(out) - (ssize_t)4;
221 for (
int i = 0; i < transforms->
cnt; i++) {
223 (void)snprintf(ttstr,
sizeof(ttstr),
"%s,",
225 strlcat(xforms, ttstr,
sizeof(xforms));
227 if (strlen(xforms) == 0)
229 xforms[strlen(xforms) - 1] =
'\0';
230 SCLogDebug(
"left %d '%s' %d", (
int)left, xforms, (
int)strlen(xforms));
232 char xforms_print[out_size];
233 if ((
size_t)left >= strlen(xforms)) {
234 snprintf(xforms_print,
sizeof(xforms_print),
" (%s)", xforms);
236 char xforms_short[out_size];
238 snprintf(xforms_print,
sizeof(xforms_print),
" (%s)", xforms_short);
240 strlcat(out, xforms_print, out_size);
246 const int id,
const int parent_id,
249 SCLogDebug(
"registering %d/%d",
id, parent_id);
272 BuildBasicPname(am->
pname,
sizeof(am->
pname), am->
name, (uint16_t)
id);
274 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
275 AppendTransformsToPname(am->
pname,
sizeof(am->
pname), transforms);
282 SCLogDebug(
"copied mpm registration for %s id %u "
283 "with parent %u and GetData %p",
295 while (list != NULL) {
315 char confstring[256] =
"detect.mpm.";
317 strlcat(confstring,
".shared",
sizeof(confstring));
351 if (mpm_ctx != NULL) {
371 SCLogDebug(
"registering %s/%d/%p/%s/%u",
name, priority, PrefilterRegister,
378 if (sm_list < 0 || sm_list > UINT16_MAX) {
386 am->
sm_list = (uint16_t)sm_list;
401 while (t->
next != NULL) {
417 SCLogDebug(
"registering %d/%d",
id, parent_id);
437 BuildBasicPname(am->
pname,
sizeof(am->
pname), am->
name, (uint16_t)
id);
439 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
440 AppendTransformsToPname(am->
pname,
sizeof(am->
pname), transforms);
446 SCLogDebug(
"copied mpm registration for %s id %u "
448 t->
name,
id, parent_id);
461 SCLogDebug(
"registering %s/%d/%p/%s/%u",
name, priority, PrefilterRegister,
465 if (sm_list < 0 || sm_list > UINT16_MAX) {
477 am->
sm_list = (uint16_t)sm_list;
492 if (
SCConfGetBool(
"detect.mpm.frame.shared", &confshared) == 1)
506 while (t->
next != NULL) {
521 while (list != NULL) {
532 while (t->
next != NULL) {
544 char confstring[256] =
"detect.mpm.";
546 strlcat(confstring,
".shared",
sizeof(confstring));
582 if (mpm_ctx != NULL) {
604 PrefilterRegister, GetData);
621 am->
sm_list = (uint16_t)sm_list;
626 am->
pkt_v1.GetData = GetData;
632 while (t->
next != NULL) {
646 const int id,
const int parent_id,
649 SCLogDebug(
"registering %d/%d",
id, parent_id);
667 BuildBasicPname(am->
pname,
sizeof(am->
pname), am->
name, (uint16_t)
id);
669 memcpy(&am->
transforms, transforms,
sizeof(*transforms));
670 AppendTransformsToPname(am->
pname,
sizeof(am->
pname), transforms);
676 SCLogDebug(
"copied mpm registration for %s id %u "
677 "with parent %u and GetData %p",
688 while (list != NULL) {
699 while (t->
next != NULL) {
711 char confstring[256] =
"detect.mpm.";
713 strlcat(confstring,
".shared",
sizeof(confstring));
747 if (mpm_ctx != NULL) {
766 char confstring[256] =
"detect.mpm.";
768 strlcat(confstring,
".shared",
sizeof(confstring));
857 if (!(s->
proto.
proto[IPPROTO_TCP / 8] & 1 << (IPPROTO_TCP % 8))) {
887 if (!(s->
proto.
proto[IPPROTO_TCP / 8] & 1 << (IPPROTO_TCP % 8))) {
913 const char *mpm_algo;
917 if ((
SCConfGet(
"mpm-algo", &mpm_algo)) == 1) {
918 if (mpm_algo != NULL) {
919 #if __BYTE_ORDER == __BIG_ENDIAN
920 if (strcmp(mpm_algo,
"ac-ks") == 0) {
922 "not work on big endian systems at this time.");
925 if (strcmp(
"auto", mpm_algo) == 0) {
927 }
else if (strcmp(
"ac-bs", mpm_algo) == 0) {
928 SCLogWarning(
"mpm-algo \"ac-bs\" has been removed. See ticket #6586.");
941 #ifndef BUILD_HYPERSCAN
942 if ((strcmp(mpm_algo,
"hs") == 0)) {
943 FatalError(
"Hyperscan (hs) support for mpm-algo is "
944 "not compiled into Suricata.");
949 "in the yaml conf file: \"%s\"",
959 SCLogDebug(
"mpm_ctx %p, mpm_matcher %"PRIu16
"", mpm_ctx, mpm_matcher);
965 SCLogDebug(
"mpm_thread_ctx %p, mpm_matcher %"PRIu16
"", mpm_thread_ctx, mpm_matcher);
970 SCLogDebug(
"mpm_thread_ctx %p, type %"PRIu16, mpm_thread_ctx, mpm_matcher);
990 memset(&a, 0 ,
sizeof(a));
994 for (u = 0; u < patlen; u++) {
995 if (a[pat[u]] == 0) {
998 else if (isprint(pat[u]) || pat[u] == 0x00 || pat[u] == 0x01 || pat[u] == 0xFF)
1015 uint16_t pat_offset = cd->
offset;
1016 uint16_t pat_depth = cd->
depth;
1019 if (chop && (pat_depth || pat_offset)) {
1031 pat_depth = pat_offset = 0;
1053 #define SGH_PROTO(sgh, p) ((sgh)->init->protos[(p)] == 1)
1054 #define SGH_DIRECTION_TS(sgh) ((sgh)->init->direction & SIG_FLAG_TOSERVER)
1055 #define SGH_DIRECTION_TC(sgh) ((sgh)->init->direction & SIG_FLAG_TOCLIENT)
1059 if (s == NULL || mpm_sm == NULL)
1085 uint16_t max_len,
bool skip_negated_content)
1100 if (mpm_sm == NULL) {
1109 }
else if (ls == ss) {
1128 for (; app != NULL; app = app->
next) {
1131 if (app->
dir == 1) {
1153 int pos_sm_list[nlists];
1154 int neg_sm_list[nlists];
1155 memset(pos_sm_list, 0, nlists *
sizeof(
int));
1156 memset(neg_sm_list, 0, nlists *
sizeof(
int));
1157 int pos_sm_list_cnt = 0;
1158 int neg_sm_list_cnt = 0;
1207 SetMpm(s, sm, list_id);
1212 neg_sm_list[list_id] = 1;
1215 pos_sm_list[list_id] = 1;
1223 SCLogDebug(
"neg_sm_list_cnt %d pos_sm_list_cnt %d", neg_sm_list_cnt, pos_sm_list_cnt);
1226 int *curr_sm_list = NULL;
1227 int skip_negated_content = 1;
1228 if (pos_sm_list_cnt > 0) {
1229 curr_sm_list = pos_sm_list;
1230 }
else if (neg_sm_list_cnt > 0) {
1231 curr_sm_list = neg_sm_list;
1232 skip_negated_content = 0;
1237 int final_sm_list[nlists];
1238 memset(&final_sm_list, 0, (nlists *
sizeof(
int)));
1240 int count_final_sm_list = 0;
1241 int count_txbidir_toclient_sm_list = 0;
1245 while (tmp != NULL) {
1247 tmp != NULL && priority == tmp->
priority;
1253 if (curr_sm_list[tmp->
list_id] == 0)
1258 if (count_final_sm_list == 0) {
1260 final_sm_list[count_txbidir_toclient_sm_list++] = tmp->
list_id;
1266 final_sm_list[count_final_sm_list++] = tmp->
list_id;
1269 if (count_final_sm_list != 0)
1275 count_final_sm_list = count_txbidir_toclient_sm_list;
1277 BUG_ON(count_final_sm_list == 0);
1278 SCLogDebug(
"count_final_sm_list %d skip_negated_content %d", count_final_sm_list,
1279 skip_negated_content);
1281 uint16_t max_len = 0;
1282 for (
int i = 0; i < count_final_sm_list; i++) {
1283 SCLogDebug(
"i %d final_sm_list[i] %d", i, final_sm_list[i]);
1306 if (final_sm_list[i] == list_id) {
1327 int mpm_sm_list = -1;
1328 for (
int i = 0; i < count_final_sm_list; i++) {
1334 skip_negated_content);
1335 if (mpm_sm != prev_mpm_sm) {
1336 mpm_sm_list = final_sm_list[i];
1343 if (final_sm_list[i] == list_id) {
1349 skip_negated_content);
1351 if (mpm_sm != prev_mpm_sm) {
1352 mpm_sm_list = list_id;
1360 if (mpm_sm != NULL) {
1361 BUG_ON(mpm_sm_list == -1);
1363 BUG_ON(check_list != mpm_sm_list);
1367 SetMpm(s, mpm_sm, mpm_sm_list);
1379 static uint32_t MpmStoreHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
1401 static char MpmStoreCompareFunc(
void *data1, uint16_t len1,
void *data2,
1431 static void MpmStoreFreeFunc(
void *ptr)
1461 MpmStoreCompareFunc,
1506 while (am != NULL) {
1514 while (am != NULL) {
1530 uint32_t appstats[app_mpms_cnt + 1];
1531 memset(&appstats, 0x00,
sizeof(appstats));
1533 uint32_t pktstats[pkt_mpms_cnt + 1];
1534 memset(&pktstats, 0x00,
sizeof(pktstats));
1536 uint32_t framestats[frame_mpms_cnt + 1];
1537 memset(&framestats, 0x00,
sizeof(framestats));
1544 if (ms == NULL || ms->
mpm_ctx == NULL) {
1554 SCLogDebug(
"%s: %u patterns. Min %u, Max %u. Ctx %p",
1562 SCLogDebug(
"%s %s %s: %u patterns. Min %u, Max %u. Ctx %p",
1583 for (
int x = 0; x <
MPMB_MAX; x++) {
1587 while (am != NULL) {
1588 if (appstats[am->
sm_list] > 0) {
1591 SCLogPerf(
"AppLayer MPM \"%s %s (%s)\": %u", direction,
name,
1597 while (pm != NULL) {
1598 if (pktstats[pm->
sm_list] > 0) {
1605 while (um != NULL) {
1606 if (framestats[um->
sm_list] > 0) {
1675 const bool mpm_supports_endswith =
1680 if (ms->
sid_array[sig / 8] & (1 << (sig % 8))) {
1700 SCLogDebug(
"not adding negated mpm as it's not 'single'");
1737 int sgh_mpm_context = 0;
1739 uint8_t *sids_array =
SCCalloc(1, max_sid);
1740 if (sids_array == NULL) {
1805 sids_array[s->
iid / 8] |= 1 << (s->
iid % 8);
1813 sids_array[s->
iid / 8] |= 1 << (s->
iid % 8);
1819 sids_array[s->
iid / 8] |= 1 << (s->
iid % 8);
1823 sids_array[s->
iid / 8] |= 1 << (s->
iid % 8);
1836 MpmStore lookup = { sids_array, max_sid, direction, buf, sm_list, 0, 0, NULL };
1839 if (result == NULL) {
1843 uint8_t *sids =
SCCalloc(1, max_sid);
1850 memcpy(sids, sids_array, max_sid);
1858 MpmStoreSetup(
de_ctx, copy);
1859 MpmStoreAdd(
de_ctx, copy);
1888 0, am->
app_v2.alproto, NULL };
1893 if (result == NULL) {
1915 MpmStoreSetup(
de_ctx, copy);
1916 MpmStoreAdd(
de_ctx, copy);
1939 if (result == NULL) {
1959 MpmStoreSetup(
de_ctx, copy);
1960 MpmStoreAdd(
de_ctx, copy);
1982 if (result == NULL) {
2003 MpmStoreSetup(
de_ctx, copy);
2004 MpmStoreAdd(
de_ctx, copy);
2025 SCLogDebug(
"rule group %p has SIG_GROUP_HEAD_HAVERAWSTREAM set", sgh);
2029 SCLogDebug(
"rule group %p does NOT have SIG_GROUP_HEAD_HAVERAWSTREAM set", sgh);
2041 static uint32_t DetectBufferInstanceHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
2048 static char DetectBufferInstanceCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
2055 static void DetectBufferInstanceFreeFunc(
void *ptr)
2067 return HashListTableInit(4096, DetectBufferInstanceHashFunc, DetectBufferInstanceCompareFunc,
2068 DetectBufferInstanceFreeFunc);
2080 memset(engines, 0,
sizeof(engines));
2081 int engines_idx[max_buffer_id];
2082 memset(engines_idx, 0,
sizeof(engines_idx));
2083 int types[max_buffer_id];
2084 memset(types, 0,
sizeof(types));
2088 types[a->sm_list] = a->type;
2092 if (instance == NULL) {
2093 instance =
SCCalloc(1,
sizeof(*instance));
2094 BUG_ON(instance == NULL);
2095 instance->
list = a->sm_list;
2105 if (add_ts || add_tc) {
2106 types[a->sm_list] = a->type;
2107 engines[a->sm_list][engines_idx[a->sm_list]++] = a->frame_v1.alproto;
2111 if (instance == NULL) {
2112 instance =
SCCalloc(1,
sizeof(*instance));
2113 BUG_ON(instance == NULL);
2114 instance->
list = a->sm_list;
2115 instance->
alproto = a->frame_v1.alproto;
2125 if (add_ts || add_tc) {
2126 types[a->sm_list] = a->type;
2127 engines[a->sm_list][engines_idx[a->sm_list]++] = a->app_v2.alproto;
2131 if (instance == NULL) {
2132 instance =
SCCalloc(1,
sizeof(*instance));
2133 BUG_ON(instance == NULL);
2134 instance->
list = a->sm_list;
2135 instance->
alproto = a->app_v2.alproto;
2143 for (uint32_t sig = 0; sig < sh->
init->
sig_cnt; sig++) {
2155 switch (types[list]) {
2159 for (
int e = 0; e < engines_idx[list]; e++) {
2160 const AppProto alproto = engines[list][e];
2166 if (instance == NULL)
2199 if (instance == NULL)
2229 if (instance == NULL) {
2236 MpmStore *mpm_store = MpmStorePrepareBufferPkt(
de_ctx, sh, a, sa);
2237 if (mpm_store != NULL) {
2240 SCLogDebug(
"a %p a->name %s a->reg->PrefilterRegisterWithListId %p "
2241 "mpm_store->mpm_ctx %p", a, a->name,
2242 a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2246 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2249 a, a->sm_list) != 0);
2250 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2259 if (instance == NULL) {
2267 SCLogDebug(
"a %s direction %d PrefilterRegisterWithListId %p", a->name, a->direction,
2268 a->PrefilterRegisterWithListId);
2269 MpmStore *mpm_store = MpmStorePrepareBufferFrame(
de_ctx, sh, a, sa);
2270 if (mpm_store != NULL) {
2273 SCLogDebug(
"a %p a->name %s a->reg->PrefilterRegisterWithListId %p "
2274 "mpm_store->mpm_ctx %p",
2275 a, a->name, a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2280 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2281 BUG_ON(a->PrefilterRegisterWithListId(
2283 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2294 if (instance == NULL) {
2302 MpmStore *mpm_store = MpmStorePrepareBufferAppLayer(
de_ctx, sh, a, sa);
2303 if (mpm_store != NULL) {
2306 SCLogDebug(
"a %p a->name %s a->PrefilterRegisterWithListId %p "
2307 "mpm_store->mpm_ctx %p",
2308 a, a->name, a->PrefilterRegisterWithListId, mpm_store->
mpm_ctx);
2312 if (a->PrefilterRegisterWithListId && mpm_store->
mpm_ctx) {
2313 BUG_ON(a->PrefilterRegisterWithListId(
2315 SCLogDebug(
"mpm %s %d set up", a->name, a->sm_list);
2332 if (mpm_store != NULL) {
2337 if (mpm_store != NULL) {
2341 SetRawReassemblyFlag(
de_ctx, sh);
2345 if (mpm_store != NULL) {
2350 if (mpm_store != NULL) {
2354 SetRawReassemblyFlag(
de_ctx, sh);
2356 }
else if (
SGH_PROTO(sh, IPPROTO_UDP)) {
2359 if (mpm_store != NULL) {
2365 if (mpm_store != NULL) {
2371 if (mpm_store != NULL) {
2395 static uint32_t PatternChopHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
2398 uint32_t hash = p->
sm_list + ContentFlagsForHash(p->
cd);
2400 const uint8_t *content = p->
cd->
content;
2418 static uint32_t PatternNoChopHashFunc(
HashListTable *ht,
void *data, uint16_t datalen)
2421 uint32_t hash = p->
sm_list + ContentFlagsForHash(p->
cd);
2437 static char PatternChopCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
2445 if (ContentFlagsForHash(p1->
cd) != ContentFlagsForHash(p2->
cd))
2461 if (p1_content_len != p2_content_len)
2464 if (memcmp(p1_content, p2_content, p1_content_len) != 0) {
2482 static char PatternNoChopCompareFunc(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
2490 if (ContentFlagsForHash(p1->
cd) != ContentFlagsForHash(p2->
cd))
2503 static void PatternFreeFunc(
void *ptr)
2530 HashListTableInit(4096, PatternChopHashFunc, PatternChopCompareFunc, PatternFreeFunc);
2561 SCLogDebug(
"%u: add id %u cnt %u", s->
id, add->cd->id, add->cnt);
2578 4096, PatternNoChopHashFunc, PatternNoChopCompareFunc, PatternFreeFunc);
2584 switch (smd->
type) {
2614 for (; app != NULL; app = app->
next) {
2617 switch (smd->
type) {
2622 .
cd = cd, .sm_list = app->
sm_list, .cnt = 0, .mpm = 0
2647 for (; pkt != NULL; pkt = pkt->
next) {
2654 switch (smd->
type) {
2659 .
cd = cd, .sm_list = pkt->
sm_list, .cnt = 0, .mpm = 0
2684 for (; frame != NULL; frame = frame->
next) {
2691 switch (smd->
type) {
2696 .
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
int PrefilterGenericMpmPktRegister(DetectEngineCtx *de_ctx, SigGroupHead *sgh, MpmCtx *mpm_ctx, const DetectBufferMpmRegistry *mpm_reg, int list_id)
void DetectAppLayerMpmMultiRegister(const char *name, int direction, int priority, PrefilterRegisterFunc PrefilterRegister, InspectionMultiBufferGetDataPtr GetData, AppProto alproto, int tx_min_progress)
#define SGH_DIRECTION_TC(sgh)
#define DETECT_PROFILE_NAME_LEN
#define DETECT_CONTENT_FAST_PATTERN_CHOP
struct SigMatch_ * smlists[DETECT_SM_LIST_MAX]
void PatternMatchDestroy(MpmCtx *mpm_ctx, uint16_t mpm_matcher)
SigTableElmt * sigmatch_table
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
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)
struct DetectBufferMpmRegistry_::@90::@92 app_v2
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.
const char * AppProtoToString(AppProto alproto)
Maps the ALPROTO_*, to its string equivalent.
main detection engine ctx
int SCConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
#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
#define SIG_FLAG_TXBOTHDIR
int SCConfGetBool(const char *name, int *val)
Retrieve a configuration value as a boolean.
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
const char * cache_dir_path
int DetectBufferTypeGetByName(const char *name)
int HashListTableAdd(HashListTable *ht, void *data, uint16_t datalen)
struct DetectBufferMpmRegistry_::@90::@93 pkt_v1
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
#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 *))
void MpmDestroyThreadCtx(MpmThreadCtx *mpm_thread_ctx, const uint16_t matcher)
char pname[DETECT_PROFILE_NAME_LEN]
struct DetectBufferMpmRegistry_::@90::@94 frame_v1
#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)
@ ENGINE_SGH_MPM_FACTORY_CONTEXT_SINGLE
#define DetectEngineGetMaxSigId(de_ctx)
int SCMpmAddPatternCI(MpmCtx *mpm_ctx, const uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
#define DETECT_CONTENT_DEPTH
DetectEnginePktInspectionEngine * pkt_inspect
bool(* InspectionSingleBufferGetDataPtr)(const void *txv, const uint8_t flow_flags, const uint8_t **buf, uint32_t *buf_len)
#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)
#define SCLogWarning(...)
Macro used to log WARNING messages.
int DetectEngineBufferTypeRegister(DetectEngineCtx *de_ctx, const char *name)
SigGroupHeadInitData * init
void DetectAppLayerMpmRegister(const char *name, int direction, int priority, PrefilterRegisterFunc PrefilterRegister, InspectionBufferGetDataPtr GetData, AppProto alproto, int tx_min_progress)
register an app layer keyword for mpm
DetectEngineAppInspectionEngine * app_inspect
bool DetectBufferToClient(const DetectEngineCtx *de_ctx, int buf_id, AppProto alproto)
#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.
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)
@ DETECT_BUFFER_MPM_TYPE_PKT
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)
bool(* InspectionMultiBufferGetDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const void *txv, const uint8_t flow_flags, uint32_t local_id, const uint8_t **buf, uint32_t *buf_len)
#define SGH_DIRECTION_TS(sgh)
#define MPM_FEATURE_FLAG_ENDSWITH
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.
void DetectAppLayerMpmRegisterSingle(const char *name, int direction, int priority, PrefilterRegisterFunc PrefilterRegister, InspectionSingleBufferGetDataPtr GetData, AppProto alproto, int tx_min_progress)
DetectBufferMpmRegistry * app_mpms_list
@ DETECT_BUFFER_MPM_TYPE_APP
void DetectBufferTypeSupportsMpm(const char *name)
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.
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)
#define MPM_PATTERN_FLAG_ENDSWITH
const char * builtin_mpms[]
SignatureInitDataBuffer * buffers
DetectEngineAppInspectionEngine * app_inspect_engines
HashListTable * mpm_hash_table
int(* Prepare)(MpmConfig *, struct MpmCtx_ *)
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)
InspectionBuffer *(* InspectionBufferGetDataPtr)(struct DetectEngineThreadCtx_ *det_ctx, const DetectEngineTransforms *transforms, Flow *f, const uint8_t flow_flags, void *txv, const int list_id)
@ DETECT_BUFFER_MPM_TYPE_SIZE
#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
#define MPMCTX_FLAGS_CACHE_TO_DISK
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
#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)
void PatternMatchThreadDestroy(MpmThreadCtx *mpm_thread_ctx, uint16_t mpm_matcher)
enum MpmBuiltinBuffers buffer
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