46 #ifdef BUILD_HYPERSCAN
50 void SCHSInitCtx(
MpmCtx *);
52 void SCHSDestroyCtx(
MpmCtx *);
54 int SCHSAddPatternCI(
MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t,
56 int SCHSAddPatternCS(
MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t,
58 int SCHSPreparePatterns(
MpmCtx *mpm_ctx);
61 void SCHSPrintInfo(
MpmCtx *mpm_ctx);
63 void SCHSRegisterTests(
void);
66 #define INIT_HASH_SIZE 65536
69 #define INIT_DB_HASH_SIZE 1000
74 static hs_scratch_t *g_scratch_proto = NULL;
87 static void *SCHSMalloc(
size_t size)
97 static void SCHSFree(
void *ptr)
107 static void SCHSSetAllocators(
void)
109 hs_error_t err = hs_set_allocator(SCHSMalloc, SCHSFree);
110 if (err != HS_SUCCESS) {
111 FatalError(
"Failed to set Hyperscan allocator.");
125 static inline uint32_t SCHSInitHashRaw(uint8_t *pat, uint16_t patlen)
127 uint32_t hash = patlen * pat[0];
131 return (hash % INIT_HASH_SIZE);
147 uint16_t patlen, uint16_t
offset,
148 uint16_t depth,
char flags,
151 uint32_t hash = SCHSInitHashRaw(pat, patlen);
158 for (; t != NULL; t = t->
next) {
209 if (p != NULL && p->
sids != NULL) {
220 static inline uint32_t SCHSInitHash(
SCHSPattern *p)
226 return (hash % INIT_HASH_SIZE);
231 uint32_t hash = SCHSInitHash(p);
270 static int SCHSAddPattern(
MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
271 uint16_t
offset, uint16_t depth, uint32_t pid,
290 SCHSInitHashLookup(ctx, pat, patlen,
offset, depth,
flags, pid);
295 p = SCHSAllocPattern(mpm_ctx);
312 if (SCHSInitHashAdd(ctx, p) != 0)
324 SCLogDebug(
"%p: alas, no depth for us", mpm_ctx);
328 if (mpm_ctx->
maxlen < patlen)
331 if (mpm_ctx->
minlen == 0) {
334 if (mpm_ctx->
minlen > patlen)
348 if (p->
sids[x] == sid) {
365 SCHSFreePattern(mpm_ctx, p);
373 typedef struct SCHSCompileData_ {
378 unsigned int pattern_cnt;
381 static SCHSCompileData *SCHSAllocCompileData(
unsigned int pattern_cnt)
383 SCHSCompileData *cd =
SCMalloc(pattern_cnt *
sizeof(SCHSCompileData));
387 memset(cd, 0, pattern_cnt *
sizeof(SCHSCompileData));
389 cd->pattern_cnt = pattern_cnt;
391 cd->ids =
SCMalloc(pattern_cnt *
sizeof(
unsigned int));
392 if (cd->ids == NULL) {
395 memset(cd->ids, 0, pattern_cnt *
sizeof(
unsigned int));
397 cd->flags =
SCMalloc(pattern_cnt *
sizeof(
unsigned int));
398 if (cd->flags == NULL) {
401 memset(cd->flags, 0, pattern_cnt *
sizeof(
unsigned int));
403 cd->expressions =
SCMalloc(pattern_cnt *
sizeof(
char *));
404 if (cd->expressions == NULL) {
407 memset(cd->expressions, 0, pattern_cnt *
sizeof(
char *));
409 cd->ext =
SCMalloc(pattern_cnt *
sizeof(hs_expr_ext_t *));
410 if (cd->ext == NULL) {
413 memset(cd->ext, 0, pattern_cnt *
sizeof(hs_expr_ext_t *));
429 static void SCHSFreeCompileData(SCHSCompileData *cd)
437 if (cd->expressions) {
438 for (
unsigned int i = 0; i < cd->pattern_cnt; i++) {
439 SCFree(cd->expressions[i]);
444 for (
unsigned int i = 0; i < cd->pattern_cnt; i++) {
452 typedef struct PatternDatabase_ {
454 hs_database_t *hs_db;
455 uint32_t pattern_cnt;
461 static uint32_t SCHSPatternHash(
const SCHSPattern *p, uint32_t hash)
497 static uint32_t PatternDatabaseHash(
HashTable *ht,
void *data, uint16_t
len)
499 const PatternDatabase *pd = data;
501 hash =
hashword(&pd->pattern_cnt, 1, hash);
503 for (uint32_t i = 0; i < pd->pattern_cnt; i++) {
504 hash = SCHSPatternHash(pd->parray[i], hash);
511 static char PatternDatabaseCompare(
void *data1, uint16_t len1,
void *data2,
514 const PatternDatabase *pd1 = data1;
515 const PatternDatabase *pd2 = data2;
517 if (pd1->pattern_cnt != pd2->pattern_cnt) {
521 for (uint32_t i = 0; i < pd1->pattern_cnt; i++) {
522 if (SCHSPatternCompare(pd1->parray[i], pd2->parray[i]) == 0) {
530 static void PatternDatabaseFree(PatternDatabase *pd)
534 if (pd->parray != NULL) {
535 for (uint32_t i = 0; i < pd->pattern_cnt; i++) {
546 hs_free_database(pd->hs_db);
551 static void PatternDatabaseTableFree(
void *data)
557 static PatternDatabase *PatternDatabaseAlloc(uint32_t pattern_cnt)
559 PatternDatabase *pd =
SCMalloc(
sizeof(PatternDatabase));
563 memset(pd, 0,
sizeof(PatternDatabase));
564 pd->pattern_cnt = pattern_cnt;
571 if (pd->parray == NULL) {
575 memset(pd->parray, 0, pd->pattern_cnt *
sizeof(
SCHSPattern *));
585 int SCHSPreparePatterns(
MpmCtx *mpm_ctx)
590 SCLogDebug(
"no patterns supplied to this mpm_ctx");
595 hs_compile_error_t *compile_err = NULL;
596 SCHSCompileData *cd = NULL;
597 PatternDatabase *pd = NULL;
610 for (uint32_t i = 0, p = 0; i < INIT_HASH_SIZE; i++) {
612 while (node != NULL) {
615 pd->parray[p++] = node;
629 if (g_db_table == NULL) {
630 g_db_table =
HashTableInit(INIT_DB_HASH_SIZE, PatternDatabaseHash,
631 PatternDatabaseCompare,
632 PatternDatabaseTableFree);
633 if (g_db_table == NULL) {
643 if (pd_cached != NULL) {
644 SCLogDebug(
"Reusing cached database %p with %" PRIu32
645 " patterns (ref_cnt=%" PRIu32
")",
646 pd_cached->hs_db, pd_cached->pattern_cnt,
648 pd_cached->ref_cnt++;
651 PatternDatabaseFree(pd);
652 SCHSFreeCompileData(cd);
658 for (uint32_t i = 0; i < pd->pattern_cnt; i++) {
662 cd->
flags[i] = HS_FLAG_SINGLEMATCH;
664 cd->flags[i] |= HS_FLAG_CASELESS;
670 cd->ext[i] =
SCMalloc(
sizeof(hs_expr_ext_t));
671 if (cd->ext[i] == NULL) {
675 memset(cd->ext[i], 0,
sizeof(hs_expr_ext_t));
678 cd->ext[i]->flags |= HS_EXT_FLAG_MIN_OFFSET;
679 cd->ext[i]->min_offset = p->
offset + p->
len;
682 cd->ext[i]->flags |= HS_EXT_FLAG_MAX_OFFSET;
690 err = hs_compile_ext_multi((
const char *
const *)cd->expressions, cd->flags,
691 cd->ids, (
const hs_expr_ext_t *
const *)cd->ext,
692 cd->pattern_cnt, HS_MODE_BLOCK, NULL, &pd->hs_db,
695 if (err != HS_SUCCESS) {
696 SCLogError(
"failed to compile hyperscan database");
698 SCLogError(
"compile error: %s", compile_err->message);
700 hs_free_compile_error(compile_err);
708 err = hs_alloc_scratch(pd->hs_db, &g_scratch_proto);
710 if (err != HS_SUCCESS) {
716 err = hs_database_size(pd->hs_db, &ctx->
hs_db_size);
717 if (err != HS_SUCCESS) {
726 SCLogDebug(
"Built %" PRIu32
" patterns into a database of size %" PRIuMAX
736 SCHSFreeCompileData(cd);
741 PatternDatabaseFree(pd);
744 SCHSFreeCompileData(cd);
763 mpm_thread_ctx->
ctx = ctx;
774 if (g_scratch_proto == NULL) {
782 hs_error_t err = hs_clone_scratch(g_scratch_proto,
783 (hs_scratch_t **)&ctx->
scratch);
787 if (err != HS_SUCCESS) {
788 FatalError(
"Unable to clone scratch prototype");
792 if (err != HS_SUCCESS) {
805 void SCHSInitCtx(
MpmCtx *mpm_ctx)
807 if (mpm_ctx->
ctx != NULL)
811 if (mpm_ctx->
ctx == NULL) {
836 SCHSPrintSearchStats(mpm_thread_ctx);
838 if (mpm_thread_ctx->
ctx != NULL) {
841 if (thr_ctx->
scratch != NULL) {
842 hs_free_scratch(thr_ctx->
scratch);
848 mpm_thread_ctx->
ctx = NULL;
859 void SCHSDestroyCtx(
MpmCtx *mpm_ctx)
879 if (pd->ref_cnt == 0) {
881 PatternDatabaseFree(pd);
891 typedef struct SCHSCallbackCtx_ {
894 uint32_t match_count;
898 static int SCHSMatchEvent(
unsigned int id,
unsigned long long from,
899 unsigned long long to,
unsigned int flags,
902 SCHSCallbackCtx *cctx = ctx;
904 const PatternDatabase *pd = cctx->ctx->pattern_db;
907 SCLogDebug(
"Hyperscan Match %" PRIu32
": id=%" PRIu32
" @ %" PRIuMAX
908 " (pat id=%" PRIu32
")",
909 cctx->match_count, (uint32_t)
id, (uintmax_t)to, pat->
id);
941 SCHSCallbackCtx cctx = {.ctx = ctx, .pmq = pmq, .match_count = 0};
944 hs_scratch_t *scratch = hs_thread_ctx->scratch;
945 BUG_ON(pd->hs_db == NULL);
948 hs_error_t err = hs_scan(pd->hs_db, (
const char *)buf, buflen, 0, scratch,
949 SCHSMatchEvent, &cctx);
950 if (err != HS_SUCCESS) {
954 SCLogError(
"Hyperscan returned error %d", err);
957 ret = cctx.match_count;
980 int SCHSAddPatternCI(
MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
981 uint16_t
offset, uint16_t depth, uint32_t pid,
985 return SCHSAddPattern(mpm_ctx, pat, patlen,
offset, depth, pid, sid,
flags);
1005 int SCHSAddPatternCS(
MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
1006 uint16_t
offset, uint16_t depth, uint32_t pid,
1009 return SCHSAddPattern(mpm_ctx, pat, patlen,
offset, depth, pid, sid,
flags);
1012 void SCHSPrintSearchStats(
MpmThreadCtx *mpm_thread_ctx)
1017 void SCHSPrintInfo(
MpmCtx *mpm_ctx)
1021 printf(
"MPM HS Information:\n");
1022 printf(
"Memory allocs: %" PRIu32
"\n", mpm_ctx->
memory_cnt);
1023 printf(
"Memory alloced: %" PRIu32
"\n", mpm_ctx->
memory_size);
1024 printf(
" Sizeof:\n");
1025 printf(
" MpmCtx %" PRIuMAX
"\n", (uintmax_t)
sizeof(
MpmCtx));
1026 printf(
" SCHSCtx: %" PRIuMAX
"\n", (uintmax_t)
sizeof(
SCHSCtx));
1027 printf(
" SCHSPattern %" PRIuMAX
"\n", (uintmax_t)
sizeof(
SCHSPattern));
1028 printf(
"Unique Patterns: %" PRIu32
"\n", mpm_ctx->
pattern_cnt);
1029 printf(
"Smallest: %" PRIu32
"\n", mpm_ctx->
minlen);
1030 printf(
"Largest: %" PRIu32
"\n", mpm_ctx->
maxlen);
1035 char *db_info = NULL;
1036 if (hs_database_info(pd->hs_db, &db_info) == HS_SUCCESS) {
1037 printf(
"HS Database Info: %s\n", db_info);
1040 printf(
"HS Database Size: %" PRIuMAX
" bytes\n",
1068 SCHSSetAllocators();
1079 if (g_scratch_proto) {
1080 SCLogDebug(
"Cleaning up Hyperscan global scratch");
1081 hs_free_scratch(g_scratch_proto);
1082 g_scratch_proto = NULL;
1087 if (g_db_table != NULL) {
1088 SCLogDebug(
"Clearing Hyperscan database cache");
1100 static int SCHSTest01(
void)
1107 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1115 SCHSPreparePatterns(&mpm_ctx);
1116 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1118 const char *buf =
"abcdefghjiklmnopqrstuvwxyz";
1120 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1126 printf(
"1 != %" PRIu32
" ", cnt);
1128 SCHSDestroyCtx(&mpm_ctx);
1129 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1134 static int SCHSTest02(
void)
1141 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1149 SCHSPreparePatterns(&mpm_ctx);
1150 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1152 const char *buf =
"abcdefghjiklmnopqrstuvwxyz";
1153 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1159 printf(
"0 != %" PRIu32
" ", cnt);
1161 SCHSDestroyCtx(&mpm_ctx);
1162 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1167 static int SCHSTest03(
void)
1174 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1186 SCHSPreparePatterns(&mpm_ctx);
1187 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1189 const char *buf =
"abcdefghjiklmnopqrstuvwxyz";
1190 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1196 printf(
"3 != %" PRIu32
" ", cnt);
1198 SCHSDestroyCtx(&mpm_ctx);
1199 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1204 static int SCHSTest04(
void)
1211 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1220 SCHSPreparePatterns(&mpm_ctx);
1221 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1223 const char *buf =
"abcdefghjiklmnopqrstuvwxyz";
1224 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1230 printf(
"1 != %" PRIu32
" ", cnt);
1232 SCHSDestroyCtx(&mpm_ctx);
1233 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1238 static int SCHSTest05(
void)
1245 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1254 SCHSPreparePatterns(&mpm_ctx);
1255 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1257 const char *buf =
"abcdefghjiklmnopqrstuvwxyz";
1258 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1264 printf(
"3 != %" PRIu32
" ", cnt);
1266 SCHSDestroyCtx(&mpm_ctx);
1267 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1272 static int SCHSTest06(
void)
1279 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1286 SCHSPreparePatterns(&mpm_ctx);
1287 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1289 const char *buf =
"abcd";
1290 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1296 printf(
"1 != %" PRIu32
" ", cnt);
1298 SCHSDestroyCtx(&mpm_ctx);
1299 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1304 static int SCHSTest07(
void)
1311 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1324 MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"AAAAAAAAAA", 10, 0, 0, 4, 0, 0);
1326 MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30,
1330 SCHSPreparePatterns(&mpm_ctx);
1331 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1333 const char *buf =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
1334 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1340 printf(
"6 != %" PRIu32
" ", cnt);
1342 SCHSDestroyCtx(&mpm_ctx);
1343 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1348 static int SCHSTest08(
void)
1355 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1363 SCHSPreparePatterns(&mpm_ctx);
1364 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1367 SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)
"a", 1);
1372 printf(
"0 != %" PRIu32
" ", cnt);
1374 SCHSDestroyCtx(&mpm_ctx);
1375 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1380 static int SCHSTest09(
void)
1387 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1395 SCHSPreparePatterns(&mpm_ctx);
1396 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1399 SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)
"ab", 2);
1404 printf(
"1 != %" PRIu32
" ", cnt);
1406 SCHSDestroyCtx(&mpm_ctx);
1407 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1412 static int SCHSTest10(
void)
1419 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1427 SCHSPreparePatterns(&mpm_ctx);
1428 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1430 const char *buf =
"01234567890123456789012345678901234567890123456789"
1431 "01234567890123456789012345678901234567890123456789"
1433 "01234567890123456789012345678901234567890123456789"
1434 "01234567890123456789012345678901234567890123456789";
1435 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1441 printf(
"1 != %" PRIu32
" ", cnt);
1443 SCHSDestroyCtx(&mpm_ctx);
1444 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1449 static int SCHSTest11(
void)
1456 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
1460 if (
MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"he", 2, 0, 0, 1, 0, 0) == -1)
1462 if (
MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"she", 3, 0, 0, 2, 0, 0) == -1)
1464 if (
MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"his", 3, 0, 0, 3, 0, 0) == -1)
1466 if (
MpmAddPatternCS(&mpm_ctx, (uint8_t *)
"hers", 4, 0, 0, 4, 0, 0) == -1)
1470 if (SCHSPreparePatterns(&mpm_ctx) == -1)
1473 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1477 const char *buf =
"he";
1478 result &= (SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1481 result &= (SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1484 result &= (SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1487 result &= (SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1491 SCHSDestroyCtx(&mpm_ctx);
1492 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1497 static int SCHSTest12(
void)
1504 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1514 SCHSPreparePatterns(&mpm_ctx);
1515 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1517 const char *buf =
"abcdefghijklmnopqrstuvwxyz";
1518 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1524 printf(
"2 != %" PRIu32
" ", cnt);
1526 SCHSDestroyCtx(&mpm_ctx);
1527 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1532 static int SCHSTest13(
void)
1539 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1544 const char pat[] =
"abcdefghijklmnopqrstuvwxyzABCD";
1545 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1548 SCHSPreparePatterns(&mpm_ctx);
1549 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1551 const char *buf =
"abcdefghijklmnopqrstuvwxyzABCD";
1552 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1558 printf(
"1 != %" PRIu32
" ", cnt);
1560 SCHSDestroyCtx(&mpm_ctx);
1561 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1566 static int SCHSTest14(
void)
1573 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1578 const char pat[] =
"abcdefghijklmnopqrstuvwxyzABCDE";
1579 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1582 SCHSPreparePatterns(&mpm_ctx);
1583 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1585 const char *buf =
"abcdefghijklmnopqrstuvwxyzABCDE";
1586 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1592 printf(
"1 != %" PRIu32
" ", cnt);
1594 SCHSDestroyCtx(&mpm_ctx);
1595 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1600 static int SCHSTest15(
void)
1607 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1612 const char pat[] =
"abcdefghijklmnopqrstuvwxyzABCDEF";
1613 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1616 SCHSPreparePatterns(&mpm_ctx);
1617 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1619 const char *buf =
"abcdefghijklmnopqrstuvwxyzABCDEF";
1620 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1626 printf(
"1 != %" PRIu32
" ", cnt);
1628 SCHSDestroyCtx(&mpm_ctx);
1629 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1634 static int SCHSTest16(
void)
1641 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1646 const char pat[] =
"abcdefghijklmnopqrstuvwxyzABC";
1647 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1650 SCHSPreparePatterns(&mpm_ctx);
1651 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1653 const char *buf =
"abcdefghijklmnopqrstuvwxyzABC";
1654 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1660 printf(
"1 != %" PRIu32
" ", cnt);
1662 SCHSDestroyCtx(&mpm_ctx);
1663 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1668 static int SCHSTest17(
void)
1675 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1680 const char pat[] =
"abcdefghijklmnopqrstuvwxyzAB";
1681 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1684 SCHSPreparePatterns(&mpm_ctx);
1685 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1687 const char *buf =
"abcdefghijklmnopqrstuvwxyzAB";
1688 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1694 printf(
"1 != %" PRIu32
" ", cnt);
1696 SCHSDestroyCtx(&mpm_ctx);
1697 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1702 static int SCHSTest18(
void)
1709 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1714 const char pat[] =
"abcde"
1720 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1723 SCHSPreparePatterns(&mpm_ctx);
1724 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1726 const char *buf =
"abcde"
1732 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1738 printf(
"1 != %" PRIu32
" ", cnt);
1740 SCHSDestroyCtx(&mpm_ctx);
1741 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1746 static int SCHSTest19(
void)
1753 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1758 const char pat[] =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
1759 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1762 SCHSPreparePatterns(&mpm_ctx);
1763 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1765 const char *buf =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
1766 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1772 printf(
"1 != %" PRIu32
" ", cnt);
1774 SCHSDestroyCtx(&mpm_ctx);
1775 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1780 static int SCHSTest20(
void)
1787 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1792 const char pat[] =
"AAAAA"
1799 MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat,
sizeof(pat) - 1, 0, 0, 0, 0, 0);
1802 SCHSPreparePatterns(&mpm_ctx);
1803 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1805 const char *buf =
"AAAAA"
1812 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1818 printf(
"1 != %" PRIu32
" ", cnt);
1820 SCHSDestroyCtx(&mpm_ctx);
1821 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1826 static int SCHSTest21(
void)
1833 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1841 SCHSPreparePatterns(&mpm_ctx);
1842 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1845 SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)
"AA", 2);
1850 printf(
"1 != %" PRIu32
" ", cnt);
1852 SCHSDestroyCtx(&mpm_ctx);
1853 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1858 static int SCHSTest22(
void)
1865 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1875 SCHSPreparePatterns(&mpm_ctx);
1876 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1878 const char *buf =
"abcdefghijklmnopqrstuvwxyz";
1879 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1885 printf(
"2 != %" PRIu32
" ", cnt);
1887 SCHSDestroyCtx(&mpm_ctx);
1888 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1893 static int SCHSTest23(
void)
1900 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1908 SCHSPreparePatterns(&mpm_ctx);
1909 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1912 SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)
"aa", 2);
1917 printf(
"1 != %" PRIu32
" ", cnt);
1919 SCHSDestroyCtx(&mpm_ctx);
1920 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1925 static int SCHSTest24(
void)
1932 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1940 SCHSPreparePatterns(&mpm_ctx);
1941 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1944 SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)
"aa", 2);
1949 printf(
"1 != %" PRIu32
" ", cnt);
1951 SCHSDestroyCtx(&mpm_ctx);
1952 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1957 static int SCHSTest25(
void)
1964 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
1973 SCHSPreparePatterns(&mpm_ctx);
1974 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1976 const char *buf =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
1977 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
1983 printf(
"3 != %" PRIu32
" ", cnt);
1985 SCHSDestroyCtx(&mpm_ctx);
1986 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
1991 static int SCHSTest26(
void)
1998 memset(&mpm_ctx, 0x00,
sizeof(
MpmCtx));
2006 SCHSPreparePatterns(&mpm_ctx);
2007 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2009 const char *buf =
"works";
2010 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
2016 printf(
"3 != %" PRIu32
" ", cnt);
2018 SCHSDestroyCtx(&mpm_ctx);
2019 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2024 static int SCHSTest27(
void)
2031 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
2039 SCHSPreparePatterns(&mpm_ctx);
2040 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2042 const char *buf =
"tone";
2043 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
2049 printf(
"0 != %" PRIu32
" ", cnt);
2051 SCHSDestroyCtx(&mpm_ctx);
2052 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2057 static int SCHSTest28(
void)
2064 memset(&mpm_ctx, 0,
sizeof(
MpmCtx));
2072 SCHSPreparePatterns(&mpm_ctx);
2073 SCHSInitThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2075 const char *buf =
"tONE";
2076 uint32_t cnt = SCHSSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
2082 printf(
"0 != %" PRIu32
" ", cnt);
2084 SCHSDestroyCtx(&mpm_ctx);
2085 SCHSDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
2090 static int SCHSTest29(
void)
2092 uint8_t buf[] =
"onetwothreefourfivesixseveneightnine";
2093 uint16_t buflen =
sizeof(buf) - 1;
2099 memset(&th_v, 0,
sizeof(th_v));
2110 de_ctx,
"alert tcp any any -> any any "
2111 "(content:\"onetwothreefourfivesixseveneightnine\"; sid:1;)");
2116 "(content:\"onetwothreefourfivesixseveneightnine\"; "
2117 "fast_pattern:3,3; sid:2;)");
2126 printf(
"if (PacketAlertCheck(p, 1) != 1) failure\n");
2130 printf(
"if (PacketAlertCheck(p, 1) != 2) failure\n");
2150 void SCHSRegisterTests(
void)