Remove: ac-gfbs, wumanber, b2g, b3g.
util-misc.c util-misc.h \
util-mpm-ac-bs.c util-mpm-ac-bs.h \
util-mpm-ac.c util-mpm-ac.h \
-util-mpm-ac-gfbs.c util-mpm-ac-gfbs.h \
util-mpm-ac-tile.c util-mpm-ac-tile.h \
util-mpm-ac-tile-small.c \
-util-mpm-b2g.c util-mpm-b2g.h \
-util-mpm-b3g.c util-mpm-b3g.h \
util-mpm-hs.c util-mpm-hs.h \
util-mpm.c util-mpm.h \
-util-mpm-wumanber.c util-mpm-wumanber.h \
util-optimize.h \
util-path.c util-path.h \
util-pidfile.c util-pidfile.h \
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert http any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert http any !80 -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert ftp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert http any !80 -> any any "
ssn.toserver_smsg_head = stream_msg;
ssn.toserver_smsg_tail = stream_msg;
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert http any any -> any any "
* \internal
* \brief This test tests sameip success and failure.
*/
-static int DetectAckSigTest01Real(int mpm_type)
+static int DetectAckSigTest01(void)
{
Packet *p1 = NULL;
Packet *p2 = NULL;
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
/* These three are crammed in here as there is no Parse */
return result;
}
-/**
- * \test DetectAckSigTest01B2g tests sameip under B2g MPM
- */
-static int DetectAckSigTest01B2g(void)
-{
- return DetectAckSigTest01Real(MPM_B2G);
-}
-
-/**
- * \test DetectAckSigTest01B2g tests sameip under B3g MPM
- */
-static int DetectAckSigTest01B3g(void)
-{
- return DetectAckSigTest01Real(MPM_B3G);
-}
-
-/**
- * \test DetectAckSigTest01B2g tests sameip under WuManber MPM
- */
-static int DetectAckSigTest01Wm(void)
-{
- return DetectAckSigTest01Real(MPM_WUMANBER);
-}
-
#endif /* UNITTESTS */
/**
static void DetectAckRegisterTests(void)
{
#ifdef UNITTESTS
- UtRegisterTest("DetectAckSigTest01B2g", DetectAckSigTest01B2g, 1);
- UtRegisterTest("DetectAckSigTest01B3g", DetectAckSigTest01B3g, 1);
- UtRegisterTest("DetectAckSigTest01Wm", DetectAckSigTest01Wm, 1);
+ UtRegisterTest("DetectAckSigTest01", DetectAckSigTest01, 1);
#endif /* UNITTESTS */
}
char sig[] = "alert tcp any any -> any 515 "
"(msg:\"detect IFS\"; flow:to_server,established; content:\"${IFS}\";"
" depth:50; offset:0; sid:900091; rev:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, MPM_AC) == 0) {
result = 0;
goto end;
}
char sig[] = "alert udp any any -> any 53 (msg:\"dns testing\";"
" content:\"|00 00|\"; depth:5; offset:13; sid:9436601;"
" rev:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, MPM_AC) == 0) {
result = 0;
goto end;
}
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (content:\"|AA BB|\"; content:\"|CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE|\"; distance: 4; within: 19; sid:1; rev:1;)");
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop tcp any any -> any any (msg:\"ET TROJAN Downadup/Conficker A or B Worm reporting\"; flow:to_server,established; uricontent:\"/search?q=\"; pcre:\"/^\\/search\\?q=[0-9]{1,3}(&aq=7(\\?[0-9a-f]{8})?)?/U\"; pcre:\"/\\x0d\\x0aHost\\: \\d+\\.\\d+\\.\\d+\\.\\d+\\x0d\\x0a/\"; sid:2009024; rev:9;)");
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
int result = 0;
char sig[] = "alert tcp any any -> any any (content:\"abc\"; content:\"d\"; distance:0; within:1; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
int result = 0;
char sig[] = "alert tcp any any -> any any (content:\"abc\"; nocase; content:\"d\"; distance:0; within:1; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
int result = 0;
char sig[] = "alert tcp any any -> any any (content:\"aBc\"; nocase; content:\"abca\"; distance:-10; within:4; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"this\"; content:\"is\"; within:6; content:\"big\"; within:8; "
"content:\"string\"; within:8; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"this\"; content:\"is\"; within:9; content:\"big\"; within:12; "
"content:\"string\"; within:8; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"now\"; content:\"this\"; content:\"is\"; within:12; content:\"big\"; within:8; "
"content:\"string\"; within:8; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"thus\"; offset:8; content:\"is\"; within:6; content:\"big\"; within:8; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"fix\"; content:\"this\"; within:6; content:!\"and\"; distance:0; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) != 1) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) != 1) {
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"pcre:/super/; content:\"nova\"; within:7; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert udp any any -> any any (msg:\"crash\"; "
"byte_test:4,>,2,0,relative; sid:11;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 1) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 1) {
result = 0;
goto end;
}
char sig[] = "alert udp any any -> any any (msg:\"crash\"; "
"byte_jump:1,0,relative; sid:11;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 1) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 1) {
result = 0;
goto end;
}
char sig[] = "alert udp any any -> any any (msg:\"crash\"; "
"isdataat:10,relative; sid:11;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 1) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 1) {
result = 0;
goto end;
}
uint16_t buflen = strlen((char *)buf);
Packet *p = UTHBuildPacket( buf, buflen, IPPROTO_TCP);
int result = 0;
- uint16_t mpm_type = MPM_B2G;
+ uint16_t mpm_type = DEFAULT_MPM;
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"aa\"; content:\"aa\"; distance:0; content:\"aa\"; distance:0; "
//char sig[] = "alert tcp any any -> any any (content:\"User-Agent: Mozilla/5.0 (Macintosh; \"; content:\"Firefox/3.\"; distance:0; content:!\"Firefox/3.6.12\"; distance:-10; content:!\"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.6 GTB5\"; sid:1; rev:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 1) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 1) {
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"nova\"; isdataat:18,relative; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"dummy\"; "
"content:\"nova\"; isdataat:!20,relative; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
"content:\"%\"; depth:4; offset:0; "
"content:\"%\"; within:2; distance:1; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
int result = 0;
char sig[] = "alert tcp any any -> any any (content:\"one\"; pcre:\"/^two/R\"; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
int result = 0;
char sig[] = "alert tcp any any -> any any (content:\"one\"; pcre:\"/(fiv|^two)/R\"; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0) {
result = 0;
goto end;
}
char sig[] = "alert tcp any any -> any any (msg:\"crash\"; "
"content:\"message\"; byte_jump:2,-14,string,dec,relative; content:\"card\"; within:4; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0)
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0)
goto end;
result = 1;
char sig[] = "alert tcp any any -> any any (msg:\"crash\"; "
"content:\"message\"; byte_test:1,=,2,-14,string,dec,relative; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0)
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0)
goto end;
result = 1;
char sig[] = "alert tcp any any -> any any (msg:\"crash\"; "
"content:\"message\"; byte_extract:1,-14,boom,string,dec,relative; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, MPM_B2G) == 0)
+ if (UTHPacketMatchSigMpm(p, sig, DEFAULT_MPM) == 0)
goto end;
result = 1;
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop tcp any any -> any any (msg:\"ET TROJAN Downadup/Conficker A or B Worm reporting\"; flow:to_server,established; uricontent:\"/search?q=\"; pcre:\"/^\\/search\\?q=[0-9]{1,3}(&aq=7(\\?[0-9a-f]{8})?)?/U\"; pcre:\"/\\x0d\\x0aHost\\: \\d+\\.\\d+\\.\\d+\\.\\d+\\x0d\\x0a/\"; sid:2009024; rev:9;)");
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
if (sgh_mpm_context == NULL || strcmp(sgh_mpm_context, "auto") == 0) {
/* for now, since we still haven't implemented any intelligence into
* understanding the patterns and distributing mpm_ctx across sgh */
- if (de_ctx->mpm_matcher == DEFAULT_MPM || de_ctx->mpm_matcher == MPM_AC_GFBS ||
+ if (de_ctx->mpm_matcher == DEFAULT_MPM || de_ctx->mpm_matcher == MPM_AC_TILE ||
#ifdef BUILD_HYPERSCAN
de_ctx->mpm_matcher == MPM_HS ||
#endif
- de_ctx->mpm_matcher == MPM_AC_TILE ||
#ifdef __SC_CUDA_SUPPORT__
de_ctx->mpm_matcher == MPM_AC_BS || de_ctx->mpm_matcher == MPM_AC_CUDA) {
#else
FlowInitConfig(FLOW_QUIET);
- de_ctx->mpm_matcher = MPM_B3G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
with source 192.168.1.1 80, all the sids should match */
SigGroupBuild(de_ctx);
- //PatternMatchPrepare(mpm_ctx, MPM_B2G);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
/* only sid 2 should match with a packet going to 192.168.1.1 port 80 */
PACKET_RECYCLE(p);
}
FlowShutdown();
- //PatternMatchDestroy(mpm_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
end:
return result;
}
-static int DetectPcreTestSig01Real(int mpm_type)
+static int DetectPcreTestSig01(void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; pcre:\"/^gEt/i\"; pcre:\"/\\/two\\//U; pcre:\"/GET \\/two\\//\"; pcre:\"/\\s+HTTP/R\"; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int DetectPcreTestSig01B2g (void)
-{
- return DetectPcreTestSig01Real(MPM_B2G);
-}
-static int DetectPcreTestSig01B3g (void)
-{
- return DetectPcreTestSig01Real(MPM_B3G);
-}
-static int DetectPcreTestSig01Wm (void)
-{
- return DetectPcreTestSig01Real(MPM_WUMANBER);
-}
-static int DetectPcreTestSig02Real(int mpm_type)
+static int DetectPcreTestSig02(void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; pcre:\"/two/O\"; sid:2;)");
UTHFreePackets(&p, 1);
return result;
}
-static int DetectPcreTestSig02B2g (void)
-{
- return DetectPcreTestSig02Real(MPM_B2G);
-}
-static int DetectPcreTestSig02B3g (void)
-{
- return DetectPcreTestSig02Real(MPM_B3G);
-}
-static int DetectPcreTestSig02Wm (void)
-{
- return DetectPcreTestSig02Real(MPM_WUMANBER);
-}
/**
* \test DetectPcreTestSig03Real negation test ! outside of "" this sig should not match
*/
-static int DetectPcreTestSig03Real(int mpm_type)
+static int DetectPcreTestSig03(void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; content:\"GET\"; pcre:!\"/two/\"; sid:1;)");
return result;
}
-static int DetectPcreTestSig03B2g (void)
-{
- return DetectPcreTestSig03Real(MPM_B2G);
-}
-static int DetectPcreTestSig03B3g (void)
-{
- return DetectPcreTestSig03Real(MPM_B3G);
-}
-static int DetectPcreTestSig03Wm (void)
-{
- return DetectPcreTestSig03Real(MPM_WUMANBER);
-}
-
/**
* \test Check the signature with pcre modifier P (match with L7 to http body data)
*/
UtRegisterTest("DetectPcreParseTest26", DetectPcreParseTest26, 1);
UtRegisterTest("DetectPcreParseTest27", DetectPcreParseTest27, 1);
- UtRegisterTest("DetectPcreTestSig01B2g -- pcre test", DetectPcreTestSig01B2g, 1);
- UtRegisterTest("DetectPcreTestSig01B3g -- pcre test", DetectPcreTestSig01B3g, 1);
- UtRegisterTest("DetectPcreTestSig01Wm -- pcre test", DetectPcreTestSig01Wm, 1);
- UtRegisterTest("DetectPcreTestSig02B2g -- pcre test", DetectPcreTestSig02B2g, 1);
- UtRegisterTest("DetectPcreTestSig02B3g -- pcre test", DetectPcreTestSig02B3g, 1);
- UtRegisterTest("DetectPcreTestSig02Wm -- pcre test", DetectPcreTestSig02Wm, 1);
- UtRegisterTest("DetectPcreTestSig03B2g -- negated pcre test", DetectPcreTestSig03B2g, 1);
- UtRegisterTest("DetectPcreTestSig03B3g -- negated pcre test", DetectPcreTestSig03B3g, 1);
- UtRegisterTest("DetectPcreTestSig03Wm -- negated pcre test", DetectPcreTestSig03Wm, 1);
+ UtRegisterTest("DetectPcreTestSig01 -- pcre test", DetectPcreTestSig01, 1);
+ UtRegisterTest("DetectPcreTestSig02 -- pcre test", DetectPcreTestSig02, 1);
+ UtRegisterTest("DetectPcreTestSig03 -- negated pcre test", DetectPcreTestSig03, 1);
UtRegisterTest("DetectPcreModifPTest04 -- Modifier P", DetectPcreModifPTest04, 1);
UtRegisterTest("DetectPcreModifPTest05 -- Modifier P fragmented", DetectPcreModifPTest05, 1);
* \internal
* \brief This test tests sameip success and failure.
*/
-static int DetectSameipSigTest01Real(int mpm_type)
+static int DetectSameipSigTest01(void)
{
uint8_t *buf = (uint8_t *)
"GET / HTTP/1.0\r\n"
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
return result;
}
-/**
- * \test DetectSameipSigTest01B2g tests sameip under B2g MPM
- */
-static int DetectSameipSigTest01B2g(void)
-{
- return DetectSameipSigTest01Real(MPM_B2G);
-}
-
-/**
- * \test DetectSameipSigTest01B2g tests sameip under B3g MPM
- */
-static int DetectSameipSigTest01B3g(void)
-{
- return DetectSameipSigTest01Real(MPM_B3G);
-}
-
-/**
- * \test DetectSameipSigTest01B2g tests sameip under WuManber MPM
- */
-static int DetectSameipSigTest01Wm(void)
-{
- return DetectSameipSigTest01Real(MPM_WUMANBER);
-}
-
#endif /* UNITTESTS */
/**
static void DetectSameipRegisterTests(void)
{
#ifdef UNITTESTS
- UtRegisterTest("DetectSameipSigTest01B2g", DetectSameipSigTest01B2g, 1);
- UtRegisterTest("DetectSameipSigTest01B3g", DetectSameipSigTest01B3g, 1);
- UtRegisterTest("DetectSameipSigTest01Wm", DetectSameipSigTest01Wm, 1);
+ UtRegisterTest("DetectSameipSigTest01", DetectSameipSigTest01, 1);
#endif /* UNITTESTS */
}
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:"
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:"
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:"
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:"
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:"
" SSH_PORTS: 22\n"
"\n";
-static int SigTest01Real (int mpm_type)
+static int SigTest01 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
int result = 0;
char sig[] = "alert tcp any any -> any any (msg:\"HTTP URI cap\"; content:\"GET \"; depth:4; pcre:\"/GET (?P<pkt_http_uri>.*) HTTP\\/\\d\\.\\d\\r\\n/G\"; sid:1;)";
- if (UTHPacketMatchSigMpm(p, sig, mpm_type) == 0) {
+ if (UTHPacketMatchSigMpm(p, sig, MPM_AC) == 0) {
result = 0;
goto end;
}
return result;
}
-static int SigTest01B2g (void)
-{
- return SigTest01Real(MPM_B2G);
-}
-static int SigTest01B3g (void)
-{
- return SigTest01Real(MPM_B3G);
-}
-static int SigTest01Wm (void)
-{
- return SigTest01Real(MPM_WUMANBER);
-}
-
-static int SigTest02Real (int mpm_type)
+static int SigTest02 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
uint16_t buflen = strlen((char *)buf);
Packet *p = UTHBuildPacket( buf, buflen, IPPROTO_TCP);
char sig[] = "alert tcp any any -> any any (msg:\"HTTP TEST\"; content:\"Host: one.example.org\"; offset:20; depth:41; sid:1;)";
- int ret = UTHPacketMatchSigMpm(p, sig, mpm_type);
+ int ret = UTHPacketMatchSigMpm(p, sig, MPM_AC);
UTHFreePacket(p);
return ret;
}
-static int SigTest02B2g (void)
-{
- return SigTest02Real(MPM_B2G);
-}
-static int SigTest02B3g (void)
-{
- return SigTest02Real(MPM_B3G);
-}
-static int SigTest02Wm (void)
-{
- return SigTest02Real(MPM_WUMANBER);
-}
-
-
-static int SigTest03Real (int mpm_type)
+static int SigTest03 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n"
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; content:\"Host: one.example.org\"; offset:20; depth:39; sid:1;)");
}
SigGroupBuild(de_ctx);
- //PatternMatchPrepare(mpm_ctx, mpm_type);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
SigCleanSignatures(de_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- //PatternMatchDestroy(mpm_ctx);
DetectEngineCtxFree(de_ctx);
end:
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest03B2g (void)
-{
- return SigTest03Real(MPM_B2G);
-}
-static int SigTest03B3g (void)
-{
- return SigTest03Real(MPM_B3G);
-}
-static int SigTest03Wm (void)
-{
- return SigTest03Real(MPM_WUMANBER);
-}
-
-static int SigTest04Real (int mpm_type)
+static int SigTest04 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n" /* 20*/
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; content:\"Host:\"; offset:20; depth:25; content:\"Host:\"; distance:42; within:47; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest04B2g (void)
-{
- return SigTest04Real(MPM_B2G);
-}
-static int SigTest04B3g (void)
-{
- return SigTest04Real(MPM_B3G);
-}
-static int SigTest04Wm (void)
-{
- return SigTest04Real(MPM_WUMANBER);
-}
-
-static int SigTest05Real (int mpm_type)
+static int SigTest05 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP TEST\"; content:\"Host:\"; offset:20; depth:25; content:\"Host:\"; distance:48; within:52; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest05B2g (void)
-{
- return SigTest05Real(MPM_B2G);
-}
-static int SigTest05B3g (void)
-{
- return SigTest05Real(MPM_B3G);
-}
-static int SigTest05Wm (void)
-{
- return SigTest05Real(MPM_WUMANBER);
-}
-
-static int SigTest06Real (int mpm_type)
+static int SigTest06 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP URI cap\"; content:\"GET \"; depth:4; pcre:\"/GET (?P<pkt_http_uri>.*) HTTP\\/\\d\\.\\d\\r\\n/G\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest06B2g (void)
-{
- return SigTest06Real(MPM_B2G);
-}
-static int SigTest06B3g (void)
-{
- return SigTest06Real(MPM_B3G);
-}
-static int SigTest06Wm (void)
-{
- return SigTest06Real(MPM_WUMANBER);
-}
-
-static int SigTest07Real (int mpm_type)
+static int SigTest07 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP URI cap\"; content:\"GET \"; depth:4; pcre:\"/GET (?P<pkt_http_uri>.*) HTTP\\/\\d\\.\\d\\r\\n/G\"; sid:1;)");
SigCleanSignatures(de_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- //PatternMatchDestroy(mpm_ctx);
DetectEngineCtxFree(de_ctx);
return result;
}
-static int SigTest07B2g (void)
-{
- return SigTest07Real(MPM_B2G);
-}
-static int SigTest07B3g (void)
-{
- return SigTest07Real(MPM_B3G);
-}
-static int SigTest07Wm (void)
-{
- return SigTest07Real(MPM_WUMANBER);
-}
-
-static int SigTest08Real (int mpm_type)
+static int SigTest08 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.0\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP URI cap\"; content:\"GET \"; depth:4; pcre:\"/GET (?P<pkt_http_uri>.*) HTTP\\/1\\.0\\r\\n/G\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest08B2g (void)
-{
- return SigTest08Real(MPM_B2G);
-}
-static int SigTest08B3g (void)
-{
- return SigTest08Real(MPM_B3G);
-}
-static int SigTest08Wm (void)
-{
- return SigTest08Real(MPM_WUMANBER);
-}
-
-static int SigTest09Real (int mpm_type)
+static int SigTest09 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.0\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"HTTP URI cap\"; content:\"GET \"; depth:4; pcre:\"/GET (?P<pkt_http_uri>.*) HTTP\\/1\\.0\\r\\n/G\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest09B2g (void)
-{
- return SigTest09Real(MPM_B2G);
-}
-static int SigTest09B3g (void)
-{
- return SigTest09Real(MPM_B3G);
-}
-static int SigTest09Wm (void)
-{
- return SigTest09Real(MPM_WUMANBER);
-}
-
-static int SigTest10Real (int mpm_type)
+static int SigTest10 (void)
{
uint8_t *buf = (uint8_t *)
"ABC";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Long content test (1)\"; content:\"ABCD\"; depth:4; sid:1;)");
SigGroupBuild(de_ctx);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx,(void *)&det_ctx);
-
SCMutexLock(&f.m);
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_HTTP, STREAM_TOSERVER, buf, buflen);
if (r != 0) {
FLOW_DESTROY(&f);
return result;
}
-static int SigTest10B2g (void)
-{
- return SigTest10Real(MPM_B2G);
-}
-static int SigTest10B3g (void)
-{
- return SigTest10Real(MPM_B3G);
-}
-static int SigTest10Wm (void)
-{
- return SigTest10Real(MPM_WUMANBER);
-}
-
-static int SigTest11Real (int mpm_type)
+static int SigTest11 (void)
{
uint8_t *buf = (uint8_t *)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (content:\"ABCDEFGHIJ\"; content:\"klmnop\"; content:\"1234\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest11B2g (void)
-{
- return SigTest11Real(MPM_B2G);
-}
-static int SigTest11B3g (void)
-{
- return SigTest11Real(MPM_B3G);
-}
-static int SigTest11Wm (void)
-{
- return SigTest11Real(MPM_WUMANBER);
-}
-
-static int SigTest12Real (int mpm_type)
+static int SigTest12 (void)
{
uint8_t *buf = (uint8_t *)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Content order test\"; content:\"ABCDEFGHIJ\"; content:\"klmnop\"; content:\"1234\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest12B2g (void)
-{
- return SigTest12Real(MPM_B2G);
-}
-static int SigTest12B3g (void)
-{
- return SigTest12Real(MPM_B3G);
-}
-static int SigTest12Wm (void)
-{
- return SigTest12Real(MPM_WUMANBER);
-}
-
-static int SigTest13Real (int mpm_type)
+static int SigTest13 (void)
{
uint8_t *buf = (uint8_t *)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Content order test\"; content:\"ABCDEFGHIJ\"; content:\"1234\"; content:\"klmnop\"; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest13B2g (void)
-{
- return SigTest13Real(MPM_B2G);
-}
-static int SigTest13B3g (void)
-{
- return SigTest13Real(MPM_B3G);
-}
-static int SigTest13Wm (void)
-{
- return SigTest13Real(MPM_WUMANBER);
-}
-
-static int SigTest14Real (int mpm_type)
+static int SigTest14 (void)
{
uint8_t *buf = (uint8_t *)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Content order test\"; content:\"ABCDEFGHIJ\"; content:\"1234\"; content:\"klmnop\"; distance:0; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest14B2g (void)
-{
- return SigTest14Real(MPM_B2G);
-}
-static int SigTest14B3g (void)
-{
- return SigTest14Real(MPM_B3G);
-}
-static int SigTest14Wm (void)
-{
- return SigTest14Real(MPM_WUMANBER);
-}
-
-static int SigTest15Real (int mpm_type)
+static int SigTest15 (void)
{
uint8_t *buf = (uint8_t *)
"CONNECT 213.92.8.7:31204 HTTP/1.1";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
-
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any !$HTTP_PORTS (msg:\"ET POLICY Inbound HTTP CONNECT Attempt on Off-Port\"; content:\"CONNECT \"; nocase; depth:8; content:\" HTTP/1.\"; nocase; within:1000; sid:2008284; rev:2;)");
SCFree(p);
return result;
}
-static int SigTest15B2g (void)
-{
- return SigTest15Real(MPM_B2G);
-}
-static int SigTest15B3g (void)
-{
- return SigTest15Real(MPM_B3G);
-}
-static int SigTest15Wm (void)
-{
- return SigTest15Real(MPM_WUMANBER);
-}
-
-static int SigTest16Real (int mpm_type)
+static int SigTest16 (void)
{
uint8_t *buf = (uint8_t *)
"CONNECT 213.92.8.7:31204 HTTP/1.1";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
-
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any !$HTTP_PORTS (msg:\"ET POLICY Inbound HTTP CONNECT Attempt on Off-Port\"; content:\"CONNECT \"; nocase; depth:8; content:\" HTTP/1.\"; nocase; within:1000; sid:2008284; rev:2;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest16B2g (void)
-{
- return SigTest16Real(MPM_B2G);
-}
-static int SigTest16B3g (void)
-{
- return SigTest16Real(MPM_B3G);
-}
-static int SigTest16Wm (void)
-{
- return SigTest16Real(MPM_WUMANBER);
-}
-
-static int SigTest17Real (int mpm_type)
+static int SigTest17 (void)
{
uint8_t *buf = (uint8_t *)
"GET /one/ HTTP/1.1\r\n" /* 20 */
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any $HTTP_PORTS (msg:\"HTTP host cap\"; content:\"Host:\"; pcre:\"/^Host: (?P<pkt_http_host>.*)\\r\\n/m\"; noalert; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTest17B2g (void)
-{
- return SigTest17Real(MPM_B2G);
-}
-static int SigTest17B3g (void)
-{
- return SigTest17Real(MPM_B3G);
-}
-static int SigTest17Wm (void)
-{
- return SigTest17Real(MPM_WUMANBER);
-}
-static int SigTest18Real (int mpm_type)
+static int SigTest18 (void)
{
uint8_t *buf = (uint8_t *)
"220 (vsFTPd 2.0.5)\r\n";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
-
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any !21:902 -> any any (msg:\"ET MALWARE Suspicious 220 Banner on Local Port\"; content:\"220\"; offset:0; depth:4; pcre:\"/220[- ]/\"; sid:2003055; rev:4;)");
SCFree(p);
return result;
}
-static int SigTest18B2g (void)
-{
- return SigTest18Real(MPM_B2G);
-}
-static int SigTest18B3g (void)
-{
- return SigTest18Real(MPM_B3G);
-}
-static int SigTest18Wm (void)
-{
- return SigTest18Real(MPM_WUMANBER);
-}
-int SigTest19Real (int mpm_type)
+static int SigTest19 (void)
{
uint8_t *buf = (uint8_t *)
"220 (vsFTPd 2.0.5)\r\n";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert ip $HOME_NET any -> 1.2.3.4 any (msg:\"IP-ONLY test (1)\"; sid:999; rev:1;)");
SCFree(p);
return result;
}
-static int SigTest19B2g (void)
-{
- return SigTest19Real(MPM_B2G);
-}
-static int SigTest19B3g (void)
-{
- return SigTest19Real(MPM_B3G);
-}
-static int SigTest19Wm (void)
-{
- return SigTest19Real(MPM_WUMANBER);
-}
-static int SigTest20Real (int mpm_type)
+static int SigTest20 (void)
{
uint8_t *buf = (uint8_t *)
"220 (vsFTPd 2.0.5)\r\n";
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert ip $HOME_NET any -> [99.99.99.99,1.2.3.0/24,1.1.1.1,3.0.0.0/8] any (msg:\"IP-ONLY test (2)\"; sid:999; rev:1;)");
}
SigGroupBuild(de_ctx);
- //PatternMatchPrepare(mpm_ctx, mpm_type);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx,(void *)&det_ctx);
- //DetectEngineIPOnlyThreadInit(de_ctx,&det_ctx->io_ctx);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
if (PacketAlertCheck(p, 999))
SigGroupCleanup(de_ctx);
SigCleanSignatures(de_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- //PatternMatchDestroy(mpm_ctx);
DetectEngineCtxFree(de_ctx);
end:
ConfDeInit();
SCFree(p);
return result;
}
-static int SigTest20B2g (void)
-{
- return SigTest20Real(MPM_B2G);
-}
-static int SigTest20B3g (void)
-{
- return SigTest20Real(MPM_B3G);
-}
-static int SigTest20Wm (void)
-{
- return SigTest20Real(MPM_WUMANBER);
-}
-
-static int SigTest21Real (int mpm_type)
+static int SigTest21 (void)
{
ThreadVars th_v;
memset(&th_v, 0, sizeof(th_v));
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"FLOWBIT SET\"; content:\"/one/\"; flowbits:set,TEST.one; flowbits:noalert; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest21B2g (void)
-{
- return SigTest21Real(MPM_B2G);
-}
-static int SigTest21B3g (void)
-{
- return SigTest21Real(MPM_B3G);
-}
-static int SigTest21Wm (void)
-{
- return SigTest21Real(MPM_WUMANBER);
-}
-
-static int SigTest22Real (int mpm_type)
+static int SigTest22 (void)
{
ThreadVars th_v;
memset(&th_v, 0, sizeof(th_v));
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"FLOWBIT SET\"; content:\"/one/\"; flowbits:set,TEST.one; flowbits:noalert; sid:1;)");
}
SigGroupBuild(de_ctx);
- //PatternMatchPrepare(mpm_ctx, mpm_type);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p1);
SigCleanSignatures(de_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- //PatternMatchDestroy(mpm_ctx);
DetectEngineCtxFree(de_ctx);
end:
UTHFreePackets(&p1, 1);
FLOW_DESTROY(&f);
return result;
}
-static int SigTest22B2g (void)
-{
- return SigTest22Real(MPM_B2G);
-}
-static int SigTest22B3g (void)
-{
- return SigTest22Real(MPM_B3G);
-}
-static int SigTest22Wm (void)
-{
- return SigTest22Real(MPM_WUMANBER);
-}
-static int SigTest23Real (int mpm_type)
+static int SigTest23 (void)
{
ThreadVars th_v;
memset(&th_v, 0, sizeof(th_v));
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"FLOWBIT SET\"; content:\"/one/\"; flowbits:toggle,TEST.one; flowbits:noalert; sid:1;)");
FLOW_DESTROY(&f);
return result;
}
-static int SigTest23B2g (void)
-{
- return SigTest23Real(MPM_B2G);
-}
-static int SigTest23B3g (void)
-{
- return SigTest23Real(MPM_B3G);
-}
-static int SigTest23Wm (void)
-{
- return SigTest23Real(MPM_WUMANBER);
-}
int SigTest24IPV4Keyword(void)
{
return result;
}
-int SigTest38Real(int mpm_type)
+static int SigTest38(void)
{
Packet *p1 = SCMalloc(SIZE_OF_PACKET);
if (unlikely(p1 == NULL))
if (de_ctx == NULL) {
goto end;
}
-
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
SCFree(p1);
return result;
}
-static int SigTest38B2g (void)
-{
- return SigTest38Real(MPM_B2G);
-}
-static int SigTest38B3g (void)
-{
- return SigTest38Real(MPM_B3G);
-}
-static int SigTest38Wm (void)
-{
- return SigTest38Real(MPM_WUMANBER);
-}
-int SigTest39Real(int mpm_type)
+static int SigTest39(void)
{
Packet *p1 = SCMalloc(SIZE_OF_PACKET);
if (unlikely(p1 == NULL))
if (de_ctx == NULL) {
goto end;
}
-
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,
SCFree(p1);
return result;
}
-static int SigTest39B2g (void)
-{
- return SigTest39Real(MPM_B2G);
-}
-static int SigTest39B3g (void)
-{
- return SigTest39Real(MPM_B3G);
-}
-static int SigTest39Wm (void)
-{
- return SigTest39Real(MPM_WUMANBER);
-}
-
-
/**
* \test SigTest36ContentAndIsdataatKeywords01 is a test to check window with constructed packets,
* \brief expecting to match a size
*/
-int SigTest36ContentAndIsdataatKeywords01Real (int mpm_type)
+static int SigTest36ContentAndIsdataatKeywords01 (void)
{
int result = 0;
// Buid and decode the packet
uint8_t raw_eth [] = {
- 0x00,0x25,0x00,0x9e,0xfa,0xfe,0x00,0x02,0xcf,0x74,0xfe,0xe1,0x08,0x00,0x45,0x00
+ 0x00,0x25,0x00,0x9e,0xfa,0xfe,0x00,0x02,0xcf,0x74,0xfe,0xe1,0x08,0x00,0x45,0x00
,0x01,0xcc,0xcb,0x91,0x00,0x00,0x34,0x06,0xdf,0xa8,0xd1,0x55,0xe3,0x67,0xc0,0xa8
,0x64,0x8c,0x00,0x50,0xc0,0xb7,0xd1,0x11,0xed,0x63,0x81,0xa9,0x9a,0x05,0x80,0x18
,0x00,0x75,0x0a,0xdd,0x00,0x00,0x01,0x01,0x08,0x0a,0x09,0x8a,0x06,0xd0,0x12,0x21
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"SigTest36ContentAndIsdataatKeywords01 \"; content:\"HTTP\"; isdataat:404, relative; sid:101;)");
}
SigGroupBuild(de_ctx);
- //PatternMatchPrepare(mpm_ctx, mpm_type);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
SigCleanSignatures(de_ctx);
DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- //PatternMatchDestroy(mpm_ctx);
DetectEngineCtxFree(de_ctx);
PACKET_RECYCLE(p);
FlowShutdown();
* \brief not expecting to match a size
*/
-int SigTest37ContentAndIsdataatKeywords02Real (int mpm_type)
+static int SigTest37ContentAndIsdataatKeywords02 (void)
{
int result = 0;
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
Signature *s = de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"SigTest37ContentAndIsdataatKeywords01 \"; content:\"HTTP\"; isdataat:500, relative; sid:101;)");
printf("type not content: ");
goto end;
}
-/*
- if (s->sm_lists[DETECT_SM_LIST_PMATCH]->next == NULL) {
- printf("s->sm_lists[DETECT_SM_LIST_PMATCH]->next == NULL: ");
- goto end;
- }
- if (s->sm_lists[DETECT_SM_LIST_PMATCH]->next->type != DETECT_ISDATAAT) {
- printf("type not isdataat: ");
- goto end;
- }
-*/
SigGroupBuild(de_ctx);
DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
return result;
}
-
-// Wrapper functions to pass the mpm_type
-static int SigTest36ContentAndIsdataatKeywords01B2g (void)
-{
- return SigTest36ContentAndIsdataatKeywords01Real(MPM_B2G);
-}
-static int SigTest36ContentAndIsdataatKeywords01B3g (void)
-{
- return SigTest36ContentAndIsdataatKeywords01Real(MPM_B3G);
-}
-static int SigTest36ContentAndIsdataatKeywords01Wm (void)
-{
- return SigTest36ContentAndIsdataatKeywords01Real(MPM_WUMANBER);
-}
-
-static int SigTest37ContentAndIsdataatKeywords02B2g (void)
-{
- return SigTest37ContentAndIsdataatKeywords02Real(MPM_B2G);
-}
-static int SigTest37ContentAndIsdataatKeywords02B3g (void)
-{
- return SigTest37ContentAndIsdataatKeywords02Real(MPM_B3G);
-}
-static int SigTest37ContentAndIsdataatKeywords02Wm (void)
-{
- return SigTest37ContentAndIsdataatKeywords02Real(MPM_WUMANBER);
-}
-
-
/**
* \test SigTest41NoPacketInspection is a test to check that when PKT_NOPACKET_INSPECTION
* flag is set, we don't need to inspect the packet protocol header or its contents.
*/
-int SigTest40NoPacketInspection01(void)
+static int SigTest40NoPacketInspection01(void)
{
uint8_t *buf = (uint8_t *)
goto end;
}
de_ctx->flags |= DE_QUIET;
- de_ctx->mpm_matcher = MPM_WUMANBER;
+ de_ctx->mpm_matcher = MPM_AC;
de_ctx->sig_list = SigInit(de_ctx,"alert ip any any -> 1.2.3.4-1.2.3.6 any (msg:\"1\"; content:\"one\"; content:\"1\"; sid:1;)");
if (de_ctx->sig_list == NULL) {
goto end;
}
- if (sgh->mpm_stream_ctx_ts->mpm_type != MPM_WUMANBER) {
- printf("sgh->mpm_type != MPM_WUMANBER, expected %d, got %d: ", MPM_WUMANBER, sgh->mpm_stream_ctx_ts->mpm_type);
+ if (sgh->mpm_stream_ctx_ts->mpm_type != MPM_AC) {
+ printf("sgh->mpm_type != MPM_AC, expected %d, got %d: ", MPM_AC, sgh->mpm_stream_ctx_ts->mpm_type);
goto end;
}
return result;
}
-static int SigTestContent01Real (int mpm_type)
+static int SigTestContent01 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Test 32\"; content:\"01234567890123456789012345678901\"; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestContent01B2g (void)
-{
- return SigTestContent01Real(MPM_B2G);
-}
-static int SigTestContent01B3g (void)
-{
- return SigTestContent01Real(MPM_B3G);
-}
-static int SigTestContent01Wm (void)
-{
- return SigTestContent01Real(MPM_WUMANBER);
-}
-static int SigTestContent02Real (int mpm_type)
+static int SigTestContent02 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Test 32\"; content:\"01234567890123456789012345678901\"; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestContent02B2g (void)
-{
- return SigTestContent02Real(MPM_B2G);
-}
-static int SigTestContent02B3g (void)
-{
- return SigTestContent02Real(MPM_B3G);
-}
-static int SigTestContent02Wm (void)
-{
- return SigTestContent02Real(MPM_WUMANBER);
-}
-static int SigTestContent03Real (int mpm_type)
+static int SigTestContent03 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Test 32\"; content:\"01234567890123456789012345678901\"; content:\"abcdefghijklmnopqrstuvwxyzABCDEF\"; distance:0; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestContent03B2g (void)
-{
- return SigTestContent03Real(MPM_B2G);
-}
-static int SigTestContent03B3g (void)
-{
- return SigTestContent03Real(MPM_B3G);
-}
-static int SigTestContent03Wm (void)
-{
- return SigTestContent03Real(MPM_WUMANBER);
-}
-static int SigTestContent04Real (int mpm_type)
+static int SigTestContent04 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Test 32\"; content:\"01234567890123456789012345678901\"; content:\"abcdefghijklmnopqrstuvwxyzABCDEF\"; distance:0; within:32; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestContent04B2g (void)
-{
- return SigTestContent04Real(MPM_B2G);
-}
-static int SigTestContent04B3g (void)
-{
- return SigTestContent04Real(MPM_B3G);
-}
-static int SigTestContent04Wm (void)
-{
- return SigTestContent04Real(MPM_WUMANBER);
-}
/** \test sigs with patterns at the limit of the pm's size limit */
-static int SigTestContent05Real (int mpm_type)
+static int SigTestContent05 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901PADabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"Test 32\"; content:\"01234567890123456789012345678901\"; content:\"abcdefghijklmnopqrstuvwxyzABCDEF\"; distance:0; within:32; sid:1;)");
}
return result;
}
-static int SigTestContent05B2g (void)
-{
- return SigTestContent05Real(MPM_B2G);
-}
-static int SigTestContent05B3g (void)
-{
- return SigTestContent05Real(MPM_B3G);
-}
-static int SigTestContent05Wm (void)
-{
- return SigTestContent05Real(MPM_WUMANBER);
-}
-static int SigTestContent06Real (int mpm_type)
+static int SigTestContent06 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert ip any any -> any any (msg:\"Test 32 sig1\"; content:\"01234567890123456789012345678901\"; content:\"abcdefghijklmnopqrstuvwxyzABCDEF\"; distance:0; within:32; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestContent06B2g (void)
-{
- return SigTestContent06Real(MPM_B2G);
-}
-static int SigTestContent06B3g (void)
-{
- return SigTestContent06Real(MPM_B3G);
-}
-static int SigTestContent06Wm (void)
-{
- return SigTestContent06Real(MPM_WUMANBER);
-}
-static int SigTestWithinReal01 (int mpm_type)
+static int SigTestWithin01 (void)
{
DecodeThreadVars dtv;
ThreadVars th_v;
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"within test\"; content:\"Hi, this is a big test to check \"; content:\"content matches\"; distance:0; within:15; sid:556;)");
return result;
}
-static int SigTestWithinReal01B2g (void)
-{
- return SigTestWithinReal01(MPM_B2G);
-}
-static int SigTestWithinReal01B3g (void)
-{
- return SigTestWithinReal01(MPM_B3G);
-}
-static int SigTestWithinReal01Wm (void)
-{
- return SigTestWithinReal01(MPM_WUMANBER);
-}
-
-static int SigTestDepthOffset01Real (int mpm_type)
+static int SigTestDepthOffset01 (void)
{
uint8_t *buf = (uint8_t *)"01234567890123456789012345678901abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint16_t buflen = strlen((char *)buf);
goto end;
}
- de_ctx->mpm_matcher = mpm_type;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx,"alert tcp any any -> any any (msg:\"depth offset\"; content:\"456\"; offset:4; depth:3; sid:1;)");
UTHFreePackets(&p, 1);
return result;
}
-static int SigTestDepthOffset01B2g (void)
-{
- return SigTestDepthOffset01Real(MPM_B2G);
-}
-static int SigTestDepthOffset01B3g (void)
-{
- return SigTestDepthOffset01Real(MPM_B3G);
-}
-static int SigTestDepthOffset01Wm (void)
-{
- return SigTestDepthOffset01Real(MPM_WUMANBER);
-}
static int SigTestDetectAlertCounter(void)
{
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Test counter\"; "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop http any any -> any any "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop tcp any any -> any 80 "
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop tcp any any -> any 80 "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "drop tcp any any -> any 80 "
if (de_ctx == NULL) {
goto end;
}
- de_ctx->mpm_matcher = MPM_B2G;
de_ctx->flags |= DE_QUIET;
s = de_ctx->sig_list = SigInit(de_ctx, "alert ip any any -> any 80 "
SigParseRegisterTests();
IPOnlyRegisterTests();
- UtRegisterTest("SigTest01B2g -- HTTP URI cap", SigTest01B2g, 1);
- UtRegisterTest("SigTest01B3g -- HTTP URI cap", SigTest01B3g, 1);
- UtRegisterTest("SigTest01Wm -- HTTP URI cap", SigTest01Wm, 1);
-
- UtRegisterTest("SigTest02B2g -- Offset/Depth match", SigTest02B2g, 1);
- UtRegisterTest("SigTest02B3g -- Offset/Depth match", SigTest02B3g, 1);
- UtRegisterTest("SigTest02Wm -- Offset/Depth match", SigTest02Wm, 1);
-
- UtRegisterTest("SigTest03B2g -- offset/depth mismatch", SigTest03B2g, 1);
- UtRegisterTest("SigTest03B3g -- offset/depth mismatch", SigTest03B3g, 1);
- UtRegisterTest("SigTest03Wm -- offset/depth mismatch", SigTest03Wm, 1);
-
- UtRegisterTest("SigTest04B2g -- distance/within match", SigTest04B2g, 1);
- UtRegisterTest("SigTest04B3g -- distance/within match", SigTest04B3g, 1);
- UtRegisterTest("SigTest04Wm -- distance/within match", SigTest04Wm, 1);
-
- UtRegisterTest("SigTest05B2g -- distance/within mismatch", SigTest05B2g, 1);
- UtRegisterTest("SigTest05B3g -- distance/within mismatch", SigTest05B3g, 1);
- UtRegisterTest("SigTest05Wm -- distance/within mismatch", SigTest05Wm, 1);
-
- UtRegisterTest("SigTest06B2g -- uricontent HTTP/1.1 match test", SigTest06B2g, 1);
- UtRegisterTest("SigTest06B3g -- uricontent HTTP/1.1 match test", SigTest06B3g, 1);
- UtRegisterTest("SigTest06wm -- uricontent HTTP/1.1 match test", SigTest06Wm, 1);
-
- UtRegisterTest("SigTest07B2g -- uricontent HTTP/1.1 mismatch test", SigTest07B2g, 1);
- UtRegisterTest("SigTest07B3g -- uricontent HTTP/1.1 mismatch test", SigTest07B3g, 1);
- UtRegisterTest("SigTest07Wm -- uricontent HTTP/1.1 mismatch test", SigTest07Wm, 1);
-
- UtRegisterTest("SigTest08B2g -- uricontent HTTP/1.0 match test", SigTest08B2g, 1);
- UtRegisterTest("SigTest08B3g -- uricontent HTTP/1.0 match test", SigTest08B3g, 1);
- UtRegisterTest("SigTest08Wm -- uricontent HTTP/1.0 match test", SigTest08Wm, 1);
-
- UtRegisterTest("SigTest09B2g -- uricontent HTTP/1.0 mismatch test", SigTest09B2g, 1);
- UtRegisterTest("SigTest09B3g -- uricontent HTTP/1.0 mismatch test", SigTest09B3g, 1);
- UtRegisterTest("SigTest09Wm -- uricontent HTTP/1.0 mismatch test", SigTest09Wm, 1);
-
- UtRegisterTest("SigTest10B2g -- long content match, longer than pkt", SigTest10B2g, 1);
- UtRegisterTest("SigTest10B3g -- long content match, longer than pkt", SigTest10B3g, 1);
- UtRegisterTest("SigTest10Wm -- long content match, longer than pkt", SigTest10Wm, 1);
-
- UtRegisterTest("SigTest11B2g -- mpm searching", SigTest11B2g, 1);
- UtRegisterTest("SigTest11B3g -- mpm searching", SigTest11B3g, 1);
- UtRegisterTest("SigTest11Wm -- mpm searching", SigTest11Wm, 1);
-
- UtRegisterTest("SigTest12B2g -- content order matching, normal", SigTest12B2g, 1);
- UtRegisterTest("SigTest12B3g -- content order matching, normal", SigTest12B3g, 1);
- UtRegisterTest("SigTest12Wm -- content order matching, normal", SigTest12Wm, 1);
-
- UtRegisterTest("SigTest13B2g -- content order matching, diff order", SigTest13B2g, 1);
- UtRegisterTest("SigTest13B3g -- content order matching, diff order", SigTest13B3g, 1);
- UtRegisterTest("SigTest13Wm -- content order matching, diff order", SigTest13Wm, 1);
-
- UtRegisterTest("SigTest14B2g -- content order matching, distance 0", SigTest14B2g, 1);
- UtRegisterTest("SigTest14B3g -- content order matching, distance 0", SigTest14B3g, 1);
- UtRegisterTest("SigTest14Wm -- content order matching, distance 0", SigTest14Wm, 1);
-
- UtRegisterTest("SigTest15B2g -- port negation sig (no match)", SigTest15B2g, 1);
- UtRegisterTest("SigTest15B3g -- port negation sig (no match)", SigTest15B3g, 1);
- UtRegisterTest("SigTest15Wm -- port negation sig (no match)", SigTest15Wm, 1);
-
- UtRegisterTest("SigTest16B2g -- port negation sig (match)", SigTest16B2g, 1);
- UtRegisterTest("SigTest16B3g -- port negation sig (match)", SigTest16B3g, 1);
- UtRegisterTest("SigTest16Wm -- port negation sig (match)", SigTest16Wm, 1);
-
- UtRegisterTest("SigTest17B2g -- HTTP Host Pkt var capture", SigTest17B2g, 1);
- UtRegisterTest("SigTest17B3g -- HTTP Host Pkt var capture", SigTest17B3g, 1);
- UtRegisterTest("SigTest17Wm -- HTTP Host Pkt var capture", SigTest17Wm, 1);
-
- UtRegisterTest("SigTest18B2g -- Ftp negation sig test", SigTest18B2g, 1);
- UtRegisterTest("SigTest18B3g -- Ftp negation sig test", SigTest18B3g, 1);
- UtRegisterTest("SigTest18Wm -- Ftp negation sig test", SigTest18Wm, 1);
-
- UtRegisterTest("SigTest19B2g -- IP-ONLY test (1)", SigTest19B2g, 1);
- UtRegisterTest("SigTest19B3g -- IP-ONLY test (1)", SigTest19B3g, 1);
- UtRegisterTest("SigTest19Wm -- IP-ONLY test (1)", SigTest19Wm, 1);
-
- UtRegisterTest("SigTest20B2g -- IP-ONLY test (2)", SigTest20B2g, 1);
- UtRegisterTest("SigTest20B3g -- IP-ONLY test (2)", SigTest20B3g, 1);
- UtRegisterTest("SigTest20Wm -- IP-ONLY test (2)", SigTest20Wm, 1);
-
- UtRegisterTest("SigTest21B2g -- FLOWBIT test (1)", SigTest21B2g, 1);
- UtRegisterTest("SigTest21B3g -- FLOWBIT test (1)", SigTest21B3g, 1);
- UtRegisterTest("SigTest21Wm -- FLOWBIT test (1)", SigTest21Wm, 1);
-
- UtRegisterTest("SigTest22B2g -- FLOWBIT test (2)", SigTest22B2g, 1);
- UtRegisterTest("SigTest22B3g -- FLOWBIT test (2)", SigTest22B3g, 1);
- UtRegisterTest("SigTest22Wm -- FLOWBIT test (2)", SigTest22Wm, 1);
-
- UtRegisterTest("SigTest23B2g -- FLOWBIT test (3)", SigTest23B2g, 1);
- UtRegisterTest("SigTest23B3g -- FLOWBIT test (3)", SigTest23B3g, 1);
- UtRegisterTest("SigTest23Wm -- FLOWBIT test (3)", SigTest23Wm, 1);
+ UtRegisterTest("SigTest01", SigTest01, 1);
+ UtRegisterTest("SigTest02 -- Offset/Depth match", SigTest02, 1);
+ UtRegisterTest("SigTest03 -- offset/depth mismatch", SigTest03, 1);
+ UtRegisterTest("SigTest04 -- distance/within match", SigTest04, 1);
+ UtRegisterTest("SigTest05 -- distance/within mismatch", SigTest05, 1);
+ UtRegisterTest("SigTest06 -- uricontent HTTP/1.1 match test", SigTest06, 1);
+ UtRegisterTest("SigTest07 -- uricontent HTTP/1.1 mismatch test", SigTest07, 1);
+ UtRegisterTest("SigTest08 -- uricontent HTTP/1.0 match test", SigTest08, 1);
+ UtRegisterTest("SigTest09 -- uricontent HTTP/1.0 mismatch test", SigTest09, 1);
+ UtRegisterTest("SigTest10 -- long content match, longer than pkt", SigTest10, 1);
+ UtRegisterTest("SigTest11 -- mpm searching", SigTest11, 1);
+ UtRegisterTest("SigTest12 -- content order matching, normal", SigTest12, 1);
+ UtRegisterTest("SigTest13 -- content order matching, diff order", SigTest13, 1);
+ UtRegisterTest("SigTest14 -- content order matching, distance 0", SigTest14, 1);
+ UtRegisterTest("SigTest15 -- port negation sig (no match)", SigTest15, 1);
+ UtRegisterTest("SigTest16 -- port negation sig (match)", SigTest16, 1);
+ UtRegisterTest("SigTest17 -- HTTP Host Pkt var capture", SigTest17, 1);
+ UtRegisterTest("SigTest18 -- Ftp negation sig test", SigTest18, 1);
+ UtRegisterTest("SigTest19 -- IP-ONLY test (1)", SigTest19, 1);
+ UtRegisterTest("SigTest20 -- IP-ONLY test (2)", SigTest20, 1);
+ UtRegisterTest("SigTest21 -- FLOWBIT test (1)", SigTest21, 1);
+ UtRegisterTest("SigTest22 -- FLOWBIT test (2)", SigTest22, 1);
+ UtRegisterTest("SigTest23 -- FLOWBIT test (3)", SigTest23, 1);
UtRegisterTest("SigTest24IPV4Keyword", SigTest24IPV4Keyword, 1);
UtRegisterTest("SigTest25NegativeIPV4Keyword",
UtRegisterTest("SigTest35NegativeICMPV4Keyword",
SigTest35NegativeICMPV4Keyword, 1);
- /* The following tests check content options with isdataat options
- relative to that content match
- */
-
- UtRegisterTest("SigTest36ContentAndIsdataatKeywords01B2g",
- SigTest36ContentAndIsdataatKeywords01B2g, 1);
- UtRegisterTest("SigTest36ContentAndIsdataatKeywords01B3g",
- SigTest36ContentAndIsdataatKeywords01B3g, 1);
- UtRegisterTest("SigTest36ContentAndIsdataatKeywords01Wm" ,
- SigTest36ContentAndIsdataatKeywords01Wm, 1);
-
- UtRegisterTest("SigTest37ContentAndIsdataatKeywords02B2g",
- SigTest37ContentAndIsdataatKeywords02B2g, 1);
- UtRegisterTest("SigTest37ContentAndIsdataatKeywords02B3g",
- SigTest37ContentAndIsdataatKeywords02B3g, 1);
- UtRegisterTest("SigTest37ContentAndIsdataatKeywords02Wm" ,
- SigTest37ContentAndIsdataatKeywords02Wm, 1);
+ UtRegisterTest("SigTest36ContentAndIsdataatKeywords01",
+ SigTest36ContentAndIsdataatKeywords01, 1);
+ UtRegisterTest("SigTest37ContentAndIsdataatKeywords02",
+ SigTest37ContentAndIsdataatKeywords02, 1);
/* We need to enable these tests, as soon as we add the ICMPv6 protocol
support in our rules engine */
//UtRegisterTest("SigTest37NegativeICMPV6Keyword",
// SigTest37NegativeICMPV6Keyword, 1);
- UtRegisterTest("SigTest38B2g -- byte_test test (1)", SigTest38B2g, 1);
- UtRegisterTest("SigTest38B3g -- byte_test test (1)", SigTest38B3g, 1);
- UtRegisterTest("SigTest38Wm -- byte_test test (1)", SigTest38Wm, 1);
+ UtRegisterTest("SigTest38 -- byte_test test (1)", SigTest38, 1);
- UtRegisterTest("SigTest39B2g -- byte_jump test (2)", SigTest39B2g, 1);
- UtRegisterTest("SigTest39B3g -- byte_jump test (2)", SigTest39B3g, 1);
- UtRegisterTest("SigTest39Wm -- byte_jump test (2)", SigTest39Wm, 1);
+ UtRegisterTest("SigTest39 -- byte_jump test (2)", SigTest39, 1);
UtRegisterTest("SigTest40NoPacketInspection01", SigTest40NoPacketInspection01, 1);
UtRegisterTest("SigTest40NoPayloadInspection02", SigTest40NoPayloadInspection02, 1);
UtRegisterTest("SigTestSgh04", SigTestSgh04, 1);
UtRegisterTest("SigTestSgh05", SigTestSgh05, 1);
- UtRegisterTest("SigTestContent01B2g -- 32 byte pattern", SigTestContent01B2g, 1);
- UtRegisterTest("SigTestContent01B3g -- 32 byte pattern", SigTestContent01B3g, 1);
- UtRegisterTest("SigTestContent01Wm -- 32 byte pattern", SigTestContent01Wm, 1);
-
- UtRegisterTest("SigTestContent02B2g -- 32+31 byte pattern", SigTestContent02B2g, 1);
- UtRegisterTest("SigTestContent02B3g -- 32+31 byte pattern", SigTestContent02B3g, 1);
- UtRegisterTest("SigTestContent02Wm -- 32+31 byte pattern", SigTestContent02Wm, 1);
-
- UtRegisterTest("SigTestContent03B2g -- 32 byte pattern, x2 + distance", SigTestContent03B2g, 1);
- UtRegisterTest("SigTestContent03B3g -- 32 byte pattern, x2 + distance", SigTestContent03B3g, 1);
- UtRegisterTest("SigTestContent03Wm -- 32 byte pattern, x2 + distance", SigTestContent03Wm, 1);
-
- UtRegisterTest("SigTestContent04B2g -- 32 byte pattern, x2 + distance/within", SigTestContent04B2g, 1);
- UtRegisterTest("SigTestContent04B3g -- 32 byte pattern, x2 + distance/within", SigTestContent04B3g, 1);
- UtRegisterTest("SigTestContent04Wm -- 32 byte pattern, x2 + distance/within", SigTestContent04Wm, 1);
-
- UtRegisterTest("SigTestContent05B2g -- distance/within", SigTestContent05B2g, 1);
- UtRegisterTest("SigTestContent05B3g -- distance/within", SigTestContent05B3g, 1);
- UtRegisterTest("SigTestContent05Wm -- distance/within", SigTestContent05Wm, 1);
-
- UtRegisterTest("SigTestContent06B2g -- distance/within ip only", SigTestContent06B2g, 1);
- UtRegisterTest("SigTestContent06B3g -- distance/within ip only", SigTestContent06B3g, 1);
- UtRegisterTest("SigTestContent06Wm -- distance/within ip only", SigTestContent06Wm, 1);
-
- UtRegisterTest("SigTestWithinReal01B2g", SigTestWithinReal01B2g, 1);
- UtRegisterTest("SigTestWithinReal01B3g", SigTestWithinReal01B3g, 1);
- UtRegisterTest("SigTestWithinReal01Wm", SigTestWithinReal01Wm, 1);
+ UtRegisterTest("SigTestContent01 -- 32 byte pattern", SigTestContent01, 1);
+ UtRegisterTest("SigTestContent02 -- 32+31 byte pattern", SigTestContent02, 1);
+ UtRegisterTest("SigTestContent03 -- 32 byte pattern, x2 + distance", SigTestContent03, 1);
+ UtRegisterTest("SigTestContent04 -- 32 byte pattern, x2 + distance/within", SigTestContent04, 1);
+ UtRegisterTest("SigTestContent05 -- distance/within", SigTestContent05, 1);
+ UtRegisterTest("SigTestContent06 -- distance/within ip only", SigTestContent06, 1);
- UtRegisterTest("SigTestDepthOffset01B2g", SigTestDepthOffset01B2g, 1);
- UtRegisterTest("SigTestDepthOffset01B3g", SigTestDepthOffset01B3g, 1);
- UtRegisterTest("SigTestDepthOffset01Wm", SigTestDepthOffset01Wm, 1);
+ UtRegisterTest("SigTestWithinReal01", SigTestWithin01, 1);
+ UtRegisterTest("SigTestDepthOffset01", SigTestDepthOffset01, 1);
UtRegisterTest("SigTestDetectAlertCounter", SigTestDetectAlertCounter, 1);
+++ /dev/null
-/* Copyright (C) 2007-2014 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Anoop Saldanha <anoopsaldanha@gmail.com>
- *
- * Implementation of aho-corasick MPM from -
- *
- * Efficient String Matching: An Aid to Bibliographic Search
- * Alfred V. Aho and Margaret J. Corasick
- *
- * - We use the goto-failure table to calculate transitions.
- * - If we cross 2 ** 16 states, we use 4 bytes in the transition table
- * to hold each state, otherwise we use 2 bytes.
- * - To reduce memory consumption, we throw all the failure transitions
- * out and use binary search to pick out the right transition in
- * the modified goto table.
- *
- * \todo - Do a proper analyis of our existing MPMs and suggest a good one based
- * on the pattern distribution and the expected traffic(say http).
- * - Tried out loop unrolling without any perf increase. Need to dig deeper.
- * - Try out holding whether they are any output strings from a particular
- * state in one of the bytes of a state var. Will be useful in cuda esp.
- */
-
-#include "suricata-common.h"
-#include "suricata.h"
-
-#include "detect.h"
-#include "detect-parse.h"
-#include "detect-engine.h"
-#include "util-mpm-ac-gfbs.h"
-
-#include "conf.h"
-#include "util-memcmp.h"
-#include "util-memcpy.h"
-#include "util-debug.h"
-#include "util-unittest.h"
-#include "util-unittest-helper.h"
-
-void SCACGfbsInitCtx(MpmCtx *);
-void SCACGfbsInitThreadCtx(MpmCtx *, MpmThreadCtx *, uint32_t);
-void SCACGfbsDestroyCtx(MpmCtx *);
-void SCACGfbsDestroyThreadCtx(MpmCtx *, MpmThreadCtx *);
-int SCACGfbsAddPatternCI(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t,
- uint32_t, SigIntId, uint8_t);
-int SCACGfbsAddPatternCS(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t,
- uint32_t, SigIntId, uint8_t);
-int SCACGfbsPreparePatterns(MpmCtx *mpm_ctx);
-uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
- PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen);
-void SCACGfbsPrintInfo(MpmCtx *mpm_ctx);
-void SCACGfbsPrintSearchStats(MpmThreadCtx *mpm_thread_ctx);
-void SCACGfbsRegisterTests(void);
-
-/* a placeholder to denote a failure transition in the goto table */
-#define SC_AC_GFBS_FAIL (-1)
-/* size of the hash table used to speed up pattern insertions initially */
-#define INIT_HASH_SIZE 65536
-
-#define STATE_QUEUE_CONTAINER_SIZE 65536
-
-/**
- * \brief Helper structure used by AC during state table creation
- */
-typedef struct StateQueue_ {
- int32_t store[STATE_QUEUE_CONTAINER_SIZE];
- int top;
- int bot;
-} StateQueue;
-
-/**
- * \brief Register the goto failure table based aho-corasick mpm.
- */
-void MpmACGfbsRegister(void)
-{
- mpm_table[MPM_AC_GFBS].name = "ac-gfbs";
- /* don't need this. isn't that awesome? no more chopping and blah blah */
- mpm_table[MPM_AC_GFBS].max_pattern_length = 0;
-
- mpm_table[MPM_AC_GFBS].InitCtx = SCACGfbsInitCtx;
- mpm_table[MPM_AC_GFBS].InitThreadCtx = SCACGfbsInitThreadCtx;
- mpm_table[MPM_AC_GFBS].DestroyCtx = SCACGfbsDestroyCtx;
- mpm_table[MPM_AC_GFBS].DestroyThreadCtx = SCACGfbsDestroyThreadCtx;
- mpm_table[MPM_AC_GFBS].AddPattern = SCACGfbsAddPatternCS;
- mpm_table[MPM_AC_GFBS].AddPatternNocase = SCACGfbsAddPatternCI;
- mpm_table[MPM_AC_GFBS].Prepare = SCACGfbsPreparePatterns;
- mpm_table[MPM_AC_GFBS].Search = SCACGfbsSearch;
- mpm_table[MPM_AC_GFBS].Cleanup = NULL;
- mpm_table[MPM_AC_GFBS].PrintCtx = SCACGfbsPrintInfo;
- mpm_table[MPM_AC_GFBS].PrintThreadCtx = SCACGfbsPrintSearchStats;
- mpm_table[MPM_AC_GFBS].RegisterUnittests = SCACGfbsRegisterTests;
-
- return;
-}
-
-/**
- * \internal
- * \brief Initialize the AC context with user specified conf parameters. We
- * aren't retrieving anything for AC conf now, but we will certainly
- * need it, when we customize AC.
- */
-static void SCACGfbsGetConfig()
-{
- //ConfNode *ac_conf;
- //const char *hash_val = NULL;
-
- //ConfNode *pm = ConfGetNode("pattern-matcher");
-
- return;
-}
-
-/**
- * \internal
- * \brief Creates a hash of the pattern. We use it for the hashing process
- * during the initial pattern insertion time, to cull duplicate sigs.
- *
- * \param pat Pointer to the pattern.
- * \param patlen Pattern length.
- *
- * \retval hash A 32 bit unsigned hash.
- */
-static inline uint32_t SCACGfbsInitHashRaw(uint8_t *pat, uint16_t patlen)
-{
- uint32_t hash = patlen * pat[0];
- if (patlen > 1)
- hash += pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-/**
- * \internal
- * \brief Looks up a pattern. We use it for the hashing process during the
- * the initial pattern insertion time, to cull duplicate sigs.
- *
- * \param ctx Pointer to the AC ctx.
- * \param pat Pointer to the pattern.
- * \param patlen Pattern length.
- * \param flags Flags. We don't need this.
- *
- * \retval hash A 32 bit unsigned hash.
- */
-static inline SCACGfbsPattern *SCACGfbsInitHashLookup(SCACGfbsCtx *ctx, uint8_t *pat,
- uint16_t patlen, char flags,
- uint32_t pid)
-{
- uint32_t hash = SCACGfbsInitHashRaw(pat, patlen);
-
- if (ctx->init_hash == NULL)
- return NULL;
-
- SCACGfbsPattern *t = ctx->init_hash[hash];
- for ( ; t != NULL; t = t->next) {
- if (t->id == pid)
- return t;
- }
-
- return NULL;
-}
-
-/**
- * \internal
- * \brief Allocs a new pattern instance.
- *
- * \param mpm_ctx Pointer to the mpm context.
- *
- * \retval p Pointer to the newly created pattern.
- */
-static inline SCACGfbsPattern *SCACGfbsAllocPattern(MpmCtx *mpm_ctx)
-{
- SCACGfbsPattern *p = SCMalloc(sizeof(SCACGfbsPattern));
- if (unlikely(p == NULL)) {
- exit(EXIT_FAILURE);
- }
- memset(p, 0, sizeof(SCACGfbsPattern));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(SCACGfbsPattern);
-
- return p;
-}
-
-/**
- * \internal
- * \brief Used to free SCACGfbsPattern instances.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param p Pointer to the SCACGfbsPattern instance to be freed.
- */
-static inline void SCACGfbsFreePattern(MpmCtx *mpm_ctx, SCACGfbsPattern *p)
-{
- if (p != NULL && p->cs != NULL && p->cs != p->ci) {
- SCFree(p->cs);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p != NULL && p->ci != NULL) {
- SCFree(p->ci);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p != NULL && p->original_pat != NULL) {
- SCFree(p->original_pat);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p != NULL) {
- SCFree(p);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(SCACGfbsPattern);
- }
- return;
-}
-
-static inline uint32_t SCACGfbsInitHash(SCACGfbsPattern *p)
-{
- uint32_t hash = p->len * p->original_pat[0];
- if (p->len > 1)
- hash += p->original_pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline int SCACGfbsInitHashAdd(SCACGfbsCtx *ctx, SCACGfbsPattern *p)
-{
- uint32_t hash = SCACGfbsInitHash(p);
-
- if (ctx->init_hash == NULL) {
- return 0;
- }
-
- if (ctx->init_hash[hash] == NULL) {
- ctx->init_hash[hash] = p;
- return 0;
- }
-
- SCACGfbsPattern *tt = NULL;
- SCACGfbsPattern *t = ctx->init_hash[hash];
-
- /* get the list tail */
- do {
- tt = t;
- t = t->next;
- } while (t != NULL);
-
- tt->next = p;
-
- return 0;
-}
-
-/**
- * \internal
- * \brief Add a pattern to the mpm-ac context.
- *
- * \param mpm_ctx Mpm context.
- * \param pat Pointer to the pattern.
- * \param patlen Length of the pattern.
- * \param pid Pattern id
- * \param sid Signature id (internal id).
- * \param flags Pattern's MPM_PATTERN_* flags.
- *
- * \retval 0 On success.
- * \retval -1 On failure.
- */
-static int SCACGfbsAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid,
- SigIntId sid, uint8_t flags)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- SCLogDebug("Adding pattern for ctx %p, patlen %"PRIu16" and pid %" PRIu32,
- ctx, patlen, pid);
-
- if (patlen == 0) {
- SCLogWarning(SC_ERR_INVALID_ARGUMENTS, "pattern length 0");
- return 0;
- }
-
- /* check if we have already inserted this pattern */
- SCACGfbsPattern *p = SCACGfbsInitHashLookup(ctx, pat, patlen, flags, pid);
- if (p == NULL) {
- SCLogDebug("Allocing new pattern");
-
- /* p will never be NULL */
- p = SCACGfbsAllocPattern(mpm_ctx);
-
- p->len = patlen;
- p->flags = flags;
- p->id = pid;
-
- p->original_pat = SCMalloc(patlen);
- if (p->original_pat == NULL)
- goto error;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->original_pat, pat, patlen);
-
- p->ci = SCMalloc(patlen);
- if (p->ci == NULL)
- goto error;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy_tolower(p->ci, pat, patlen);
-
- /* setup the case sensitive part of the pattern */
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- /* nocase means no difference between cs and ci */
- p->cs = p->ci;
- } else {
- if (memcmp(p->ci, pat, p->len) == 0) {
- /* no diff between cs and ci: pat is lowercase */
- p->cs = p->ci;
- } else {
- p->cs = SCMalloc(patlen);
- if (p->cs == NULL)
- goto error;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->cs, pat, patlen);
- }
- }
-
- /* put in the pattern hash */
- SCACGfbsInitHashAdd(ctx, p);
-
- if (mpm_ctx->pattern_cnt == 65535) {
- SCLogError(SC_ERR_AHO_CORASICK, "Max search words reached. Can't "
- "insert anymore. Exiting");
- exit(EXIT_FAILURE);
- }
- mpm_ctx->pattern_cnt++;
-
- if (mpm_ctx->maxlen < patlen)
- mpm_ctx->maxlen = patlen;
-
- if (mpm_ctx->minlen == 0) {
- mpm_ctx->minlen = patlen;
- } else {
- if (mpm_ctx->minlen > patlen)
- mpm_ctx->minlen = patlen;
- }
-
- /* we need the max pat id */
- if (pid > ctx->max_pat_id)
- ctx->max_pat_id = pid;
-
- p->sids_size = 1;
- p->sids = SCMalloc(p->sids_size * sizeof(SigIntId));
- BUG_ON(p->sids == NULL);
- p->sids[0] = sid;
- } else {
- /* TODO figure out how we can be called multiple times for the same CTX with the same sid */
-
- int found = 0;
- uint32_t x = 0;
- for (x = 0; x < p->sids_size; x++) {
- if (p->sids[x] == sid) {
- found = 1;
- break;
- }
- }
- if (!found) {
- SigIntId *sids = SCRealloc(p->sids, (sizeof(SigIntId) * (p->sids_size + 1)));
- BUG_ON(sids == NULL);
- p->sids = sids;
- p->sids[p->sids_size] = sid;
- p->sids_size++;
- }
- }
-
- return 0;
-
-error:
- SCACGfbsFreePattern(mpm_ctx, p);
- return -1;
-}
-
-/**
- * \internal
- * \brief Initialize a new state in the goto and output tables.
- *
- * \param mpm_ctx Pointer to the mpm context.
- *
- * \retval The state id, of the newly created state.
- */
-static inline int SCACGfbsInitNewState(MpmCtx *mpm_ctx)
-{
- void *ptmp;
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- int ascii_code = 0;
- int size = 0;
-
- /* reallocate space in the goto table to include a new state */
- size = (ctx->state_count + 1) * 1024;
- ptmp = SCRealloc(ctx->goto_table, size);
- if (ptmp == NULL) {
- SCFree(ctx->goto_table);
- ctx->goto_table = NULL;
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- ctx->goto_table = ptmp;
-
- /* set all transitions for the newly assigned state as FAIL transitions */
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- ctx->goto_table[ctx->state_count][ascii_code] = SC_AC_GFBS_FAIL;
- }
-
- /* reallocate space in the output table for the new state */
- size = (ctx->state_count + 1) * sizeof(SCACGfbsOutputTable);
- ptmp = SCRealloc(ctx->output_table, size);
- if (ptmp == NULL) {
- SCFree(ctx->output_table);
- ctx->output_table = NULL;
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- ctx->output_table = ptmp;
-
- memset(ctx->output_table + ctx->state_count, 0, sizeof(SCACGfbsOutputTable));
-
- /* \todo using it temporarily now during dev, since I have restricted
- * state var in SCACGfbsCtx->state_table to uint16_t. */
- //if (ctx->state_count > 65536) {
- // printf("state count exceeded\n");
- // exit(EXIT_FAILURE);
- //}
-
- return ctx->state_count++;
-}
-
-/**
- * \internal
- * \brief Adds a pid to the output table for a state.
- *
- * \param state The state to whose output table we should add the pid.
- * \param pid The pattern id to add.
- * \param mpm_ctx Pointer to the mpm context.
- */
-static void SCACGfbsSetOutputState(int32_t state, uint32_t pid, MpmCtx *mpm_ctx)
-{
- void *ptmp;
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- SCACGfbsOutputTable *output_state = &ctx->output_table[state];
- uint32_t i = 0;
-
- for (i = 0; i < output_state->no_of_entries; i++) {
- if (output_state->pids[i] == pid)
- return;
- }
-
- output_state->no_of_entries++;
- ptmp = SCRealloc(output_state->pids,
- output_state->no_of_entries * sizeof(uint32_t));
- if (ptmp == NULL) {
- SCFree(output_state->pids);
- output_state->pids = NULL;
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- output_state->pids = ptmp;
-
- output_state->pids[output_state->no_of_entries - 1] = pid;
-
- return;
-}
-
-/**
- * \brief Helper function used by SCACGfbsCreateGotoTable. Adds a pattern to the
- * goto table.
- *
- * \param pattern Pointer to the pattern.
- * \param pattern_len Pattern length.
- * \param pid The pattern id, that corresponds to this pattern. We
- * need it to updated the output table for this pattern.
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsEnter(uint8_t *pattern, uint16_t pattern_len, uint32_t pid,
- MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- int32_t state = 0;
- int32_t newstate = 0;
- int i = 0;
- int p = 0;
-
- /* walk down the trie till we have a match for the pattern prefix */
- state = 0;
- for (i = 0; i < pattern_len; i++) {
- if (ctx->goto_table[state][pattern[i]] != SC_AC_GFBS_FAIL) {
- state = ctx->goto_table[state][pattern[i]];
- } else {
- break;
- }
- }
-
- /* add the non-matching pattern suffix to the trie, from the last state
- * we left off */
- for (p = i; p < pattern_len; p++) {
- newstate = SCACGfbsInitNewState(mpm_ctx);
- ctx->goto_table[state][pattern[p]] = newstate;
- state = newstate;
- }
-
- /* add this pattern id, to the output table of the last state, where the
- * pattern ends in the trie */
- SCACGfbsSetOutputState(state, pid, mpm_ctx);
-
- return;
-}
-
-/**
- * \internal
- * \brief Create the goto table.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsCreateGotoTable(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- uint32_t i = 0;
-
- /* add each pattern to create the goto table */
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- SCACGfbsEnter(ctx->parray[i]->ci, ctx->parray[i]->len,
- ctx->parray[i]->id, mpm_ctx);
- }
-
- int ascii_code = 0;
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- if (ctx->goto_table[0][ascii_code] == SC_AC_GFBS_FAIL) {
- ctx->goto_table[0][ascii_code] = 0;
- }
- }
-
- return;
-}
-
-static inline int SCACGfbsStateQueueIsEmpty(StateQueue *q)
-{
- if (q->top == q->bot)
- return 1;
- else
- return 0;
-}
-
-static inline void SCACGfbsEnqueue(StateQueue *q, int32_t state)
-{
- int i = 0;
-
- /*if we already have this */
- for (i = q->bot; i < q->top; i++) {
- if (q->store[i] == state)
- return;
- }
-
- q->store[q->top++] = state;
-
- if (q->top == STATE_QUEUE_CONTAINER_SIZE)
- q->top = 0;
-
- if (q->top == q->bot) {
- SCLogCritical(SC_ERR_AHO_CORASICK, "Just ran out of space in the queue. "
- "Fatal Error. Exiting. Please file a bug report on this");
- exit(EXIT_FAILURE);
- }
-
- return;
-}
-
-static inline int32_t SCACGfbsDequeue(StateQueue *q)
-{
- if (q->bot == STATE_QUEUE_CONTAINER_SIZE)
- q->bot = 0;
-
- if (q->bot == q->top) {
- SCLogCritical(SC_ERR_AHO_CORASICK, "StateQueue behaving weirdly. "
- "Fatal Error. Exiting. Please file a bug report on this");
- exit(EXIT_FAILURE);
- }
-
- return q->store[q->bot++];
-}
-
-/*
-#define SCACGfbsStateQueueIsEmpty(q) (((q)->top == (q)->bot) ? 1 : 0)
-
-#define SCACGfbsEnqueue(q, state) do { \
- int i = 0; \
- \
- for (i = (q)->bot; i < (q)->top; i++) { \
- if ((q)->store[i] == state) \
- return; \
- } \
- \
- (q)->store[(q)->top++] = state; \
- \
- if ((q)->top == STATE_QUEUE_CONTAINER_SIZE) \
- (q)->top = 0; \
- \
- if ((q)->top == (q)->bot) { \
- SCLogCritical(SC_ERR_AHO_CORASICK, "Just ran out of space in the queue. " \
- "Fatal Error. Exiting. Please file a bug report on this"); \
- exit(EXIT_FAILURE); \
- } \
- } while (0)
-
-#define SCACGfbsDequeue(q) ( (((q)->bot == STATE_QUEUE_CONTAINER_SIZE)? ((q)->bot = 0): 0), \
- (((q)->bot == (q)->top) ? \
- (printf("StateQueue behaving " \
- "weirdly. Fatal Error. Exiting. Please " \
- "file a bug report on this"), \
- exit(EXIT_FAILURE)) : 0), \
- (q)->store[(q)->bot++]) \
-*/
-
-/**
- * \internal
- * \brief Club the output data from 2 states and store it in the 1st state.
- * dst_state_data = {dst_state_data} UNION {src_state_data}
- *
- * \todo Use a better way to find union of 2 sets.
- *
- * \param dst_state First state(also the destination) for the union operation.
- * \param src_state Second state for the union operation.
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsClubOutputStates(int32_t dst_state, int32_t src_state,
- MpmCtx *mpm_ctx)
-{
- void *ptmp;
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- uint32_t i = 0;
- uint32_t j = 0;
-
- SCACGfbsOutputTable *output_dst_state = &ctx->output_table[dst_state];
- SCACGfbsOutputTable *output_src_state = &ctx->output_table[src_state];
-
- for (i = 0; i < output_src_state->no_of_entries; i++) {
- for (j = 0; j < output_dst_state->no_of_entries; j++) {
- if (output_src_state->pids[i] == output_dst_state->pids[j]) {
- break;
- }
- }
- if (j == output_dst_state->no_of_entries) {
- output_dst_state->no_of_entries++;
-
- ptmp = SCRealloc(output_dst_state->pids,
- (output_dst_state->no_of_entries * sizeof(uint32_t)));
- if (ptmp == NULL) {
- SCFree(output_dst_state->pids);
- output_dst_state->pids = NULL;
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- output_dst_state->pids = ptmp;
-
- output_dst_state->pids[output_dst_state->no_of_entries - 1] =
- output_src_state->pids[i];
- }
- }
-
- return;
-}
-
-/**
- * \internal
- * \brief Create the failure table.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsCreateFailureTable(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- int ascii_code = 0;
- int32_t state = 0;
- int32_t r_state = 0;
-
- StateQueue q;
- memset(&q, 0, sizeof(StateQueue));
-
- /* allot space for the failure table. A failure entry in the table for
- * every state(SCACGfbsCtx->state_count) */
- ctx->failure_table = SCMalloc(ctx->state_count * sizeof(int32_t));
- if (ctx->failure_table == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->failure_table, 0, ctx->state_count * sizeof(int32_t));
-
- /* add the failure transitions for the 0th state, and add every non-fail
- * transition from the 0th state to the queue for further processing
- * of failure states */
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- int32_t temp_state = ctx->goto_table[0][ascii_code];
- if (temp_state != 0) {
- SCACGfbsEnqueue(&q, temp_state);
- ctx->failure_table[temp_state] = 0;
- }
- }
-
- while (!SCACGfbsStateQueueIsEmpty(&q)) {
- /* pick up every state from the queue and add failure transitions */
- r_state = SCACGfbsDequeue(&q);
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- int32_t temp_state = ctx->goto_table[r_state][ascii_code];
- if (temp_state == SC_AC_GFBS_FAIL)
- continue;
- SCACGfbsEnqueue(&q, temp_state);
- state = ctx->failure_table[r_state];
-
- while(ctx->goto_table[state][ascii_code] == SC_AC_GFBS_FAIL)
- state = ctx->failure_table[state];
- ctx->failure_table[temp_state] = ctx->goto_table[state][ascii_code];
- SCACGfbsClubOutputStates(temp_state, ctx->failure_table[temp_state],
- mpm_ctx);
- }
- }
-
- return;
-}
-
-/**
- * \internal
- * \brief Creates a new goto table structure(throw out all the failure
- * transitions), to hold the existing goto table.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsCreateModGotoTable(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- if (ctx->state_count < 32767) {
- int size = 0;
- int32_t state = 0;
- for (state = 1; state < ctx->state_count; state++) {
- int k = 0;
- int ascii_code = 0;
- for (; ascii_code < 256; ascii_code++) {
- if (ctx->goto_table[state][ascii_code] == SC_AC_GFBS_FAIL)
- continue;
- k++;
- }
-
- if ((k % 2) != 0)
- size += 1;
- }
-
- /* Let us use uint16_t for all. That way we don't have to worry about
- * alignment. Technically 8 bits is all we need to store ascii codes,
- * but by avoiding it, we save a lot of time on handling alignment */
- size += (ctx->state_count * sizeof(SC_AC_GFBS_STATE_TYPE_U16) * 3 +
- ctx->state_count * sizeof(uint8_t) +
- 256 * sizeof(SC_AC_GFBS_STATE_TYPE_U16) * 1);
- ctx->goto_table_mod = SCMalloc(size);
- if (ctx->goto_table_mod == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->goto_table_mod, 0, size);
- //printf("size- %d\n", size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += size;
-
- /* buffer to hold pointers in the buffer, so that a state can use it
- * directly to access its state data */
- ctx->goto_table_mod_pointers = SCMalloc(ctx->state_count * sizeof(uint8_t *));
- if (ctx->goto_table_mod_pointers == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->goto_table_mod_pointers, 0,
- ctx->state_count * sizeof(uint8_t *));
-
- SC_AC_GFBS_STATE_TYPE_U16 temp_states[256];
- uint16_t *curr_loc = (uint16_t *)ctx->goto_table_mod;
- uint16_t *no_of_entries = NULL;
- uint16_t *failure_entry = NULL;
- uint8_t *ascii_codes = NULL;
- uint16_t ascii_code = 0;
- uint16_t k = 0;
- for (state = 0; state < ctx->state_count; state++) {
- /* store the starting location in the buffer for this state */
- ctx->goto_table_mod_pointers[state] = (uint8_t *)curr_loc;
- no_of_entries = curr_loc++;
- failure_entry = curr_loc++;
- ascii_codes = (uint8_t *)curr_loc;
- k = 0;
- /* store all states that have non fail transitions in the temp buffer */
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- if (ctx->goto_table[state][ascii_code] == SC_AC_GFBS_FAIL)
- continue;
- ascii_codes[k] = ascii_code;
- temp_states[k] = ctx->goto_table[state][ascii_code];
- k++;
- }
- /* if we have any non fail transitions from our previous for search,
- * store the acii codes as well the corresponding states */
- if (k > 0) {
- no_of_entries[0] = k;
- if (state != 0) {
- int jump = (k + 1) & 0xFFE;
- curr_loc += jump / 2;
- }
- memcpy(curr_loc, temp_states, k * sizeof(SC_AC_GFBS_STATE_TYPE_U16));
- curr_loc += k;
- }
- failure_entry[0] = ctx->failure_table[state];
- }
-
- /* > 33766 */
- } else {
- int size = 0;
- int32_t state = 0;
- for (state = 1; state < ctx->state_count; state++) {
- int k = 0;
- int ascii_code = 0;
- for (; ascii_code < 256; ascii_code++) {
- if (ctx->goto_table[state][ascii_code] == SC_AC_GFBS_FAIL)
- continue;
- k++;
- }
-
- if ( (k % 4) != 0)
- size += (4 - (k % 4));
- }
-
- /* Let us use uint32_t for all. That way we don't have to worry about
- * alignment. Technically 8 bits is all we need to store ascii codes,
- * but by avoiding it, we save a lot of time on handling alignment */
- size += (ctx->state_count * (sizeof(SC_AC_GFBS_STATE_TYPE_U32) * 3)+
- ctx->state_count * sizeof(uint8_t) +
- 256 * (sizeof(SC_AC_GFBS_STATE_TYPE_U32) * 1));
- ctx->goto_table_mod = SCMalloc(size);
- if (ctx->goto_table_mod == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->goto_table_mod, 0, size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += size;
-
- /* buffer to hold pointers in the buffer, so that a state can use it
- * directly to access its state data */
- ctx->goto_table_mod_pointers = SCMalloc(ctx->state_count * sizeof(uint8_t *));
- if (ctx->goto_table_mod_pointers == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->goto_table_mod_pointers, 0,
- ctx->state_count * sizeof(uint8_t *));
-
- SC_AC_GFBS_STATE_TYPE_U32 temp_states[256];
- uint32_t *curr_loc = (uint32_t *)ctx->goto_table_mod;
- uint32_t *no_of_entries = NULL;
- uint32_t *failure_entry = NULL;
- uint8_t *ascii_codes = NULL;
- uint16_t ascii_code = 0;
- uint16_t k = 0;
- for (state = 0; state < ctx->state_count; state++) {
- /* store the starting location in the buffer for this state */
- ctx->goto_table_mod_pointers[state] = (uint8_t *)curr_loc;
- no_of_entries = curr_loc++;
- failure_entry = curr_loc++;
- ascii_codes = (uint8_t *)curr_loc;
- k = 0;
- /* store all states that have non fail transitions in the temp buffer */
- for (ascii_code = 0; ascii_code < 256; ascii_code++) {
- if (ctx->goto_table[state][ascii_code] == SC_AC_GFBS_FAIL)
- continue;
- ascii_codes[k] = ascii_code;
- temp_states[k] = ctx->goto_table[state][ascii_code];
- k++;
- }
- /* if we have any non fail transitions from our previous for search,
- * store the acii codes as well the corresponding states */
- if (k > 0) {
- no_of_entries[0] = k;
- if (state != 0) {
- int jump = (k + 3) & 0xFFC;
- curr_loc += jump / 4;
- }
- memcpy(curr_loc, temp_states, k * sizeof(SC_AC_GFBS_STATE_TYPE_U32));
- curr_loc += k;
- }
- failure_entry[0] = ctx->failure_table[state];
- }
- }
-
- return;
-}
-
-static inline void SCACGfbsClubOutputStatePresenceWithModGotoTable(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- int state = 0;
- int no_of_entries;
- int i;
-
- if (ctx->state_count < 32767) {
- uint16_t *states;
- for (state = 0; state < ctx->state_count; state++) {
- no_of_entries = *((uint16_t *)ctx->goto_table_mod_pointers[state]);
- if (no_of_entries == 0)
- continue;
-
- //if (*((uint16_t *)ctx->goto_table_mod_pointers[state] + 1) != 0) {
- if (ctx->output_table[((uint16_t *)ctx->goto_table_mod_pointers[state] + 1)[0]].no_of_entries != 0) {
- *((uint16_t *)ctx->goto_table_mod_pointers[state] + 1) |= (1 << 15);
- }
-
- if (state == 0)
- states = ((uint16_t *)ctx->goto_table_mod_pointers[state] + 2);
- else
- states = ((uint16_t *)ctx->goto_table_mod_pointers[state] + 2 + ((no_of_entries + 1) & 0xFFE) / 2);
- for (i = 0; i < no_of_entries; i++) {
- //if (states[i] == 0)
- if (ctx->output_table[states[i]].no_of_entries == 0)
- continue;
-
- states[i] |= (1 << 15);
- }
- }
-
- } else {
- uint32_t *states;
- for (state = 0; state < ctx->state_count; state++) {
- no_of_entries = *((uint32_t *)ctx->goto_table_mod_pointers[state]);
- if (no_of_entries == 0)
- continue;
-
- //if (*((uint32_t *)ctx->goto_table_mod_pointers[state] + 1) != 0) {
- if (ctx->output_table[((uint32_t *)ctx->goto_table_mod_pointers[state] + 1)[0]].no_of_entries != 0) {
- *((uint32_t *)ctx->goto_table_mod_pointers[state] + 1) |= (1 << 24);
- }
-
- if (state == 0)
- states = ((uint32_t *)ctx->goto_table_mod_pointers[state] + 2);
- else
- states = ((uint32_t *)ctx->goto_table_mod_pointers[state] + 2 + ((no_of_entries + 3) & 0xFFC) / 4);
- for (i = 0; i < no_of_entries; i++) {
- //if (states[i] == 0)
- if (ctx->output_table[states[i]].no_of_entries == 0)
- continue;
-
- states[i] |= (1 << 24);
- }
- }
- }
-
- return;
-}
-
-static inline void SCACGfbsInsertCaseSensitiveEntriesForPatterns(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- int32_t state = 0;
- uint32_t k = 0;
-
- for (state = 0; state < ctx->state_count; state++) {
- if (ctx->output_table[state].no_of_entries == 0)
- continue;
-
- for (k = 0; k < ctx->output_table[state].no_of_entries; k++) {
- if (ctx->pid_pat_list[ctx->output_table[state].pids[k]].cs != NULL) {
- ctx->output_table[state].pids[k] &= 0x0000FFFF;
- ctx->output_table[state].pids[k] |= 1 << 16;
- }
- }
- }
-
- return;
-}
-
-/**
- * \brief Process the patterns and prepare the state table.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-static inline void SCACGfbsPrepareStateTable(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- /* create the 0th state in the goto table and output_table */
- SCACGfbsInitNewState(mpm_ctx);
-
- /* create the goto table */
- SCACGfbsCreateGotoTable(mpm_ctx);
- /* create the failure table */
- SCACGfbsCreateFailureTable(mpm_ctx);
- /* create the final state(delta) table */
- SCACGfbsCreateModGotoTable(mpm_ctx);
- /* club the output state presence with transition entries */
- SCACGfbsClubOutputStatePresenceWithModGotoTable(mpm_ctx);
-
- /* club nocase entries */
- SCACGfbsInsertCaseSensitiveEntriesForPatterns(mpm_ctx);
-
- /* we don't need this anymore */
- SCFree(ctx->goto_table);
- ctx->goto_table = NULL;
- SCFree(ctx->failure_table);
- ctx->failure_table = NULL;
-
- return;
-}
-
-/**
- * \brief Process the patterns added to the mpm, and create the internal tables.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-int SCACGfbsPreparePatterns(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- if (mpm_ctx->pattern_cnt == 0 || ctx->init_hash == NULL) {
- SCLogDebug("No patterns supplied to this mpm_ctx");
- return 0;
- }
-
- /* alloc the pattern array */
- ctx->parray = (SCACGfbsPattern **)SCMalloc(mpm_ctx->pattern_cnt *
- sizeof(SCACGfbsPattern *));
- if (ctx->parray == NULL)
- goto error;
- memset(ctx->parray, 0, mpm_ctx->pattern_cnt * sizeof(SCACGfbsPattern *));
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (mpm_ctx->pattern_cnt * sizeof(SCACGfbsPattern *));
-
- /* populate it with the patterns in the hash */
- uint32_t i = 0, p = 0;
- for (i = 0; i < INIT_HASH_SIZE; i++) {
- SCACGfbsPattern *node = ctx->init_hash[i], *nnode = NULL;
- while(node != NULL) {
- nnode = node->next;
- node->next = NULL;
- ctx->parray[p++] = node;
- node = nnode;
- }
- }
-
- /* we no longer need the hash, so free it's memory */
- SCFree(ctx->init_hash);
- ctx->init_hash = NULL;
-
- /* the memory consumed by a single state in our goto table */
- //ctx->single_state_size = sizeof(int32_t) * 256;
-
- /* handle no case patterns */
- ctx->pid_pat_list = SCMalloc((ctx->max_pat_id + 1)* sizeof(SCACGfbsPatternList));
- if (ctx->pid_pat_list == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memset(ctx->pid_pat_list, 0, (ctx->max_pat_id + 1) * sizeof(SCACGfbsPatternList));
-
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (!(ctx->parray[i]->flags & MPM_PATTERN_FLAG_NOCASE)) {
- ctx->pid_pat_list[ctx->parray[i]->id].cs = SCMalloc(ctx->parray[i]->len);
- if (ctx->pid_pat_list[ctx->parray[i]->id].cs == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- exit(EXIT_FAILURE);
- }
- memcpy(ctx->pid_pat_list[ctx->parray[i]->id].cs,
- ctx->parray[i]->original_pat, ctx->parray[i]->len);
- ctx->pid_pat_list[ctx->parray[i]->id].patlen = ctx->parray[i]->len;
- }
-
- /* ACPatternList now owns this memory */
- ctx->pid_pat_list[ctx->parray[i]->id].sids_size = ctx->parray[i]->sids_size;
- ctx->pid_pat_list[ctx->parray[i]->id].sids = ctx->parray[i]->sids;
- }
-
- /* prepare the state table required by AC */
- SCACGfbsPrepareStateTable(mpm_ctx);
-
- /* free all the stored patterns. Should save us a good 100-200 mbs */
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (ctx->parray[i] != NULL) {
- SCACGfbsFreePattern(mpm_ctx, ctx->parray[i]);
- }
- }
- SCFree(ctx->parray);
- ctx->parray = NULL;
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(SCACGfbsPattern *));
-
- return 0;
-
-error:
- return -1;
-}
-
-/**
- * \brief Init the mpm thread context.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param mpm_thread_ctx Pointer to the mpm thread context.
- * \param matchsize We don't need this.
- */
-void SCACGfbsInitThreadCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
- uint32_t matchsize)
-{
- memset(mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
-
- mpm_thread_ctx->ctx = SCMalloc(sizeof(SCACGfbsThreadCtx));
- if (mpm_thread_ctx->ctx == NULL) {
- exit(EXIT_FAILURE);
- }
- memset(mpm_thread_ctx->ctx, 0, sizeof(SCACGfbsThreadCtx));
- mpm_thread_ctx->memory_cnt++;
- mpm_thread_ctx->memory_size += sizeof(SCACGfbsThreadCtx);
-
- return;
-}
-
-/**
- * \brief Initialize the AC context.
- *
- * \param mpm_ctx Mpm context.
- * \param module_handle Cuda module handle from the cuda handler API. We don't
- * have to worry about this here.
- */
-void SCACGfbsInitCtx(MpmCtx *mpm_ctx)
-{
- if (mpm_ctx->ctx != NULL)
- return;
-
- mpm_ctx->ctx = SCMalloc(sizeof(SCACGfbsCtx));
- if (mpm_ctx->ctx == NULL) {
- exit(EXIT_FAILURE);
- }
- memset(mpm_ctx->ctx, 0, sizeof(SCACGfbsCtx));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(SCACGfbsCtx);
-
- /* initialize the hash we use to speed up pattern insertions */
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- ctx->init_hash = SCMalloc(sizeof(SCACGfbsPattern *) * INIT_HASH_SIZE);
- if (ctx->init_hash == NULL) {
- exit(EXIT_FAILURE);
- }
- memset(ctx->init_hash, 0, sizeof(SCACGfbsPattern *) * INIT_HASH_SIZE);
-
- /* get conf values for AC from our yaml file. We have no conf values for
- * now. We will certainly need this, as we develop the algo */
- SCACGfbsGetConfig();
-
- SCReturn;
-}
-
-/**
- * \brief Destroy the mpm thread context.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param mpm_thread_ctx Pointer to the mpm thread context.
- */
-void SCACGfbsDestroyThreadCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx)
-{
- SCACGfbsPrintSearchStats(mpm_thread_ctx);
-
- if (mpm_thread_ctx->ctx != NULL) {
- SCFree(mpm_thread_ctx->ctx);
- mpm_thread_ctx->ctx = NULL;
- mpm_thread_ctx->memory_cnt--;
- mpm_thread_ctx->memory_size -= sizeof(SCACGfbsThreadCtx);
- }
-
- return;
-}
-
-/**
- * \brief Destroy the mpm context.
- *
- * \param mpm_ctx Pointer to the mpm context.
- */
-void SCACGfbsDestroyCtx(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- if (ctx == NULL)
- return;
-
- if (ctx->init_hash != NULL) {
- SCFree(ctx->init_hash);
- ctx->init_hash = NULL;
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (INIT_HASH_SIZE * sizeof(SCACGfbsPattern *));
- }
-
- if (ctx->parray != NULL) {
- uint32_t i;
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (ctx->parray[i] != NULL) {
- SCACGfbsFreePattern(mpm_ctx, ctx->parray[i]);
- }
- }
-
- SCFree(ctx->parray);
- ctx->parray = NULL;
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(SCACGfbsPattern *));
- }
-
- if (ctx->goto_table_mod != NULL) {
- SCFree(ctx->goto_table_mod);
- ctx->goto_table_mod = NULL;
-
- mpm_ctx->memory_cnt--;
- if (ctx->state_count < 32767) {
- mpm_ctx->memory_size -= (ctx->state_count * sizeof(SC_AC_GFBS_STATE_TYPE_U16) * 3 +
- 256 * sizeof(SC_AC_GFBS_STATE_TYPE_U16) * 2);
- } else {
- mpm_ctx->memory_size -= (ctx->state_count * sizeof(SC_AC_GFBS_STATE_TYPE_U32) * 3 +
- 256 * sizeof(SC_AC_GFBS_STATE_TYPE_U32) * 2);
- }
- }
-
- if (ctx->goto_table_mod_pointers != NULL) {
- SCFree(ctx->goto_table_mod_pointers);
- ctx->goto_table_mod_pointers = NULL;
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= ctx->state_count * sizeof(uint8_t *);
- }
-
- if (ctx->output_table != NULL) {
- int32_t state_count;
- for (state_count = 0; state_count < ctx->state_count; state_count++) {
- if (ctx->output_table[state_count].pids != NULL) {
- SCFree(ctx->output_table[state_count].pids);
- }
- }
- SCFree(ctx->output_table);
- }
-
- if (ctx->pid_pat_list != NULL) {
- uint32_t i;
- for (i = 0; i < (ctx->max_pat_id + 1); i++) {
- if (ctx->pid_pat_list[i].cs != NULL)
- SCFree(ctx->pid_pat_list[i].cs);
- if (ctx->pid_pat_list[i].sids != NULL)
- SCFree(ctx->pid_pat_list[i].sids);
- }
- SCFree(ctx->pid_pat_list);
- }
-
- SCFree(mpm_ctx->ctx);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(SCACGfbsCtx);
-
- return;
-}
-
-/**
- * \brief The aho corasick search function.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param mpm_thread_ctx Pointer to the mpm thread context.
- * \param pmq Pointer to the Pattern Matcher Queue to hold
- * search matches.
- * \param buf Buffer to be searched.
- * \param buflen Buffer length.
- *
- * \retval matches Match count.
- */
-uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
- PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
- int matches = 0;
- uint8_t buf_local;
-
- SCACGfbsPatternList *pid_pat_list = ctx->pid_pat_list;
-
- uint8_t bitarray[pmq->pattern_id_bitarray_size];
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
-
- /* really hate the extra cmp here, but can't help it */
- if (ctx->state_count < 32767) {
- /* \todo Change it for stateful MPM. Supply the state using mpm_thread_ctx */
- int32_t temp_state;
- uint16_t no_of_entries;
- uint8_t *ascii_codes;
- uint16_t **goto_table_mod_pointers = (uint16_t **)ctx->goto_table_mod_pointers;
-
- //int32_t *failure_table = ctx->failure_table;
- int i;
- /* \todo tried loop unrolling with register var, with no perf increase. Need
- * to dig deeper */
- /* with so many var declarations the register declaration here is useless */
- register int32_t state = 0;
- for (i = 0; i < buflen; i++) {
- if (state == 0) {
- state = (goto_table_mod_pointers[0] + 2)[u8_tolower(buf[i])];
- } else {
-
- /* get the goto state transition */
- no_of_entries = *(goto_table_mod_pointers[state & 0x7FFF]);
- if (no_of_entries == 0) {
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- if (no_of_entries == 1) {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x7FFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (buf_local == ascii_codes[0])
- temp_state = ((uint16_t *)(ascii_codes + ((no_of_entries + 1) & 0xFFE)))[0];
- else
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- buf_local = u8_tolower(buf[i]);
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x7FFF] + 2);
- int low = 0;
- int high = no_of_entries;
- int mid;
- temp_state = SC_AC_GFBS_FAIL;
- while (low <= high) {
- mid = (low + high) / 2;
- if (ascii_codes[mid] == buf_local) {
- temp_state = ((uint16_t *)(ascii_codes + ((no_of_entries + 1) & 0xFFE)))[mid];
- break;
- } else if (ascii_codes[mid] < buf_local) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- }
- }
- while (temp_state == SC_AC_GFBS_FAIL) {
- state = *(goto_table_mod_pointers[state & 0x7FFF] + 1);
-
- /* get the goto state transition */
- no_of_entries = *(goto_table_mod_pointers[state & 0x7FFF]);
- if (no_of_entries == 0) {
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- if (no_of_entries == 1) {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x7FFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (buf_local == ascii_codes[0])
- temp_state = ((uint16_t *)(ascii_codes + ((no_of_entries + 1) & 0xFFE)))[0];
- else
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x7FFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (state == 0) {
- temp_state = ((uint16_t *)ascii_codes)[buf_local];
- } else {
- int low = 0;
- int high = no_of_entries;
- int mid;
- temp_state = SC_AC_GFBS_FAIL;
- while (low <= high) {
- mid = (low + high) / 2;
- if (ascii_codes[mid] == buf_local) {
- temp_state = ((uint16_t *)(ascii_codes + ((no_of_entries + 1) & 0xFFE)))[mid];
- break;
- } else if (ascii_codes[mid] < buf_local) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- }
- }
- } /* else - if (no_of_entries == 0) */
- } /* while (temp_state == SC_AC_GFBS_FAIL) */
-
- state = temp_state;
-
- }
-
- if (state & 0x8000) {
- uint32_t no_of_pid_entries = ctx->output_table[state & 0x7FFF].no_of_entries;
- uint32_t *pids = ctx->output_table[state & 0x7FFF].pids;
- uint32_t k = 0;
- for (k = 0; k < no_of_pid_entries; k++) {
- if (pids[k] & 0xFFFF0000) {
- uint32_t lower_pid = pids[k] & 0x0000FFFF;
- if (SCMemcmp(pid_pat_list[lower_pid].cs,
- buf + i - pid_pat_list[lower_pid].patlen + 1,
- pid_pat_list[lower_pid].patlen) != 0) {
- /* inside loop */
- continue;
- }
-
- if (bitarray[(lower_pid) / 8] & (1 << ((lower_pid) % 8))) {
- ;
- } else {
- bitarray[(lower_pid) / 8] |= (1 << ((lower_pid) % 8));
- pmq->pattern_id_bitarray[(lower_pid) / 8] |= (1 << ((lower_pid) % 8));
-
- MpmAddPid(pmq, lower_pid);
- MpmAddSids(pmq, pid_pat_list[lower_pid].sids, pid_pat_list[lower_pid].sids_size);
- }
- matches++;
- } else {
- if (bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
- ;
- } else {
- bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
- pmq->pattern_id_bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
-
- MpmAddPid(pmq, pids[k]);
- MpmAddSids(pmq, pid_pat_list[pids[k]].sids, pid_pat_list[pids[k]].sids_size);
- }
- matches++;
- }
- }
- } /* if (ctx->output_table[state].no_of_entries != 0) */
- } /* for (i = 0; i < buflen; i++) */
-
- } else {
- /* \todo Change it for stateful MPM. Supply the state using mpm_thread_ctx */
- int32_t temp_state = 0;
- uint32_t no_of_entries;
- uint8_t *ascii_codes = NULL;
- uint32_t **goto_table_mod_pointers = (uint32_t **)ctx->goto_table_mod_pointers;
- //int32_t *failure_table = ctx->failure_table;
- int i = 0;
- /* \todo tried loop unrolling with register var, with no perf increase. Need
- * to dig deeper */
- register int32_t state = 0;
- for (i = 0; i < buflen; i++) {
- if (state == 0) {
- state = (goto_table_mod_pointers[0] + 2)[u8_tolower(buf[i])];
- } else {
-
- /* get the goto state transition */
- no_of_entries = *(goto_table_mod_pointers[state & 0x00FFFFFF]);
- if (no_of_entries == 0) {
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- if (no_of_entries == 1) {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x00FFFFFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (buf_local == ascii_codes[0])
- temp_state = ((uint32_t *)(ascii_codes + ((no_of_entries + 3) & 0xFFC)))[0];
- else
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- buf_local = u8_tolower(buf[i]);
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x00FFFFFF] + 2);
- int low = 0;
- int high = no_of_entries;
- int mid;
- temp_state = SC_AC_GFBS_FAIL;
- while (low <= high) {
- mid = (low + high) / 2;
- if (ascii_codes[mid] == buf_local) {
- temp_state = ((uint32_t *)(ascii_codes + ((no_of_entries + 3) & 0xFFC)))[mid];
- break;
- } else if (ascii_codes[mid] < buf_local) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- }
- }
- while (temp_state == SC_AC_GFBS_FAIL) {
- state = *(goto_table_mod_pointers[state & 0x00FFFFFF] + 1);
-
- /* get the goto state transition */
- no_of_entries = *(goto_table_mod_pointers[state & 0x00FFFFFF]);
- if (no_of_entries == 0) {
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- if (no_of_entries == 1) {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x00FFFFFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (buf_local == ascii_codes[0])
- temp_state = ((uint32_t *)(ascii_codes + ((no_of_entries + 3) & 0xFFC)))[0];
- else
- temp_state = SC_AC_GFBS_FAIL;
- } else {
- ascii_codes = (uint8_t *)(goto_table_mod_pointers[state & 0x00FFFFFF] + 2);
- buf_local = u8_tolower(buf[i]);
- if (state == 0) {
- temp_state = ((uint32_t *)ascii_codes)[buf_local];
- } else {
- int low = 0;
- int high = no_of_entries;
- int mid;
- temp_state = SC_AC_GFBS_FAIL;
- while (low <= high) {
- mid = (low + high) / 2;
- if (ascii_codes[mid] == buf_local) {
- temp_state = ((uint32_t *)(ascii_codes + ((no_of_entries + 3) & 0xFFC)))[mid];
- break;
- } else if (ascii_codes[mid] < buf_local) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- }
- } /* else - if (no_of_entries[0] == 1) */
- } /* else - if (no_of_entries[0] == 0) */
- } /* while (temp_state == SC_AC_GFBS_FAIL) */
- state = temp_state;
-
- }
-
- if (state & 0x01000000) {
- uint32_t no_of_pid_entries = ctx->output_table[state & 0x00FFFFFF].no_of_entries;
- uint32_t *pids = ctx->output_table[state & 0x00FFFFFF].pids;
- uint32_t k = 0;
- for (k = 0; k < no_of_pid_entries; k++) {
- if (pids[k] & 0xFFFF0000) {
- uint32_t lower_pid = pids[k] & 0x0000FFFF;
- if (SCMemcmp(pid_pat_list[lower_pid].cs,
- buf + i - pid_pat_list[lower_pid].patlen + 1,
- pid_pat_list[lower_pid].patlen) != 0) {
- /* inside loop */
- continue;
- }
-
- if (bitarray[(lower_pid) / 8] & (1 << ((lower_pid) % 8))) {
- ;
- } else {
- bitarray[(lower_pid) / 8] |= (1 << ((lower_pid) % 8));
- pmq->pattern_id_bitarray[(lower_pid) / 8] |= (1 << ((lower_pid) % 8));
-
- MpmAddPid(pmq, lower_pid);
- MpmAddSids(pmq, pid_pat_list[lower_pid].sids, pid_pat_list[lower_pid].sids_size);
- }
- matches++;
- } else {
- if (bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
- ;
- } else {
- bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
- pmq->pattern_id_bitarray[pids[k] / 8] |= (1 << (pids[k] % 8));
-
- MpmAddPid(pmq, pids[k]);
- MpmAddSids(pmq, pid_pat_list[pids[k]].sids, pid_pat_list[pids[k]].sids_size);
- }
- matches++;
- }
- //loop1:
- //;
- }
- } /* if (ctx->output_table[state].no_of_entries != 0) */
- } /* for (i = 0; i < buflen; i++) */
- }
-
- return matches;
-}
-
-/**
- * \brief Add a case insensitive pattern. Although we have different calls for
- * adding case sensitive and insensitive patterns, we make a single call
- * for either case. No special treatment for either case.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param pat The pattern to add.
- * \param patnen The pattern length.
- * \param offset Ignored.
- * \param depth Ignored.
- * \param pid The pattern id.
- * \param sid Ignored.
- * \param flags Flags associated with this pattern.
- *
- * \retval 0 On success.
- * \retval -1 On failure.
- */
-int SCACGfbsAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid,
- SigIntId sid, uint8_t flags)
-{
- flags |= MPM_PATTERN_FLAG_NOCASE;
- return SCACGfbsAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-/**
- * \brief Add a case sensitive pattern. Although we have different calls for
- * adding case sensitive and insensitive patterns, we make a single call
- * for either case. No special treatment for either case.
- *
- * \param mpm_ctx Pointer to the mpm context.
- * \param pat The pattern to add.
- * \param patnen The pattern length.
- * \param offset Ignored.
- * \param depth Ignored.
- * \param pid The pattern id.
- * \param sid Ignored.
- * \param flags Flags associated with this pattern.
- *
- * \retval 0 On success.
- * \retval -1 On failure.
- */
-int SCACGfbsAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid,
- SigIntId sid, uint8_t flags)
-{
- return SCACGfbsAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-void SCACGfbsPrintSearchStats(MpmThreadCtx *mpm_thread_ctx)
-{
-
-#ifdef SC_AC_COUNTERS
- SCACGfbsThreadCtx *ctx = (SCACGfbsThreadCtx *)mpm_thread_ctx->ctx;
- printf("AC Thread Search stats (ctx %p)\n", ctx);
- printf("Total calls: %" PRIu32 "\n", ctx->total_calls);
- printf("Total matches: %" PRIu64 "\n", ctx->total_matches);
-#endif /* SC_AC_COUNTERS */
-
- return;
-}
-
-void SCACGfbsPrintInfo(MpmCtx *mpm_ctx)
-{
- SCACGfbsCtx *ctx = (SCACGfbsCtx *)mpm_ctx->ctx;
-
- printf("MPM AC Information:\n");
- printf("Memory allocs: %" PRIu32 "\n", mpm_ctx->memory_cnt);
- printf("Memory alloced: %" PRIu32 "\n", mpm_ctx->memory_size);
- printf(" Sizeof:\n");
- printf(" MpmCtx %" PRIuMAX "\n", (uintmax_t)sizeof(MpmCtx));
- printf(" SCACGfbsCtx: %" PRIuMAX "\n", (uintmax_t)sizeof(SCACGfbsCtx));
- printf(" SCACGfbsPattern %" PRIuMAX "\n", (uintmax_t)sizeof(SCACGfbsPattern));
- printf(" SCACGfbsPattern %" PRIuMAX "\n", (uintmax_t)sizeof(SCACGfbsPattern));
- printf("Unique Patterns: %" PRIu32 "\n", mpm_ctx->pattern_cnt);
- printf("Smallest: %" PRIu32 "\n", mpm_ctx->minlen);
- printf("Largest: %" PRIu32 "\n", mpm_ctx->maxlen);
- printf("Total states in the state table: %" PRIu32 "\n", ctx->state_count);
- printf("\n");
-
- return;
-}
-
-/*************************************Unittests********************************/
-
-#ifdef UNITTESTS
-
-static int SCACGfbsTest01(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghjiklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest02(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abce", 4, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghjiklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest03(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0, 0);
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghj", 4, 0, 0, 2, 0, 0);
- PmqSetup(&pmq, 3);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghjiklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest04(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcdegh", 6, 0, 0, 1, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghjxyz", 7, 0, 0, 2, 0, 0);
- PmqSetup(&pmq, 3);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghjiklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest05(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"fghJikl", 7, 0, 0, 2, 0, 0);
- PmqSetup(&pmq, 3);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghjiklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest06(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcd";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest07(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0);
- /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0);
- /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0);
- /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0);
- /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0);
- /* 1 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- 30, 0, 0, 5, 0, 0);
- /* total matches: 135 */
- PmqSetup(&pmq, 6);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest08(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)"a", 1);
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest09(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"ab", 2, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)"ab", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest10(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefgh", 8, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "01234567890123456789012345678901234567890123456789"
- "01234567890123456789012345678901234567890123456789"
- "abcdefgh"
- "01234567890123456789012345678901234567890123456789"
- "01234567890123456789012345678901234567890123456789";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest11(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- if (MpmAddPatternCS(&mpm_ctx, (uint8_t *)"he", 2, 0, 0, 1, 0, 0) == -1)
- goto end;
- if (MpmAddPatternCS(&mpm_ctx, (uint8_t *)"she", 3, 0, 0, 2, 0, 0) == -1)
- goto end;
- if (MpmAddPatternCS(&mpm_ctx, (uint8_t *)"his", 3, 0, 0, 3, 0, 0) == -1)
- goto end;
- if (MpmAddPatternCS(&mpm_ctx, (uint8_t *)"hers", 4, 0, 0, 4, 0, 0) == -1)
- goto end;
- PmqSetup(&pmq, 4);
-
- if (SCACGfbsPreparePatterns(&mpm_ctx) == -1)
- goto end;
-
- result = 1;
-
- char *buf = "he";
- result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
- strlen(buf)) == 1);
- buf = "she";
- result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
- strlen(buf)) == 2);
- buf = "his";
- result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
- strlen(buf)) == 1);
- buf = "hers";
- result &= (SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq, (uint8_t *)buf,
- strlen(buf)) == 2);
-
- end:
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest12(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"wxyz", 4, 0, 0, 0, 0, 0);
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"vwxyz", 5, 0, 0, 1, 0, 0);
- PmqSetup(&pmq, 2);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest13(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcdefghijklmnopqrstuvwxyzABCD";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyzABCD";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest14(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcdefghijklmnopqrstuvwxyzABCDE";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyzABCDE";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest15(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcdefghijklmnopqrstuvwxyzABCDEF";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyzABCDEF";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest16(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcdefghijklmnopqrstuvwxyzABC";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyzABC";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest17(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcdefghijklmnopqrstuvwxyzAB";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyzAB";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest18(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- char *pat = "abcde""fghij""klmno""pqrst""uvwxy""z";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcde""fghij""klmno""pqrst""uvwxy""z";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest19(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 */
- char *pat = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest20(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 */
- char *pat = "AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA";
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)pat, strlen(pat), 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest21(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)"AA", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest22(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcde", 5, 0, 0, 1, 0, 0);
- PmqSetup(&pmq, 2);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "abcdefghijklmnopqrstuvwxyz";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest23(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)"aa", 2);
-
- if (cnt == 0)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest24(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 1 */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)"aa", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest25(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"fghiJkl", 7, 0, 0, 2, 0, 0);
- PmqSetup(&pmq, 3);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest26(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"Works", 5, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"Works", 5, 0, 0, 1, 0, 0);
- PmqSetup(&pmq, 2);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "works";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
- if (cnt == 1)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest27(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 0 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"ONE", 3, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "tone";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest28(void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmThreadCtx mpm_thread_ctx;
- PatternMatcherQueue pmq;
-
- memset(&mpm_ctx, 0, sizeof(MpmCtx));
- memset(&mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
- MpmInitCtx(&mpm_ctx, MPM_AC_GFBS);
- SCACGfbsInitThreadCtx(&mpm_ctx, &mpm_thread_ctx, 0);
-
- /* 0 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"one", 3, 0, 0, 0, 0, 0);
- PmqSetup(&pmq, 1);
-
- SCACGfbsPreparePatterns(&mpm_ctx);
-
- char *buf = "tONE";
- uint32_t cnt = SCACGfbsSearch(&mpm_ctx, &mpm_thread_ctx, &pmq,
- (uint8_t *)buf, strlen(buf));
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- SCACGfbsDestroyCtx(&mpm_ctx);
- SCACGfbsDestroyThreadCtx(&mpm_ctx, &mpm_thread_ctx);
- PmqFree(&pmq);
- return result;
-}
-
-static int SCACGfbsTest29(void)
-{
- uint8_t *buf = (uint8_t *)"onetwothreefourfivesixseveneightnine";
- uint16_t buflen = strlen((char *)buf);
- Packet *p = NULL;
- ThreadVars th_v;
- DetectEngineThreadCtx *det_ctx = NULL;
- int result = 0;
-
- memset(&th_v, 0, sizeof(th_v));
- p = UTHBuildPacket(buf, buflen, IPPROTO_TCP);
-
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- if (de_ctx == NULL)
- goto end;
- de_ctx->mpm_matcher = MPM_AC_GFBS;
-
- de_ctx->flags |= DE_QUIET;
-
- de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any "
- "(content:\"onetwothreefourfivesixseveneightnine\"; sid:1;)");
- if (de_ctx->sig_list == NULL)
- goto end;
- de_ctx->sig_list->next = SigInit(de_ctx, "alert tcp any any -> any any "
- "(content:\"onetwothreefourfivesixseveneightnine\"; fast_pattern:3,3; sid:2;)");
- if (de_ctx->sig_list->next == NULL)
- goto end;
-
- SigGroupBuild(de_ctx);
- DetectEngineThreadCtxInit(&th_v, (void *)de_ctx, (void *)&det_ctx);
-
- SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
- if (PacketAlertCheck(p, 1) != 1) {
- printf("if (PacketAlertCheck(p, 1) != 1) failure\n");
- goto end;
- }
- if (PacketAlertCheck(p, 2) != 1) {
- printf("if (PacketAlertCheck(p, 1) != 2) failure\n");
- goto end;
- }
-
- result = 1;
-end:
- if (de_ctx != NULL) {
- SigGroupCleanup(de_ctx);
- SigCleanSignatures(de_ctx);
-
- DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx);
- DetectEngineCtxFree(de_ctx);
- }
-
- UTHFreePackets(&p, 1);
- return result;
-}
-
-#endif /* UNITTESTS */
-
-void SCACGfbsRegisterTests(void)
-{
-
-#ifdef UNITTESTS
- UtRegisterTest("SCACGfbsTest01", SCACGfbsTest01, 1);
- UtRegisterTest("SCACGfbsTest02", SCACGfbsTest02, 1);
- UtRegisterTest("SCACGfbsTest03", SCACGfbsTest03, 1);
- UtRegisterTest("SCACGfbsTest04", SCACGfbsTest04, 1);
- UtRegisterTest("SCACGfbsTest05", SCACGfbsTest05, 1);
- UtRegisterTest("SCACGfbsTest06", SCACGfbsTest06, 1);
- UtRegisterTest("SCACGfbsTest07", SCACGfbsTest07, 1);
- UtRegisterTest("SCACGfbsTest08", SCACGfbsTest08, 1);
- UtRegisterTest("SCACGfbsTest09", SCACGfbsTest09, 1);
- UtRegisterTest("SCACGfbsTest10", SCACGfbsTest10, 1);
- UtRegisterTest("SCACGfbsTest11", SCACGfbsTest11, 1);
- UtRegisterTest("SCACGfbsTest12", SCACGfbsTest12, 1);
- UtRegisterTest("SCACGfbsTest13", SCACGfbsTest13, 1);
- UtRegisterTest("SCACGfbsTest14", SCACGfbsTest14, 1);
- UtRegisterTest("SCACGfbsTest15", SCACGfbsTest15, 1);
- UtRegisterTest("SCACGfbsTest16", SCACGfbsTest16, 1);
- UtRegisterTest("SCACGfbsTest17", SCACGfbsTest17, 1);
- UtRegisterTest("SCACGfbsTest18", SCACGfbsTest18, 1);
- UtRegisterTest("SCACGfbsTest19", SCACGfbsTest19, 1);
- UtRegisterTest("SCACGfbsTest20", SCACGfbsTest20, 1);
- UtRegisterTest("SCACGfbsTest21", SCACGfbsTest21, 1);
- UtRegisterTest("SCACGfbsTest22", SCACGfbsTest22, 1);
- UtRegisterTest("SCACGfbsTest23", SCACGfbsTest23, 1);
- UtRegisterTest("SCACGfbsTest24", SCACGfbsTest24, 1);
- UtRegisterTest("SCACGfbsTest25", SCACGfbsTest25, 1);
- UtRegisterTest("SCACGfbsTest26", SCACGfbsTest26, 1);
- UtRegisterTest("SCACGfbsTest27", SCACGfbsTest27, 1);
- UtRegisterTest("SCACGfbsTest28", SCACGfbsTest28, 1);
- UtRegisterTest("SCACGfbsTest29", SCACGfbsTest29, 1);
-#endif
-
- return;
-}
+++ /dev/null
-/* Copyright (C) 2007-2014 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Anoop Saldanha <anoopsaldanha@gmail.com>
- *
- */
-
-#define SC_AC_GFBS_STATE_TYPE_U16 uint16_t
-#define SC_AC_GFBS_STATE_TYPE_U32 uint32_t
-
-typedef struct SCACGfbsPattern_ {
- /* length of the pattern */
- uint16_t len;
- /* flags decribing the pattern */
- uint8_t flags;
- /* holds the original pattern that was added */
- uint8_t *original_pat;
- /* case sensitive */
- uint8_t *cs;
- /* case INsensitive */
- uint8_t *ci;
- /* pattern id */
- uint32_t id;
-
- /* sid(s) for this pattern */
- uint32_t sids_size;
- SigIntId *sids;
-
- struct SCACGfbsPattern_ *next;
-} SCACGfbsPattern;
-
-typedef struct SCACGfbsPatternList_ {
- uint8_t *cs;
- uint16_t patlen;
-
- /* sid(s) for this pattern */
- uint32_t sids_size;
- SigIntId *sids;
-} SCACGfbsPatternList;
-
-typedef struct SCACGfbsOutputTable_ {
- /* list of pattern sids */
- uint32_t *pids;
- /* no of entries we have in pids */
- uint32_t no_of_entries;
-} SCACGfbsOutputTable;
-
-typedef struct SCACGfbsGotoTableMod_ {
- /* each of these below declarations will be of type uint32_t, if the state
- * count exceeds 65535, the maximum value a 16 bit unsigned var can hold */
-
- /* no of entries stored below */
- uint16_t no_of_entries;
-
- /* the ascii codes over which we have state transitions */
- uint16_t *ascii_codes;
- /* the states that correspond to the ascii_codes above */
- uint16_t *states;
-} SCACGfbsGotoTableMod_;
-
-typedef struct SCACGfbsCtx_ {
- /* hash used during ctx initialization */
- SCACGfbsPattern **init_hash;
-
- /* pattern arrays. We need this only during the goto table creation phase */
- SCACGfbsPattern **parray;
-
- /* no of states used by ac */
- int32_t state_count;
- /* the modified goto_table */
- uint8_t *goto_table_mod;
- uint8_t **goto_table_mod_pointers;
-
- /* goto_table, failure table and output table. Needed to create state_table.
- * Will be freed, once we have created the goto_table_mod */
- int32_t (*goto_table)[256];
- int32_t *failure_table;
- SCACGfbsOutputTable *output_table;
- SCACGfbsPatternList *pid_pat_list;
-
- /* the size of each state */
- uint16_t single_state_size;
- uint32_t max_pat_id;
-} SCACGfbsCtx;
-
-typedef struct SCACGfbsThreadCtx_ {
- /* the total calls we make to the search function */
- uint32_t total_calls;
- /* the total patterns that we ended up matching against */
- uint64_t total_matches;
-} SCACGfbsThreadCtx;
-
-void MpmACGfbsRegister(void);
+++ /dev/null
-/* Copyright (C) 2007-2014 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- *
- * Implementation of the SBNDMq pattern matching algorithm.
- *
- * Ideas:
- * - B2g does a full match in the search of up to 'm' characters,
- * in case of a case insensitive search we could say it's match if
- * the pattern is of len 'm' or just compare the rest of the chars.
- *
- * \todo Try to get the S0 calculation right.
- */
-
-//#define PRINTMATCH
-
-#include "suricata-common.h"
-#include "suricata.h"
-#include "detect.h"
-#include "util-bloomfilter.h"
-#include "util-mpm-b2g.h"
-#include "util-print.h"
-
-#include "util-debug.h"
-#include "util-unittest.h"
-#include "util-memcmp.h"
-#include "util-memcpy.h"
-#include "conf.h"
-
-#define INIT_HASH_SIZE 65536
-
-#ifdef B2G_COUNTERS
-#define COUNT(counter) \
- (counter)
-#else
-#define COUNT(counter)
-#endif /* B2G_COUNTERS */
-
-static uint32_t b2g_hash_size = 0;
-static uint32_t b2g_bloom_size = 0;
-static uint8_t b2g_hash_shift = 0;
-static void *b2g_func;
-
-#define B2G_HASH16(a,b) (((a) << b2g_hash_shift) | (b))
-
-void B2gInitCtx (MpmCtx *);
-void B2gThreadInitCtx(MpmCtx *, MpmThreadCtx *, uint32_t);
-void B2gDestroyCtx(MpmCtx *);
-void B2gThreadDestroyCtx(MpmCtx *, MpmThreadCtx *);
-int B2gAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags);
-int B2gAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags);
-int B2gPreparePatterns(MpmCtx *mpm_ctx);
-uint32_t B2gSearchWrap(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t B2gSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-#ifdef B2G_SEARCH2
-uint32_t B2gSearch2(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-#endif
-uint32_t B2gSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t B2gSearchBNDMq(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen);
-void B2gPrintInfo(MpmCtx *mpm_ctx);
-void B2gPrintSearchStats(MpmThreadCtx *mpm_thread_ctx);
-void B2gRegisterTests(void);
-
-void MpmB2gRegister (void)
-{
- mpm_table[MPM_B2G].name = "b2g";
- mpm_table[MPM_B2G].max_pattern_length = B2G_WORD_SIZE;
-
- mpm_table[MPM_B2G].InitCtx = B2gInitCtx;
- mpm_table[MPM_B2G].InitThreadCtx = B2gThreadInitCtx;
- mpm_table[MPM_B2G].DestroyCtx = B2gDestroyCtx;
- mpm_table[MPM_B2G].DestroyThreadCtx = B2gThreadDestroyCtx;
- mpm_table[MPM_B2G].AddPattern = B2gAddPatternCS;
- mpm_table[MPM_B2G].AddPatternNocase = B2gAddPatternCI;
- mpm_table[MPM_B2G].Prepare = B2gPreparePatterns;
- mpm_table[MPM_B2G].Search = B2gSearchWrap;
- mpm_table[MPM_B2G].Cleanup = NULL;
- mpm_table[MPM_B2G].PrintCtx = B2gPrintInfo;
- mpm_table[MPM_B2G].PrintThreadCtx = B2gPrintSearchStats;
- mpm_table[MPM_B2G].RegisterUnittests = B2gRegisterTests;
-}
-
-#ifdef PRINTMATCH
-static void prt (uint8_t *buf, uint16_t buflen)
-{
- uint16_t i;
-
- for (i = 0; i < buflen; i++) {
- if (isprint(buf[i])) printf("%c", buf[i]);
- else printf("\\x%02X", buf[i]);
- }
- //printf("\n");
-}
-#endif
-
-void B2gPrintInfo(MpmCtx *mpm_ctx)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-
- printf("MPM B2g Information:\n");
- printf("Memory allocs: %" PRIu32 "\n", mpm_ctx->memory_cnt);
- printf("Memory alloced: %" PRIu32 "\n", mpm_ctx->memory_size);
- printf(" Sizeofs:\n");
- printf(" MpmCtx %" PRIuMAX "\n", (uintmax_t)sizeof(MpmCtx));
- printf(" B2gCtx: %" PRIuMAX "\n", (uintmax_t)sizeof(B2gCtx));
- printf(" B2gPattern %" PRIuMAX "\n", (uintmax_t)sizeof(B2gPattern));
- printf(" B2gPattern %" PRIuMAX "\n", (uintmax_t)sizeof(B2gPattern));
- printf("Unique Patterns: %" PRIu32 "\n", mpm_ctx->pattern_cnt);
- printf("Smallest: %" PRIu32 "\n", mpm_ctx->minlen);
- printf("Largest: %" PRIu32 "\n", mpm_ctx->maxlen);
- printf("Hash size: %" PRIu32 "\n", ctx->hash_size);
- printf("\n");
-}
-
-/**
- * \brief B2gAllocPattern allocates a new pattern structure
- * and initialize the data
- * \initonly
- */
-static inline B2gPattern *B2gAllocPattern(MpmCtx *mpm_ctx)
-{
- B2gPattern *p = SCMalloc(sizeof(B2gPattern));
- if (unlikely(p == NULL))
- return NULL;
- memset(p,0,sizeof(B2gPattern));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B2gPattern);
- return p;
-}
-
-static inline B2gPattern *
-B2gAllocHashItem(MpmCtx *mpm_ctx)
-{
- B2gPattern *hi = SCMalloc(sizeof(B2gPattern));
- if (unlikely(hi == NULL))
- return NULL;
- memset(hi,0,sizeof(B2gPattern));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B2gPattern);
- return hi;
-}
-
-static void B2gHashFree(MpmCtx *mpm_ctx, B2gPattern *hi)
-{
- if (hi == NULL)
- return;
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B2gPattern);
- B2gPattern *t = hi->next;
- SCFree(hi);
-
- B2gHashFree(mpm_ctx, t);
-}
-
-/*
- * INIT HASH START
- */
-static inline uint32_t B2gInitHash(B2gPattern *p)
-{
- uint32_t hash = p->len * p->original_pat[0];
- if (p->len > 1)
- hash += p->original_pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline uint32_t B2gInitHashRaw(uint8_t *pat, uint16_t patlen)
-{
- uint32_t hash = patlen * pat[0];
- if (patlen > 1)
- hash += pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline int B2gInitHashAdd(B2gCtx *ctx, B2gPattern *p)
-{
- uint32_t hash = B2gInitHash(p);
-
- //printf("B2gInitHashAdd: %" PRIu32 "\n", hash);
-
- if (ctx->init_hash[hash] == NULL) {
- ctx->init_hash[hash] = p;
- //printf("B2gInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
- return 0;
- }
-
- B2gPattern *tt = NULL;
- B2gPattern *t = ctx->init_hash[hash];
-
- /* get the list tail */
- do {
- tt = t;
- t = t->next;
- } while (t != NULL);
-
- tt->next = p;
-
- //printf("B2gInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
- return 0;
-}
-
-static inline int B2gCmpPattern(B2gPattern *p, uint8_t *pat, uint16_t patlen, char flags);
-
-static inline B2gPattern *B2gInitHashLookup(B2gCtx *ctx, uint8_t *pat, uint16_t patlen, char flags,
- uint32_t pid)
-{
- uint32_t hash = B2gInitHashRaw(pat,patlen);
-
- //printf("B2gInitHashLookup: %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
-
- if (ctx->init_hash[hash] == NULL) {
- return NULL;
- }
-
- B2gPattern *t = ctx->init_hash[hash];
- for ( ; t != NULL; t = t->next) {
- //if (B2gCmpPattern(t,pat,patlen,flags) == 1)
- if (t->id == pid)
- return t;
- }
-
- return NULL;
-}
-
-static inline int B2gCmpPattern(B2gPattern *p, uint8_t *pat, uint16_t patlen, char flags)
-{
- if (p->len != patlen)
- return 0;
-
- if (p->flags != flags)
- return 0;
-
- if (SCMemcmp(p->cs, pat, patlen) != 0)
- return 0;
-
- return 1;
-}
-
-/*
- * INIT HASH END
- */
-
-void B2gFreePattern(MpmCtx *mpm_ctx, B2gPattern *p)
-{
- if (p && p->cs && p->cs != p->ci) {
- SCFree(p->cs);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->ci) {
- SCFree(p->ci);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p != NULL && p->original_pat != NULL) {
- SCFree(p->original_pat);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->sids) {
- SCFree(p->sids);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->sids_size * sizeof(SigIntId);
- }
-
- if (p) {
- SCFree(p);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B2gPattern);
- }
-}
-
-/** \internal
- * \brief add a pattern to the mpm/b2g context
- *
- * \param pat ptr to the pattern
- * \param patlen length of the pattern
- * \param pid pattern id
- * \param sid signature id (internal id)
- * \param flags pattern MPM_PATTERN_* flags
- *
- * \initonly
- */
-static int B2gAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-
- SCLogDebug("ctx %p len %"PRIu16" pid %" PRIu32, ctx, patlen, pid);
-
- if (patlen == 0)
- return 0;
-
- /* get a memory piece */
- B2gPattern *p = B2gInitHashLookup(ctx, pat, patlen, flags, pid);
- if (p == NULL) {
- SCLogDebug("allocing new pattern");
-
- p = B2gAllocPattern(mpm_ctx);
- if (p == NULL)
- goto error;
-
- p->len = patlen;
- p->flags = flags;
- p->id = pid;
-
- p->original_pat = SCMalloc(patlen);
- if (p->original_pat == NULL)
- goto error;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->original_pat, pat, patlen);
-
- /* setup the case insensitive part of the pattern */
- p->ci = SCMalloc(patlen);
- if (p->ci == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy_tolower(p->ci, pat, patlen);
-
- /* setup the case sensitive part of the pattern */
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- /* nocase means no difference between cs and ci */
- p->cs = p->ci;
- } else {
- if (SCMemcmp(p->ci,pat,p->len) == 0) {
- /* no diff between cs and ci: pat is lowercase */
- p->cs = p->ci;
- } else {
- p->cs = SCMalloc(patlen);
- if (p->cs == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->cs, pat, patlen);
- }
- }
-
- p->sids_size = 1;
- p->sids = SCMalloc(p->sids_size * sizeof(SigIntId));
- BUG_ON(p->sids == NULL);
- p->sids[0] = sid;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(SigIntId);
-
- //printf("B2gAddPattern: ci \""); prt(p->ci,p->len);
- //printf("\" cs \""); prt(p->cs,p->len);
- //printf("\"\n");
-
- /* put in the pattern hash */
- B2gInitHashAdd(ctx, p);
-
- if (mpm_ctx->pattern_cnt == 65535) {
- printf("Max search words reached\n");
- exit(1);
- }
- mpm_ctx->pattern_cnt++;
-
- if (mpm_ctx->maxlen < patlen) mpm_ctx->maxlen = patlen;
- if (mpm_ctx->minlen == 0) mpm_ctx->minlen = patlen;
- else if (mpm_ctx->minlen > patlen) mpm_ctx->minlen = patlen;
- } else {
- /* Multiple sids for the same pid, so keep an array of sids. */
-
- /* TODO figure out how we can be called multiple times for the
- * same CTX with the same sid */
- int found = 0;
- uint32_t x = 0;
- for (x = 0; x < p->sids_size; x++) {
- if (p->sids[x] == sid) {
- found = 1;
- break;
- }
- }
- if (!found) {
- SigIntId *sids = SCRealloc(p->sids, (sizeof(SigIntId) * (p->sids_size + 1)));
- BUG_ON(sids == NULL);
- p->sids = sids;
- p->sids[p->sids_size] = sid;
- p->sids_size++;
- mpm_ctx->memory_size += sizeof(SigIntId);
- }
- }
-
- return 0;
-
-error:
- B2gFreePattern(mpm_ctx, p);
- return -1;
-}
-
-int B2gAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- flags |= MPM_PATTERN_FLAG_NOCASE;
- return B2gAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-int B2gAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- return B2gAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-static inline uint32_t B2gBloomHash(void *data, uint16_t datalen, uint8_t iter, uint32_t hash_size)
-{
- uint8_t *d = (uint8_t *)data;
- uint16_t i;
- uint32_t hash = (uint32_t)u8_tolower(*d);
-
- for (i = 1; i < datalen; i++) {
- d++;
- hash += (u8_tolower(*d)) ^ i;
- }
- hash <<= (iter+1);
-
- hash %= hash_size;
- return hash;
-}
-
-static void B2gPrepareHash(MpmCtx *mpm_ctx)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- uint16_t i;
- uint16_t idx = 0;
- uint8_t idx8 = 0;
-
- ctx->hash = (B2gPattern **)SCMalloc(sizeof(B2gPattern *) * ctx->hash_size);
- if (ctx->hash == NULL)
- goto error;
- memset(ctx->hash, 0, sizeof(B2gPattern *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B2gPattern *) * ctx->hash_size);
-
-#ifdef B2G_SEARCH2
- ctx->hash2 = (B2gPattern **)SCMalloc(sizeof(B2gPattern *) * ctx->hash_size);
- if (ctx->hash2 == NULL)
- goto error;
- memset(ctx->hash2, 0, sizeof(B2gPattern *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B2gPattern *) * ctx->hash_size);
-#endif
-
- /* alloc the pminlen array */
- ctx->pminlen = (uint8_t *)SCMalloc(sizeof(uint8_t) * ctx->hash_size);
- if (ctx->pminlen == NULL)
- goto error;
- memset(ctx->pminlen, 0, sizeof(uint8_t) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(uint8_t) * ctx->hash_size);
-
- for (i = 0; i < mpm_ctx->pattern_cnt; i++)
- {
- if(ctx->parray[i]->len == 1) {
- idx8 = (uint8_t)ctx->parray[i]->ci[0];
- if (ctx->hash1[idx8].flags == 0) {
- ctx->hash1[idx8].flags |= MPM_PATTERN_ONE_BYTE;
-
- B2gPattern *hi = &ctx->hash1[idx8];
- hi->len = ctx->parray[i]->len;
- hi->flags |= ctx->parray[i]->flags;
- hi->id = ctx->parray[i]->id;
- hi->ci = ctx->parray[i]->ci;
- hi->cs = ctx->parray[i]->cs;
- hi->sids = ctx->parray[i]->sids;
- hi->sids_size = ctx->parray[i]->sids_size;
-
- } else {
- B2gPattern *hi = B2gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->flags |= MPM_PATTERN_ONE_BYTE;
-
- hi->len = ctx->parray[i]->len;
- hi->flags |= ctx->parray[i]->flags;
- hi->id = ctx->parray[i]->id;
- hi->ci = ctx->parray[i]->ci;
- hi->cs = ctx->parray[i]->cs;
- hi->sids = ctx->parray[i]->sids;
- hi->sids_size = ctx->parray[i]->sids_size;
-
- /* Append this HashItem to the list */
- B2gPattern *thi = &ctx->hash1[idx8];
- while (thi->next) thi = thi->next;
- thi->next = hi;
- }
- ctx->pat_1_cnt++;
-#ifdef B2G_SEARCH2
- } else if(ctx->parray[i]->len == 2) {
- idx = B2G_HASH16(ctx->parray[i]->ci[0],ctx->parray[i]->ci[1]);
- if (ctx->hash2[idx] == NULL) {
- B2gPattern *hi = B2gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= MPM_PATTERN_ONE_BYTE;
-
- ctx->hash2[idx] = hi;
- } else {
- B2gPattern *hi = B2gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= MPM_PATTERN_ONE_BYTE;
-
- /* Append this HashItem to the list */
- B2gPattern *thi = ctx->hash2[idx];
- while (thi->next) thi = thi->next;
- thi->next = hi;
- }
- ctx->pat_2_cnt++;
-#endif
- } else {
- idx = B2G_HASH16(ctx->parray[i]->ci[ctx->m - 2], ctx->parray[i]->ci[ctx->m - 1]);
- SCLogDebug("idx %" PRIu32 ", %c.%c", idx, ctx->parray[i]->ci[ctx->m - 2], ctx->parray[i]->ci[ctx->m - 1]);
-
- if (ctx->hash[idx] == NULL) {
- B2gPattern *hi = B2gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
-
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- hi->len = ctx->parray[i]->len;
- hi->flags |= ctx->parray[i]->flags;
- hi->id = ctx->parray[i]->id;
- hi->ci = ctx->parray[i]->ci;
- hi->cs = ctx->parray[i]->cs;
- hi->sids = ctx->parray[i]->sids;
- hi->sids_size = ctx->parray[i]->sids_size;
-
- ctx->hash[idx] = hi;
- } else {
- B2gPattern *hi = B2gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
-
- hi->flags |= MPM_PATTERN_ONE_BYTE;
-
- hi->len = ctx->parray[i]->len;
- hi->flags |= ctx->parray[i]->flags;
- hi->id = ctx->parray[i]->id;
- hi->ci = ctx->parray[i]->ci;
- hi->cs = ctx->parray[i]->cs;
- hi->sids = ctx->parray[i]->sids;
- hi->sids_size = ctx->parray[i]->sids_size;
-
- if (ctx->parray[i]->len < ctx->pminlen[idx])
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- /* Append this HashItem to the list */
- B2gPattern *thi = ctx->hash[idx];
- while (thi->next) thi = thi->next;
- thi->next = hi;
- }
- ctx->pat_x_cnt++;
- }
- }
-
- /* alloc the bloom array */
- ctx->bloom = (BloomFilter **)SCMalloc(sizeof(BloomFilter *) * ctx->hash_size);
- if (ctx->bloom == NULL)
- goto error;
- memset(ctx->bloom, 0, sizeof(BloomFilter *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(BloomFilter *) * ctx->hash_size);
-
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- B2gPattern *hi = ctx->hash[h];
- if (hi == NULL)
- continue;
-
- ctx->bloom[h] = BloomFilterInit(b2g_bloom_size, 2, B2gBloomHash);
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt += BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size += BloomFilterMemorySize(ctx->bloom[h]);
-
- if (ctx->pminlen[h] > 8)
- ctx->pminlen[h] = 8;
-
- B2gPattern *thi = hi;
- do {
- SCLogDebug("adding \"%c%c\" to the bloom", thi->ci[0], thi->ci[1]);
- BloomFilterAdd(ctx->bloom[h], thi->ci, ctx->pminlen[h]);
- thi = thi->next;
- } while (thi != NULL);
- }
-
- return;
-error:
- return;
-}
-
-int B2gBuildMatchArray(MpmCtx *mpm_ctx)
-{
- SCEnter();
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-
- ctx->B2G = SCMalloc(sizeof(B2G_TYPE) * ctx->hash_size);
- if (ctx->B2G == NULL)
- return -1;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B2G_TYPE) * ctx->hash_size);
-
- memset(ctx->B2G,0, b2g_hash_size * sizeof(B2G_TYPE));
-
- uint32_t j;
- uint32_t a;
-
- /* fill the match array */
- for (j = 0; j <= (ctx->m - B2G_Q); j++) {
- for (a = 0; a < mpm_ctx->pattern_cnt; a++) {
- if (ctx->parray[a]->len < ctx->m)
- continue;
-
- uint16_t h = B2G_HASH16(u8_tolower(ctx->parray[a]->ci[j]),u8_tolower(ctx->parray[a]->ci[j+1]));
- ctx->B2G[h] = ctx->B2G[h] | (1 << (ctx->m - j));
-
- SCLogDebug("h %"PRIu16", ctx->B2G[h] %"PRIu32"", h, ctx->B2G[h]);
- }
- }
-
- ctx->s0 = 1;
- SCReturnInt(0);
-}
-
-int B2gPreparePatterns(MpmCtx *mpm_ctx)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-
- /* alloc the pattern array */
- ctx->parray = (B2gPattern **)SCMalloc(mpm_ctx->pattern_cnt * sizeof(B2gPattern *));
- if (ctx->parray == NULL)
- goto error;
- memset(ctx->parray, 0, mpm_ctx->pattern_cnt * sizeof(B2gPattern *));
- //printf("mpm_ctx %p, parray %p\n", mpm_ctx,ctx->parray);
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (mpm_ctx->pattern_cnt * sizeof(B2gPattern *));
-
- /* populate it with the patterns in the hash */
- uint32_t i = 0, p = 0;
- for (i = 0; i < INIT_HASH_SIZE; i++) {
- B2gPattern *node = ctx->init_hash[i], *nnode = NULL;
- for ( ; node != NULL; ) {
- nnode = node->next;
- node->next = NULL;
-
- ctx->parray[p] = node;
-
- p++;
- node = nnode;
- }
- }
- /* we no longer need the hash, so free it's memory */
- SCFree(ctx->init_hash);
- ctx->init_hash = NULL;
-
- /* set 'm' to the smallest pattern size */
- ctx->m = mpm_ctx->minlen;
-
- /* make sure 'm' stays in bounds
- m can be max WORD_SIZE - 1 */
- if (ctx->m >= B2G_WORD_SIZE) {
- ctx->m = B2G_WORD_SIZE - 1;
- }
- if (ctx->m < 2) ctx->m = 2;
-
- ctx->hash_size = b2g_hash_size;
- B2gPrepareHash(mpm_ctx);
- B2gBuildMatchArray(mpm_ctx);
-
- SCLogDebug("ctx->pat_1_cnt %"PRIu16"", ctx->pat_1_cnt);
- if (ctx->pat_1_cnt) {
- ctx->Search = B2gSearch1;
-#ifdef B2G_SEARCH2
- ctx->Search = B2gSearch2;
- if (ctx->pat_2_cnt) {
- ctx->MBSearch2 = B2gSearch2;
- }
-#endif
- ctx->MBSearch = b2g_func;
-#ifdef B2G_SEARCH2
- } else if (ctx->pat_2_cnt) {
- ctx->Search = B2gSearch2;
- ctx->MBSearch = b2g_func;
-#endif
- }
-
- return 0;
-error:
- return -1;
-}
-
-void B2gPrintSearchStats(MpmThreadCtx *mpm_thread_ctx)
-{
-#ifdef B2G_COUNTERS
- B2gThreadCtx *tctx = (B2gThreadCtx *)mpm_thread_ctx->ctx;
-
- printf("B2g Thread Search stats (tctx %p)\n", tctx);
- printf("Total calls: %" PRIu32 "\n", tctx->stat_calls);
- printf("Avg m/search: %0.2f\n", tctx->stat_calls ? (float)((float)tctx->stat_m_total / (float)tctx->stat_calls) : 0);
- printf("D != 0 (possible match): %" PRIu32 "\n", tctx->stat_d0);
- printf("Avg hash items per bucket %0.2f (%" PRIu32 ")\n", tctx->stat_d0 ? (float)((float)tctx->stat_d0_hashloop / (float)tctx->stat_d0) : 0, tctx->stat_d0_hashloop);
- printf("Loop match: %" PRIu32 "\n", tctx->stat_loop_match);
- printf("Loop no match: %" PRIu32 "\n", tctx->stat_loop_no_match);
- printf("Num shifts: %" PRIu32 "\n", tctx->stat_num_shift);
- printf("Total shifts: %" PRIu32 "\n", tctx->stat_total_shift);
- printf("Avg shifts: %0.2f\n", tctx->stat_num_shift ? (float)((float)tctx->stat_total_shift / (float)tctx->stat_num_shift) : 0);
- printf("Total BloomFilter checks: %" PRIu32 "\n", tctx->stat_bloom_calls);
- printf("BloomFilter hits: %0.4f%% (%" PRIu32 ")\n", tctx->stat_bloom_calls ? (float)((float)((float)tctx->stat_bloom_hits / (float)tctx->stat_bloom_calls)*(float)100) : 0, tctx->stat_bloom_hits);
- printf("Avg pminlen: %0.2f\n\n", tctx->stat_pminlen_calls ? (float)((float)tctx->stat_pminlen_total / (float)tctx->stat_pminlen_calls) : 0);
-#endif /* B2G_COUNTERS */
-}
-
-/**
- * \brief Function to get the user defined values for b2g algorithm from the
- * config file 'suricata.yaml'
- */
-static void B2gGetConfig()
-{
- ConfNode *b2g_conf;
- const char *hash_val = NULL;
- const char *bloom_val = NULL;
- const char *algo = NULL;
-
- /* init defaults */
- b2g_hash_size = HASHSIZE_LOW;
- b2g_bloom_size = BLOOMSIZE_MEDIUM;
- b2g_hash_shift = B2G_HASHSHIFT_LOW;
- b2g_func = B2G_SEARCHFUNC;
-
- ConfNode *pm = ConfGetNode("pattern-matcher");
-
- if (pm != NULL) {
-
- TAILQ_FOREACH(b2g_conf, &pm->head, next) {
- if (strcmp(b2g_conf->val, "b2g") == 0) {
-
- algo = ConfNodeLookupChildValue
- (b2g_conf->head.tqh_first, "algo");
- hash_val = ConfNodeLookupChildValue
- (b2g_conf->head.tqh_first, "hash_size");
- bloom_val = ConfNodeLookupChildValue
- (b2g_conf->head.tqh_first, "bf_size");
-
- if (algo != NULL) {
- if (strcmp(algo, "B2gSearch") == 0) {
- b2g_func = B2gSearch;
- } else if (strcmp(algo, "B2gSearchBNDMq") == 0) {
- b2g_func = B2gSearchBNDMq;
- }
- }
-
- if (hash_val != NULL) {
- b2g_hash_size = MpmGetHashSize(hash_val);
- switch (b2g_hash_size) {
- case HASHSIZE_LOWEST:
- b2g_hash_shift = B2G_HASHSHIFT_LOWEST;
- break;
- case HASHSIZE_LOW:
- b2g_hash_shift = B2G_HASHSHIFT_LOW;
- break;
- case HASHSIZE_MEDIUM:
- b2g_hash_shift = B2G_HASHSHIFT_MEDIUM;
- break;
- case HASHSIZE_HIGH:
- b2g_hash_shift = B2G_HASHSHIFT_HIGH;
- break;
- case HASHSIZE_HIGHER:
- b2g_hash_shift = B2G_HASHSHIFT_HIGHER;
- break;
- case HASHSIZE_MAX:
- b2g_hash_shift = B2G_HASHSHIFT_MAX;
- break;
- }
- }
-
- if (bloom_val != NULL)
- b2g_bloom_size = MpmGetBloomSize(bloom_val);
-
- SCLogDebug("hash size is %"PRIu32" and bloom size is %"PRIu32"",
- b2g_hash_size, b2g_bloom_size);
- }
- }
- }
-}
-
-void B2gInitCtx (MpmCtx *mpm_ctx)
-{
- SCLogDebug("mpm_ctx %p, ctx %p", mpm_ctx, mpm_ctx->ctx);
-
- if (mpm_ctx->ctx != NULL)
- return;
-
- //BUG_ON(mpm_ctx->ctx != NULL);
-
- mpm_ctx->ctx = SCMalloc(sizeof(B2gCtx));
- if (mpm_ctx->ctx == NULL) {
- exit(EXIT_FAILURE);
- }
-
- memset(mpm_ctx->ctx, 0, sizeof(B2gCtx));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B2gCtx);
-
- /* initialize the hash we use to speed up pattern insertions */
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- ctx->init_hash = SCMalloc(sizeof(B2gPattern *) * INIT_HASH_SIZE);
- if (ctx->init_hash == NULL) {
- exit(EXIT_FAILURE);
- }
-
- memset(ctx->init_hash, 0, sizeof(B2gPattern *) * INIT_HASH_SIZE);
-
- /* Initialize the defaults value from the config file. The given check make
- sure that we query config file only once for config values */
- if (b2g_hash_size == 0)
- B2gGetConfig();
-
- /* init defaults search functions */
- ctx->Search = b2g_func;
-
- SCReturn;
-}
-
-void B2gDestroyCtx(MpmCtx *mpm_ctx)
-{
- SCLogDebug("mpm_ctx %p", mpm_ctx);
-
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- if (ctx == NULL)
- return;
-
- if (ctx->init_hash) {
- SCFree(ctx->init_hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (INIT_HASH_SIZE * sizeof(B2gPattern *));
- }
-
- if (ctx->parray) {
- uint32_t i;
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (ctx->parray[i] != NULL) {
- B2gFreePattern(mpm_ctx, ctx->parray[i]);
- }
- }
-
- SCFree(ctx->parray);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(B2gPattern));
- }
-
- if (ctx->B2G) {
- SCFree(ctx->B2G);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(B2G_TYPE) * ctx->hash_size);
- }
-
- if (ctx->bloom) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt -= BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size -= BloomFilterMemorySize(ctx->bloom[h]);
-
- BloomFilterFree(ctx->bloom[h]);
- }
-
- SCFree(ctx->bloom);
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(BloomFilter *) * ctx->hash_size);
- }
-
- if (ctx->hash) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->hash[h] == NULL)
- continue;
-
- B2gHashFree(mpm_ctx, ctx->hash[h]);
- }
-
- SCFree(ctx->hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(B2gPattern) * ctx->hash_size);
- }
-
- if (ctx->pminlen) {
- SCFree(ctx->pminlen);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(uint8_t) * ctx->hash_size);
- }
-
- SCFree(mpm_ctx->ctx);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B2gCtx);
-}
-
-void B2gThreadInitCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint32_t matchsize)
-{
- memset(mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
-
- if (sizeof(B2gThreadCtx) > 0) { /* size can be null when optimized */
- mpm_thread_ctx->ctx = SCMalloc(sizeof(B2gThreadCtx));
- if (mpm_thread_ctx->ctx == NULL) {
- exit(EXIT_FAILURE);
- }
-
- memset(mpm_thread_ctx->ctx, 0, sizeof(B2gThreadCtx));
-
- mpm_thread_ctx->memory_cnt++;
- mpm_thread_ctx->memory_size += sizeof(B2gThreadCtx);
- }
-}
-
-void B2gThreadDestroyCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx)
-{
- B2gThreadCtx *ctx = (B2gThreadCtx *)mpm_thread_ctx->ctx;
-
- B2gPrintSearchStats(mpm_thread_ctx);
-
- if (ctx != NULL) { /* can be NULL if B2gThreadCtx is optimized to 0 */
- mpm_thread_ctx->memory_cnt--;
- mpm_thread_ctx->memory_size -= sizeof(B2gThreadCtx);
- SCFree(mpm_thread_ctx->ctx);
- }
-}
-
-uint32_t B2gSearchWrap(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- return ctx ? ctx->Search(mpm_ctx, mpm_thread_ctx, pmq, buf, buflen) : 0;
-}
-
-uint32_t B2gSearchBNDMq(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-#ifdef B2G_COUNTERS
- B2gThreadCtx *tctx = (B2gThreadCtx *)mpm_thread_ctx->ctx;
-#endif
- uint32_t pos = ctx->m - B2G_Q + 1, matches = 0;
- B2G_TYPE d;
-
- //printf("\n");
- //PrintRawDataFp(stdout, buf, buflen);
-
- SCLogDebug("buflen %"PRIu16", ctx->m %"PRIu32", pos %"PRIu32"", buflen,
- ctx->m, pos);
-
- COUNT(tctx->stat_calls++);
- COUNT(tctx->stat_m_total+=ctx->m);
-
- if (buflen < ctx->m)
- return 0;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (pos <= (uint32_t)(buflen - B2G_Q + 1)) {
- uint16_t h = B2G_HASH16(u8_tolower(buf[pos - 1]),u8_tolower(buf[pos]));
- d = ctx->B2G[h];
-
- if (d != 0) {
- COUNT(tctx->stat_d0++);
- uint32_t j = pos;
- uint32_t first = pos - (ctx->m - B2G_Q + 1);
-
- do {
- j = j - 1;
-
- if (d >= (uint32_t)(1 << (ctx->m - 1))) {
- if (j > first) pos = j;
- else {
- /* get our patterns from the hash */
- h = B2G_HASH16(u8_tolower(buf[j + ctx->m - 2]),u8_tolower(buf[j + ctx->m - 1]));
-
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((buflen - j) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf+j, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
-
- SCLogDebug("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "",
- ctx->bloom[h], buflen, pos, ctx->pminlen[h]);
- goto skip_loop;
- }
- }
- }
-
- B2gPattern *hi = ctx->hash[h], *thi;
- for (thi = hi; thi != NULL; thi = thi->next) {
- COUNT(tctx->stat_d0_hashloop++);
- if ((buflen - j) < thi->len) {
- continue;
- }
-
- if (thi->flags & MPM_PATTERN_FLAG_NOCASE) {
-
- //if (memcmp_lowercase(thi->ci, buf+j, thi->len) == 0) {
- if (SCMemcmpLowercase(thi->ci, buf+j, thi->len) == 0) {
-#ifdef PRINTMATCH
- printf("CI Exact match: "); prt(p->ci, p->len); printf("\n");
-#endif
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id,
- bitarray, thi->sids, thi->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (SCMemcmp(thi->cs, buf+j, thi->len) == 0) {
- //if (memcmp(thi->cs, buf+j, thi->len) == 0) {
-#ifdef PRINTMATCH
- printf("CS Exact match: "); prt(p->cs, p->len); printf("\n");
-#endif
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id,
- bitarray, thi->sids, thi->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
-skip_loop:
- SCLogDebug("skipped");
- //SCLogDebug("output at pos %" PRIu32 ": ", j); prt(buf + (j), ctx->m); printf("\n");
- ;
- }
- }
-
- if (j == 0) {
- break;
- }
-
- h = B2G_HASH16(u8_tolower(buf[j - 1]),u8_tolower(buf[j]));
- d = (d << 1) & ctx->B2G[h];
- } while (d != 0);
- }
- COUNT(tctx->stat_num_shift++);
- COUNT(tctx->stat_total_shift += (ctx->m - B2G_Q + 1));
- pos = pos + ctx->m - B2G_Q + 1;
-
- SCLogDebug("pos %"PRIu32"", pos);
- }
-
- SCLogDebug("matches %"PRIu32"", matches);
- return matches;
-}
-
-uint32_t B2gSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
-#ifdef B2G_COUNTERS
- B2gThreadCtx *tctx = (B2gThreadCtx *)mpm_thread_ctx->ctx;
-#endif
- uint32_t pos = 0, matches = 0;
- B2G_TYPE d;
- uint32_t j;
-
- COUNT(tctx->stat_calls++);
- COUNT(tctx->stat_m_total+=ctx->m);
-
- if (buflen < ctx->m)
- return 0;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (pos <= (buflen - ctx->m)) {
- j = ctx->m - 1;
- d = ~0;
-
- do {
- uint16_t h = B2G_HASH16(u8_tolower(buf[pos + j - 1]),u8_tolower(buf[pos + j]));
- d = ((d << 1) & ctx->B2G[h]);
- j = j - 1;
- } while (d != 0 && j != 0);
-
- /* (partial) match, move on to verification */
- if (d != 0) {
- COUNT(tctx->stat_d0++);
- //printf("output at pos %" PRIu32 ": ", pos); prt(buf + pos, ctx->m); printf("\n");
-
- /* get our patterns from the hash */
- uint16_t h = B2G_HASH16(u8_tolower(buf[pos + ctx->m - 2]),u8_tolower(buf[pos + ctx->m - 1]));
-
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((buflen - pos) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf+pos, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
-
- //printf("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "\n", ctx->bloom[h], buflen, pos, ctx->pminlen[h]);
- goto skip_loop;
- }
- }
- }
-
- B2gPattern *hi = ctx->hash[h], *thi;
- for (thi = hi; thi != NULL; thi = thi->next) {
- COUNT(tctx->stat_d0_hashloop++);
- //B2gPattern *p = ctx->parray[thi->idx];
-
- if (buflen - pos < thi->len)
- continue;
-
- if (thi->flags & MPM_PATTERN_FLAG_NOCASE) {
-
- if (SCMemcmpLowercase(thi->ci, buf+pos, thi->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id,
- bitarray, thi->sids, thi->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (SCMemcmp(thi->cs, buf+pos, thi->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id,
- bitarray, thi->sids, thi->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
-skip_loop:
- //pos = pos + ctx->s0;
- pos = pos + 1;
- } else {
- COUNT(tctx->stat_num_shift++);
- COUNT(tctx->stat_total_shift += (j + 1));
-
- pos = pos + j + 1;
- }
- }
-
- //printf("Total matches %" PRIu32 "\n", matches);
- return matches;
-}
-
-#ifdef B2G_SEARCH2
-uint32_t B2gSearch2(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
- B2gPattern *p;
- B2gPattern *thi, *hi;
-
- if (buflen < 2)
- return 0;
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- uint8_t h8 = u8_tolower(*buf);
- hi = &ctx->hash1[h8];
-
- if (hi->flags & MPM_PATTERN_ONE_BYTE) {
- for (thi = hi; thi != NULL; thi = thi->next) {
- p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (h8 == p->ci[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id,
- bitarray, thi->sids, thi->sids_size);
- }
- } else {
- if (*buf == p->cs[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id,
- bitarray, thi->sids, thi->sids_size);
- }
- }
- }
- }
-
- /* save one conversion by reusing h8 */
- uint16_t h16 = B2G_HASH16(h8, u8_tolower(*(buf+1)));
- hi = ctx->hash2[h16];
-
- for (thi = hi; thi != NULL; thi = thi->next) {
- p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (h8 == p->ci[0] && u8_tolower(*(buf+1)) == p->ci[1]) {
- //printf("CI Exact match: "); prt(p->ci, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B2gSearch1)\n");
-// for (em = p->em; em; em = em->next) {
- if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size))
- cnt++;
-// }
- }
- } else {
- if (*buf == p->cs[0] && *(buf+1) == p->cs[1]) {
- //printf("CS Exact match: "); prt(p->cs, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B2gSearch1)\n");
-// for (em = p->em; em; em = em->next) {
- if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size))
- cnt++;
-// }
- }
- }
- }
- buf += 1;
- }
-
- //printf("B2gSearch2: after 2byte cnt %" PRIu32 "\n", cnt);
- if (ctx->pat_x_cnt > 0) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- //printf("B2gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt);
- }
- return cnt;
-}
-#endif
-
-uint32_t B2gSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- SCEnter();
-
- B2gCtx *ctx = (B2gCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
-// B2gPattern *p;
- B2gPattern *thi, *hi;
-
- if (buflen == 0)
- SCReturnUInt(0);
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- uint8_t h = u8_tolower(*buf);
- hi = &ctx->hash1[h];
-
- for (thi = hi; thi != NULL; thi = thi->next) {
- if (hi->flags & MPM_PATTERN_ONE_BYTE) {
- if (thi->len != 1)
- continue;
-
- if (thi->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (u8_tolower(*buf) == thi->ci[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id, bitarray, thi->sids, thi->sids_size);
- }
- } else {
- if (*buf == thi->cs[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, thi->id, bitarray, thi->sids, thi->sids_size);
- }
- }
- }
- }
- buf += 1;
- }
-
- //printf("B2gSearch1: after 1byte cnt %" PRIu32 "\n", cnt);
-#ifdef B2G_SEARCH2
- if (ctx->pat_2_cnt) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch2(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- //printf("B2gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt);
- } else
-#endif
- if (ctx->pat_x_cnt) {
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- }
- SCReturnUInt(cnt);
-}
-
-/*
- * TESTS
- */
-
-#ifdef UNITTESTS
-static int B2gTestInit01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->m == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 " ", ctx->m);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-#if 0
-static int B2gTestS0Init01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 " ", ctx->s0);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestS0Init02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"cdef", 4, 0, 0, 1, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ", ctx->s0);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestS0Init03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", ctx->s0);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestS0Init04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abab", 4, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ", ctx->s0);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestS0Init05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcab", 5, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ", ctx->s0);
-
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-#endif
-
-static int B2gTestSearch01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abce", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghj", 4, 0, 0, 2, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-/* test patterns longer than 'm'. M is 4 here. */
-static int B2gTestSearch04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcdegh", 6, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghjxyz", 7, 0, 0, 2, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-/* case insensitive test patterns longer than 'm'. M is 4 here. */
-static int B2gTestSearch05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"fghJikl", 7, 0, 0, 2, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch05a (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"fghJikl", 7, 0, 0, 2, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abCD", 4, 0, 0, 3, 0, 0); /* no match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"abcD", 4, 0, 0, 4, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"abCd", 4, 0, 0, 5, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 5)
- result = 1;
- else
- printf("5 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch06 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch07 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch08 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"a", 1);
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch09 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"ab", 2, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"ab", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch10 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefgh", 8, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- char *buf = "01234567890123456789012345678901234567890123456789"
- "01234567890123456789012345678901234567890123456789"
- "abcdefgh"
- "01234567890123456789012345678901234567890123456789"
- "01234567890123456789012345678901234567890123456789";
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)buf, strlen(buf));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch11 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcde", 5, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2 /* 2 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyz", 26);
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"wxyz", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"vwxyz", 5, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2 /* 2 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyz", 26);
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch13 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCD", 30, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCD", 30);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCDE", 31, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCDE", 31);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCDEF", 32, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABCDEF", 32);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABC", 29, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyzABC", 29);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch17 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefghijklmnopqrstuvwxyzAB", 28, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghijklmnopqrstuvwxyzAB", 28);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch18 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcde""fghij""klmno""pqrst""uvwxy""z", 26, 0, 0, 0, 0, 0); /* 1 match */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcde""fghij""klmno""pqrst""uvwxy""z", 26);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch19 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 0, 0, 0); /* 1 */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch20 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA", 32, 0, 0, 0, 0, 0); /* 1 */
- //MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 32, 0, 0, 0, 0, 0); /* 1 */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 patterns */);
-
- //uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 32);
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AAAAA""AA", 32);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B2gTestSearch21 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 0, 0, 0); /* 1 */
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AA", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- return result;
-}
-#endif /* UNITTESTS */
-
-#if 0
-static int B2gTestSearchXX (void)
-{
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B2G);
- B2gCtx *ctx = (B2gCtx *)mpm_ctx.ctx;
-
- FILE *fp = fopen("/usr/share/dict/words", "r");
- if (fp == NULL)
- exit(1);
-
- char *word;
- char line[128];
- int w = 0;
- int w_max = 4000;
-
- while((word = fgets(line, sizeof(line), fp)) != NULL) {
- word[strlen(word) - 1] = '\0';
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)word, strlen(word), 0, 0, (uint32_t)w, 0, 0);
-
- w++;
-
- if (w_max == w)
- break;
- }
-
- B2gPreparePatterns(&mpm_ctx);
- B2gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 patterns */);
-
- char *text = "Yes this is a text, it is not very long. But, it is still sufficient for testing our search! "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "flkflkjjoijda893ur9r89h98hf9shflj;adm.,amnd,mna,mndabdayyugeq9e8u0q90-euajd;lsaldakljdlkajdl"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "we're adding a lot more text lines etc."
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "dlajd01438798749023749792739479ye9q8eu3291739847983274987e928u928eu98u3298eu982u938383888888 "
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- "Bjdhfahflkahsf;phf[hfihasfkhsfkjhalhflkafljhfkhakhfkahfkahfkjhdkffkjhafkhafkjakjfhkjahf;aj;jh";
- uint32_t len = strlen(text) - 1;
-
- int i;
- uint32_t cnt;
- for (i = 0; i < 100; i++) {
- cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)text, len);
- }
-
- printf("cnt %u ", cnt);
-
- B2gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B2gDestroyCtx(&mpm_ctx);
- fclose(fp);
-
- return 1;
-}
-#endif
-
-void B2gRegisterTests(void)
-{
-#ifdef UNITTESTS
- UtRegisterTest("B2gTestInit01", B2gTestInit01, 1);
-/*
- UtRegisterTest("B2gTestS0Init01", B2gTestS0Init01, 1);
- UtRegisterTest("B2gTestS0Init02", B2gTestS0Init02, 1);
- UtRegisterTest("B2gTestS0Init03", B2gTestS0Init03, 1);
- UtRegisterTest("B2gTestS0Init04", B2gTestS0Init04, 1);
- UtRegisterTest("B2gTestS0Init05", B2gTestS0Init05, 1);
-*/
- UtRegisterTest("B2gTestSearch01", B2gTestSearch01, 1);
- UtRegisterTest("B2gTestSearch02", B2gTestSearch02, 1);
- UtRegisterTest("B2gTestSearch03", B2gTestSearch03, 1);
- UtRegisterTest("B2gTestSearch04", B2gTestSearch04, 1);
- UtRegisterTest("B2gTestSearch05", B2gTestSearch05, 1);
- UtRegisterTest("B2gTestSearch05a", B2gTestSearch05a, 1);
- UtRegisterTest("B2gTestSearch06", B2gTestSearch06, 1);
- UtRegisterTest("B2gTestSearch07", B2gTestSearch07, 1);
- UtRegisterTest("B2gTestSearch08", B2gTestSearch08, 1);
- UtRegisterTest("B2gTestSearch09", B2gTestSearch09, 1);
- UtRegisterTest("B2gTestSearch10", B2gTestSearch10, 1);
- UtRegisterTest("B2gTestSearch11", B2gTestSearch11, 1);
- UtRegisterTest("B2gTestSearch12", B2gTestSearch12, 1);
- UtRegisterTest("B2gTestSearch13", B2gTestSearch13, 1);
- UtRegisterTest("B2gTestSearch14", B2gTestSearch14, 1);
- UtRegisterTest("B2gTestSearch15", B2gTestSearch15, 1);
- UtRegisterTest("B2gTestSearch16", B2gTestSearch16, 1);
- UtRegisterTest("B2gTestSearch17", B2gTestSearch17, 1);
- UtRegisterTest("B2gTestSearch18", B2gTestSearch18, 1);
- UtRegisterTest("B2gTestSearch19", B2gTestSearch19, 1);
- UtRegisterTest("B2gTestSearch20", B2gTestSearch20, 1);
- UtRegisterTest("B2gTestSearch21", B2gTestSearch21, 1);
-// UtRegisterTest("B2gTestSearchXX", B2gTestSearchXX, 1);
-#endif /* UNITTESTS */
-}
-
+++ /dev/null
-/* Copyright (C) 2007-2010 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- */
-
-#ifndef __UTIL_MPM_B2G_H__
-#define __UTIL_MPM_B2G_H__
-
-#include "util-mpm.h"
-#include "util-bloomfilter.h"
-
-#define B2G_HASHSHIFT_MAX 8
-#define B2G_HASHSHIFT_HIGHER 7
-#define B2G_HASHSHIFT_HIGH 6
-#define B2G_HASHSHIFT_MEDIUM 5
-#define B2G_HASHSHIFT_LOW 4
-#define B2G_HASHSHIFT_LOWEST 3
-
-//#define B2G_TYPE uint64_t
-#define B2G_TYPE uint32_t
-//#define B2G_TYPE uint16_t
-//#define B2G_TYPE uint8_t
-//#define B2G_WORD_SIZE 64
-#define B2G_WORD_SIZE 32
-//#define B2G_WORD_SIZE 16
-//#define B2G_WORD_SIZE 8
-
-#define B2G_Q 2
-
-#define B2G_SEARCHFUNC B2gSearchBNDMq
-//#define B2G_SEARCHFUNC B2gSearch
-
-//#define B2G_SEARCH2
-//#define B2G_COUNTERS
-
-typedef struct B2gPattern_ {
- uint16_t len; /**< \todo we're limited to 32/64 byte lengths, uint8_t would be fine here */
- uint8_t flags;
- uint8_t pad0;
- uint32_t id;
- uint8_t *original_pat;
- uint8_t *ci; /* case INsensitive */
- uint8_t *cs; /* case sensitive */
-
- /* sid(s) for this pattern */
- uint32_t sids_size;
- SigIntId *sids;
-
- struct B2gPattern_ *next;
-} B2gPattern;
-
-typedef struct B2gCtx_ {
- B2G_TYPE *B2G;
- B2G_TYPE m;
- BloomFilter **bloom;
- uint8_t *pminlen; /* array containing the minimal length
- of the patters in a hash bucket. Used
- for the BloomFilter. */
- /* pattern arrays */
- B2gPattern **parray;
-
- uint16_t pat_1_cnt;
-#ifdef B2G_SEARCH2
- uint16_t pat_2_cnt;
-#endif
- uint16_t pat_x_cnt;
-
- uint32_t hash_size;
- B2gPattern **hash;
- B2gPattern hash1[256];
-#ifdef B2G_SEARCH2
- B2gHashItem **hash2;
-#endif
-
- /* hash used during ctx initialization */
- B2gPattern **init_hash;
-
- uint8_t s0;
-
- /* we store our own multi byte search func ptr here for B2gSearch1 */
- uint32_t (*Search)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
-
- /* we store our own multi byte search func ptr here for B2gSearch1 */
- uint32_t (*MBSearch2)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
- uint32_t (*MBSearch)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
-} B2gCtx;
-
-typedef struct B2gThreadCtx_ {
-#ifdef B2G_COUNTERS
- uint32_t stat_pminlen_calls;
- uint32_t stat_pminlen_total;
- uint32_t stat_bloom_calls;
- uint32_t stat_bloom_hits;
- uint32_t stat_calls;
- uint32_t stat_m_total;
- uint32_t stat_d0;
- uint32_t stat_d0_hashloop;
- uint32_t stat_loop_match;
- uint32_t stat_loop_no_match;
- uint32_t stat_num_shift;
- uint32_t stat_total_shift;
-#endif /* B2G_COUNTERS */
-} B2gThreadCtx;
-
-void MpmB2gRegister(void);
-
-
-#endif
-
+++ /dev/null
-/* Copyright (C) 2007-2010 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- *
- * 3 gram implementation of the (S)BNDMq pattern matching algorithm.
- *
- * Ideas:
- * - B3g does a full match in the search of up to 'm' characters,
- * in case of a case insensitive search we could say it's match if
- * the pattern is of len 'm' or just compare the rest of the chars.
- *
- * \todo Try to get the S0 calculation right.
- */
-
-#include "suricata-common.h"
-#include "suricata.h"
-#include "util-bloomfilter.h"
-#include "util-mpm-b3g.h"
-#include "util-unittest.h"
-#include "conf.h"
-#include "util-debug.h"
-#include "util-memcpy.h"
-
-#define INIT_HASH_SIZE 65536
-
-#ifdef B3G_COUNTERS
-#define COUNT(counter) \
- (counter)
-#else
-#define COUNT(counter)
-#endif /* B3G_COUNTERS */
-
-static uint32_t b3g_hash_size = 0;
-static uint32_t b3g_bloom_size = 0;
-static uint8_t b3g_hash_shift = 0;
-static uint8_t b3g_hash_shift2 = 0;
-static void *b3g_func;
-
-#define B3G_HASH(a,b,c) (((a) << b3g_hash_shift) | (b) << (b3g_hash_shift2) |(c))
-
-void B3gInitCtx (MpmCtx *);
-void B3gThreadInitCtx(MpmCtx *, MpmThreadCtx *, uint32_t);
-void B3gDestroyCtx(MpmCtx *);
-void B3gThreadDestroyCtx(MpmCtx *, MpmThreadCtx *);
-int B3gAddPatternCI(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, uint32_t, SigIntId, uint8_t);
-int B3gAddPatternCS(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, uint32_t, SigIntId, uint8_t);
-int B3gPreparePatterns(MpmCtx *);
-uint32_t B3gSearchWrap(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-uint32_t B3gSearch1(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-uint32_t B3gSearch2(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-uint32_t B3gSearch12(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-uint32_t B3gSearch(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-uint32_t B3gSearchBNDMq(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, uint8_t *, uint16_t);
-void B3gPrintInfo(MpmCtx *);
-void B3gPrintSearchStats(MpmThreadCtx *);
-void B3gRegisterTests(void);
-
-/** \todo XXX Unused??? */
-#if 0
-static void prt (uint8_t *buf, uint16_t buflen)
-{
- uint16_t i;
-
- for (i = 0; i < buflen; i++) {
- if (isprint(buf[i])) printf("%c", buf[i]);
- else printf("\\x%" PRIX32, buf[i]);
- }
- //printf("\n");
-}
-#endif
-
-void B3gPrintInfo(MpmCtx *mpm_ctx)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-
- printf("MPM B3g Information:\n");
- printf("Memory allocs: %" PRIu32 "\n", mpm_ctx->memory_cnt);
- printf("Memory alloced: %" PRIu32 "\n", mpm_ctx->memory_size);
- printf(" Sizeofs:\n");
- printf(" MpmCtx %" PRIuMAX "\n", (uintmax_t)sizeof(MpmCtx));
- printf(" B3gCtx: %" PRIuMAX "\n", (uintmax_t)sizeof(B3gCtx));
- printf(" B3gPattern %" PRIuMAX "\n", (uintmax_t)sizeof(B3gPattern));
- printf(" B3gHashItem %" PRIuMAX "\n", (uintmax_t)sizeof(B3gHashItem));
- printf("Unique Patterns: %" PRIu32 "\n", mpm_ctx->pattern_cnt);
- printf("Smallest: %" PRIu32 "\n", mpm_ctx->minlen);
- printf("Largest: %" PRIu32 "\n", mpm_ctx->maxlen);
- printf("Hash size: %" PRIu32 "\n", ctx->hash_size);
- printf("\n");
-}
-
-static inline B3gPattern *B3gAllocPattern(MpmCtx *mpm_ctx)
-{
- B3gPattern *p = SCMalloc(sizeof(B3gPattern));
- if (unlikely(p == NULL))
- return NULL;
- memset(p,0,sizeof(B3gPattern));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B3gPattern);
- return p;
-}
-
-static inline B3gHashItem *
-B3gAllocHashItem(MpmCtx *mpm_ctx)
-{
- B3gHashItem *hi = SCMalloc(sizeof(B3gHashItem));
- if (unlikely(hi == NULL))
- return NULL;
- memset(hi,0,sizeof(B3gHashItem));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B3gHashItem);
- return hi;
-}
-
-static void B3gHashFree(MpmCtx *mpm_ctx, B3gHashItem *hi)
-{
- if (hi == NULL)
- return;
-
- B3gHashItem *t = hi->nxt;
- B3gHashFree(mpm_ctx, t);
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B3gHashItem);
- SCFree(hi);
-}
-
-/*
- * INIT HASH START
- */
-static inline uint32_t B3gInitHash(B3gPattern *p)
-{
- uint32_t hash = p->len * p->cs[0];
- if (p->len > 1)
- hash += p->cs[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline uint32_t B3gInitHashRaw(uint8_t *pat, uint16_t patlen)
-{
- uint32_t hash = patlen * pat[0];
- if (patlen > 1)
- hash += pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline int B3gInitHashAdd(B3gCtx *ctx, B3gPattern *p)
-{
- uint32_t hash = B3gInitHash(p);
-
- //printf("B3gInitHashAdd: %" PRIu32 "\n", hash);
-
- if (ctx->init_hash[hash] == NULL) {
- ctx->init_hash[hash] = p;
- //printf("B3gInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
- return 0;
- }
-
- B3gPattern *tt = NULL;
- B3gPattern *t = ctx->init_hash[hash];
-
- /* get the list tail */
- do {
- tt = t;
- t = t->next;
- } while (t != NULL);
-
- tt->next = p;
- //printf("B3gInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
-
- return 0;
-}
-
-static inline int B3gCmpPattern(B3gPattern *p, uint8_t *pat, uint16_t patlen, char flags);
-
-static inline B3gPattern *B3gInitHashLookup(B3gCtx *ctx, uint8_t *pat, uint16_t patlen, char flags)
-{
- uint32_t hash = B3gInitHashRaw(pat,patlen);
-
- //printf("B3gInitHashLookup: %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
-
- if (ctx->init_hash[hash] == NULL) {
- return NULL;
- }
-
- B3gPattern *t = ctx->init_hash[hash];
- for ( ; t != NULL; t = t->next) {
- if (B3gCmpPattern(t,pat,patlen,flags) == 1)
- return t;
- }
-
- return NULL;
-}
-
-static inline int B3gCmpPattern(B3gPattern *p, uint8_t *pat, uint16_t patlen, char flags)
-{
- if (p->len != patlen)
- return 0;
-
- if (p->flags != flags)
- return 0;
-
- if (memcmp(p->cs, pat, patlen) != 0)
- return 0;
-
- return 1;
-}
-
-/*
- * INIT HASH END
- */
-
-void B3gFreePattern(MpmCtx *mpm_ctx, B3gPattern *p)
-{
- if (p && p->cs && p->cs != p->ci) {
- SCFree(p->cs);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->ci) {
- SCFree(p->ci);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->sids) {
- SCFree(p->sids);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->sids_size * sizeof(SigIntId);
- }
-
- if (p) {
- SCFree(p);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B3gPattern);
- }
-}
-
-/* B3gAddPattern
- *
- * pat: ptr to the pattern
- * patlen: length of the pattern
- * nocase: nocase flag: 1 enabled, 0 disable
- * pid: pattern id
- * sid: signature id (internal id)
- */
-static int B3gAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, uint32_t sid, uint8_t flags)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-
- if (patlen == 0)
- return 0;
-
- /* get a memory piece */
- B3gPattern *p = B3gInitHashLookup(ctx, pat, patlen, flags);
- if (p == NULL) {
- p = B3gAllocPattern(mpm_ctx);
- if (p == NULL)
- goto error;
-
- p->len = patlen;
- p->flags = flags;
- p->id = pid;
-
- /* setup the case insensitive part of the pattern */
- p->ci = SCMalloc(patlen);
- if (p->ci == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy_tolower(p->ci, pat, patlen);
-
- /* setup the case sensitive part of the pattern */
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- /* nocase means no difference between cs and ci */
- p->cs = p->ci;
- } else {
- if (memcmp(p->ci,pat,p->len) == 0) {
- /* no diff between cs and ci: pat is lowercase */
- p->cs = p->ci;
- } else {
- p->cs = SCMalloc(patlen);
- if (p->cs == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->cs, pat, patlen);
- }
- }
-
- //printf("B3gAddPattern: ci \""); prt(p->ci,p->len);
- //printf("\" cs \""); prt(p->cs,p->len);
- //printf("\" prefix_ci %" PRIu32 ", prefix_cs %" PRIu32 "\n", p->prefix_ci, p->prefix_cs);
-
- p->sids_size = 1;
- p->sids = SCMalloc(p->sids_size * sizeof(SigIntId));
- BUG_ON(p->sids == NULL);
- p->sids[0] = sid;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(SigIntId);
-
- /* put in the pattern hash */
- B3gInitHashAdd(ctx, p);
-
- if (mpm_ctx->pattern_cnt == 65535) {
- printf("Max search words reached\n");
- exit(1);
- }
- mpm_ctx->pattern_cnt++;
-
- if (mpm_ctx->maxlen < patlen) mpm_ctx->maxlen = patlen;
- if (mpm_ctx->minlen == 0) mpm_ctx->minlen = patlen;
- else if (mpm_ctx->minlen > patlen) mpm_ctx->minlen = patlen;
- } else {
- /* Multiple sids for the same pid, so keep an array of sids. */
-
- /* TODO figure out how we can be called multiple times for the
- * same CTX with the same sid */
- int found = 0;
- uint32_t x = 0;
- for (x = 0; x < p->sids_size; x++) {
- if (p->sids[x] == sid) {
- found = 1;
- break;
- }
- }
- if (!found) {
- SigIntId *sids = SCRealloc(p->sids, (sizeof(SigIntId) * (p->sids_size + 1)));
- BUG_ON(sids == NULL);
- p->sids = sids;
- p->sids[p->sids_size] = sid;
- p->sids_size++;
- mpm_ctx->memory_size += sizeof(SigIntId);
- }
- }
-
- return 0;
-
-error:
- B3gFreePattern(mpm_ctx, p);
- return -1;
-}
-
-int B3gAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- flags |= MPM_PATTERN_FLAG_NOCASE;
- return B3gAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-int B3gAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- return B3gAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-static uint32_t B3gBloomHash(void *data, uint16_t datalen, uint8_t iter, uint32_t hash_size)
-{
- uint8_t *d = (uint8_t *)data;
- uint16_t i;
- uint32_t hash = (uint32_t)u8_tolower(*d);
-
- for (i = 1; i < datalen; i++) {
- d++;
- hash += (u8_tolower(*d)) ^ i;
- }
- hash <<= (iter+1);
-
- hash %= hash_size;
- return hash;
-}
-
-static void B3gPrepareHash(MpmCtx *mpm_ctx)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- uint16_t i;
- uint16_t idx = 0;
- uint8_t idx8 = 0;
-
- ctx->hash = (B3gHashItem **)SCMalloc(sizeof(B3gHashItem *) * ctx->hash_size);
- if (ctx->hash == NULL)
- goto error;
- memset(ctx->hash, 0, sizeof(B3gHashItem *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B3gHashItem *) * ctx->hash_size);
-
- /* 2 byte pattern hash */
- ctx->hash2 = (B3gHashItem **)SCMalloc(sizeof(B3gHashItem *) * ctx->hash_size);
- if (ctx->hash2 == NULL)
- goto error;
- memset(ctx->hash2, 0, sizeof(B3gHashItem *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B3gHashItem *) * ctx->hash_size);
-
- /* alloc the pminlen array */
- ctx->pminlen = (uint8_t *)SCMalloc(sizeof(uint8_t) * ctx->hash_size);
- if (ctx->pminlen == NULL)
- goto error;
- memset(ctx->pminlen, 0, sizeof(uint8_t) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(uint8_t) * ctx->hash_size);
-
- for (i = 0; i < mpm_ctx->pattern_cnt; i++)
- {
- if(ctx->parray[i]->len == 1) {
- idx8 = (uint8_t)ctx->parray[i]->ci[0];
- if (ctx->hash1[idx8].flags == 0) {
- ctx->hash1[idx8].idx = i;
- ctx->hash1[idx8].flags |= 0x01;
- } else {
- B3gHashItem *hi = B3gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- /* Append this HashItem to the list */
- B3gHashItem *thi = &ctx->hash1[idx8];
- while (thi->nxt) thi = thi->nxt;
- thi->nxt = hi;
- }
- ctx->pat_1_cnt++;
- } else if(ctx->parray[i]->len == 2) {
- idx = (uint16_t)(ctx->parray[i]->ci[0] << b3g_hash_shift | ctx->parray[i]->ci[1]);
- if (ctx->hash2[idx] == NULL) {
- B3gHashItem *hi = B3gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- ctx->hash2[idx] = hi;
- } else {
- B3gHashItem *hi = B3gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- /* Append this HashItem to the list */
- B3gHashItem *thi = ctx->hash2[idx];
- while (thi->nxt) thi = thi->nxt;
- thi->nxt = hi;
- }
- ctx->pat_2_cnt++;
- } else {
- idx = B3G_HASH(ctx->parray[i]->ci[ctx->m - 3], ctx->parray[i]->ci[ctx->m - 2], ctx->parray[i]->ci[ctx->m - 1]);
- //printf("idx %" PRIu32 ", %c.%c.%c\n", idx, ctx->parray[i]->ci[ctx->m - 3], ctx->parray[i]->ci[ctx->m - 2], ctx->parray[i]->ci[ctx->m - 1]);
-
- if (ctx->hash[idx] == NULL) {
- B3gHashItem *hi = B3gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- ctx->hash[idx] = hi;
- } else {
- B3gHashItem *hi = B3gAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- if (ctx->parray[i]->len < ctx->pminlen[idx])
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- /* Append this HashItem to the list */
- B3gHashItem *thi = ctx->hash[idx];
- while (thi->nxt) thi = thi->nxt;
- thi->nxt = hi;
- }
- ctx->pat_x_cnt++;
- }
- }
-
- /* alloc the bloom array */
- ctx->bloom = (BloomFilter **)SCMalloc(sizeof(BloomFilter *) * ctx->hash_size);
- if (ctx->bloom == NULL)
- goto error;
- memset(ctx->bloom, 0, sizeof(BloomFilter *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(BloomFilter *) * ctx->hash_size);
-
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- B3gHashItem *hi = ctx->hash[h];
- if (hi == NULL)
- continue;
-
- ctx->bloom[h] = BloomFilterInit(b3g_bloom_size, 2, B3gBloomHash);
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt += BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size += BloomFilterMemorySize(ctx->bloom[h]);
-
- if (ctx->pminlen[h] > 8)
- ctx->pminlen[h] = 8;
-
- B3gHashItem *thi = hi;
- do {
- BloomFilterAdd(ctx->bloom[h], ctx->parray[thi->idx]->ci, ctx->pminlen[h]);
- thi = thi->nxt;
- } while (thi != NULL);
- }
-
- return;
-error:
- return;
-}
-
-int B3gBuildMatchArray(MpmCtx *mpm_ctx)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-
- ctx->B3G = SCMalloc(sizeof(B3G_TYPE) * ctx->hash_size);
- if (ctx->B3G == NULL)
- return -1;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(B3G_TYPE) * ctx->hash_size);
-
- memset(ctx->B3G,0, b3g_hash_size * sizeof(B3G_TYPE));
-
- uint32_t j;
- uint32_t a;
-
- /* fill the match array */
- for (j = 0; j <= (ctx->m - B3G_Q); j++) {
- for (a = 0; a < mpm_ctx->pattern_cnt; a++) {
- if (ctx->parray[a]->len < ctx->m)
- continue;
-
- uint16_t h = B3G_HASH(u8_tolower(ctx->parray[a]->ci[j]),u8_tolower(ctx->parray[a]->ci[j+1]), u8_tolower(ctx->parray[a]->ci[j+2]));
-//printf("B3gBuildMatchArray: h %" PRIu32 ", %c.%c.%c\n", h, u8_tolower(ctx->parray[a]->ci[j]),u8_tolower(ctx->parray[a]->ci[j+1]), u8_tolower(ctx->parray[a]->ci[j+2]));
- ctx->B3G[h] = ctx->B3G[h] | (1 << (ctx->m - j));
- }
- }
-
- ctx->s0 = 1;
- return 0;
-}
-
-int B3gPreparePatterns(MpmCtx *mpm_ctx)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-
- /* alloc the pattern array */
- ctx->parray = (B3gPattern **)SCMalloc(mpm_ctx->pattern_cnt * sizeof(B3gPattern *));
- if (ctx->parray == NULL)
- goto error;
- memset(ctx->parray, 0, mpm_ctx->pattern_cnt * sizeof(B3gPattern *));
- //printf("mpm_ctx %p, parray %p\n", mpm_ctx,ctx->parray);
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (mpm_ctx->pattern_cnt * sizeof(B3gPattern *));
-
- /* populate it with the patterns in the hash */
- uint32_t i = 0, p = 0;
- for (i = 0; i < INIT_HASH_SIZE; i++) {
- B3gPattern *node = ctx->init_hash[i], *nnode = NULL;
- for ( ; node != NULL; ) {
- nnode = node->next;
- node->next = NULL;
-
- ctx->parray[p] = node;
-
- p++;
- node = nnode;
- }
- }
- /* we no longer need the hash, so free it's memory */
- SCFree(ctx->init_hash);
- ctx->init_hash = NULL;
-
- /* set 'm' to the smallest pattern size */
- ctx->m = mpm_ctx->minlen;
-
- /* make sure 'm' stays in bounds
- m can be max WORD_SIZE - 1 */
- if (ctx->m >= B3G_WORD_SIZE) {
- ctx->m = B3G_WORD_SIZE - 1;
- }
- if (ctx->m < 3) ctx->m = 3;
-
-
- ctx->hash_size = b3g_hash_size;
- B3gPrepareHash(mpm_ctx);
- B3gBuildMatchArray(mpm_ctx);
-
- if (ctx->pat_1_cnt) {
- ctx->Search = B3gSearch1;
- if (ctx->pat_2_cnt) {
- ctx->Search = B3gSearch12;
- ctx->MBSearch = b3g_func;
- }
- ctx->MBSearch = b3g_func;
- } else if (ctx->pat_2_cnt) {
- ctx->Search = B3gSearch2;
- ctx->MBSearch = b3g_func;
- }
-
-
- return 0;
-error:
- return -1;
-}
-
-void B3gPrintSearchStats(MpmThreadCtx *mpm_thread_ctx)
-{
-#ifdef B3G_COUNTERS
- B3gThreadCtx *tctx = (B3gThreadCtx *)mpm_thread_ctx->ctx;
-
- printf("B3g Thread Search stats (tctx %p)\n", tctx);
- printf("Total calls: %" PRIu32 "\n", tctx->stat_calls);
- printf("Avg m/search: %0.2f\n", tctx->stat_calls ? (float)((float)tctx->stat_m_total / (float)tctx->stat_calls) : 0);
- printf("D != 0 (possible match): %" PRIu32 "\n", tctx->stat_d0);
- printf("Avg hash items per bucket %0.2f (%" PRIu32 ")\n", tctx->stat_d0 ? (float)((float)tctx->stat_d0_hashloop / (float)tctx->stat_d0) : 0, tctx->stat_d0_hashloop);
- printf("Loop match: %" PRIu32 "\n", tctx->stat_loop_match);
- printf("Loop no match: %" PRIu32 "\n", tctx->stat_loop_no_match);
- printf("Num shifts: %" PRIu32 "\n", tctx->stat_num_shift);
- printf("Total shifts: %" PRIu32 "\n", tctx->stat_total_shift);
- printf("Avg shifts: %0.2f\n", tctx->stat_num_shift ? (float)((float)tctx->stat_total_shift / (float)tctx->stat_num_shift) : 0);
- printf("Total BloomFilter checks: %" PRIu32 "\n", tctx->stat_bloom_calls);
- printf("BloomFilter hits: %0.4f%% (%" PRIu32 ")\n", tctx->stat_bloom_calls ? (float)((float)((float)tctx->stat_bloom_hits / (float)tctx->stat_bloom_calls)*(float)100) : 0, tctx->stat_bloom_hits);
- printf("Avg pminlen: %0.2f\n\n", tctx->stat_pminlen_calls ? (float)((float)tctx->stat_pminlen_total / (float)tctx->stat_pminlen_calls) : 0);
-#endif /* B3G_COUNTERS */
-}
-
-static inline int
-memcmp_lowercase(uint8_t *s1, uint8_t *s2, uint16_t n)
-{
- size_t i;
-
- /* check backwards because we already tested the first
- * 2 to 4 chars. This way we are more likely to detect
- * a miss and thus speed up a little... */
- for (i = n - 1; i; i--) {
- if (u8_tolower(*(s2+i)) != s1[i])
- return 1;
- }
-
- return 0;
-}
-
-/**
- * \brief Function to get the user defined values for b3g algorithm from the
- * config file 'suricata.yaml'
- */
-void B3gGetConfig()
-{
- ConfNode *b3g_conf;
- const char *hash_val = NULL;
- const char *bloom_val = NULL;
- const char *algo = NULL;
-
- /* init defaults */
- b3g_hash_size = HASHSIZE_LOW;
- b3g_bloom_size = BLOOMSIZE_MEDIUM;
- b3g_func = B3G_SEARCHFUNC;
-
- ConfNode *pm = ConfGetNode("pattern-matcher");
-
- if (pm != NULL) {
-
- TAILQ_FOREACH(b3g_conf, &pm->head, next) {
- if (strncmp(b3g_conf->val, "b3g", 3) == 0) {
- algo = ConfNodeLookupChildValue(b3g_conf->head.tqh_first,
- "algo");
- hash_val = ConfNodeLookupChildValue(b3g_conf->head.tqh_first,
- "hash_size");
- bloom_val = ConfNodeLookupChildValue(b3g_conf->head.tqh_first,
- "bf_size");
-
- if (algo != NULL) {
- if (strcmp(algo, "B3gSearch") == 0) {
- b3g_func = B3gSearch;
- } else if (strcmp(algo, "B3gSearchBNDMq") == 0) {
- b3g_func = B3gSearchBNDMq;
- }
- }
-
- if (hash_val != NULL) {
- b3g_hash_size = MpmGetHashSize(hash_val);
- switch (b3g_hash_size) {
- case HASHSIZE_LOWEST:
- b3g_hash_shift = B3G_HASHSHIFT_LOWEST;
- b3g_hash_shift2 = B3G_HASHSHIFT_LOWEST2;
- break;
- case HASHSIZE_LOW:
- b3g_hash_shift = B3G_HASHSHIFT_LOW;
- b3g_hash_shift2 = B3G_HASHSHIFT_LOW2;
- break;
- case HASHSIZE_MEDIUM:
- b3g_hash_shift = B3G_HASHSHIFT_MEDIUM;
- b3g_hash_shift2 = B3G_HASHSHIFT_MEDIUM2;
- break;
- case HASHSIZE_HIGH:
- b3g_hash_shift = B3G_HASHSHIFT_HIGH;
- b3g_hash_shift2 = B3G_HASHSHIFT_HIGH2;
- break;
- case HASHSIZE_HIGHER:
- b3g_hash_shift = B3G_HASHSHIFT_HIGHER;
- b3g_hash_shift2 = B3G_HASHSHIFT_HIGHER2;
- break;
- case HASHSIZE_MAX:
- b3g_hash_shift = B3G_HASHSHIFT_MAX;
- b3g_hash_shift2 = B3G_HASHSHIFT_MAX2;
- break;
- }
- }
-
- if (bloom_val != NULL)
- b3g_bloom_size = MpmGetBloomSize(bloom_val);
-
- SCLogDebug("hash size is %"PRIu32" and bloom size is %"PRIu32"",
- b3g_hash_size, b3g_bloom_size);
- }
- }
- }
-}
-
-void B3gInitCtx (MpmCtx *mpm_ctx)
-{
- //printf("B3gInitCtx: mpm_ctx %p\n", mpm_ctx);
-
- mpm_ctx->ctx = SCMalloc(sizeof(B3gCtx));
- if (mpm_ctx->ctx == NULL)
- return;
-
- memset(mpm_ctx->ctx, 0, sizeof(B3gCtx));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(B3gCtx);
-
- /* initialize the hash we use to speed up pattern insertions */
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- ctx->init_hash = SCMalloc(sizeof(B3gPattern *) * INIT_HASH_SIZE);
- if (ctx->init_hash == NULL)
- return;
-
- memset(ctx->init_hash, 0, sizeof(B3gPattern *) * INIT_HASH_SIZE);
-
- /* Initialize the defaults value from the config file. The given check make
- sure that we query config file only once for config values */
- if (b3g_hash_size == 0)
- B3gGetConfig();
-
- /* init default */
- ctx->Search = b3g_func;
-}
-
-void B3gDestroyCtx(MpmCtx *mpm_ctx)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- if (ctx == NULL)
- return;
-
- if (ctx->init_hash) {
- SCFree(ctx->init_hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (INIT_HASH_SIZE * sizeof(B3gPattern *));
- }
-
- if (ctx->parray) {
- uint32_t i;
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (ctx->parray[i] != NULL) {
- B3gFreePattern(mpm_ctx, ctx->parray[i]);
- }
- }
-
- SCFree(ctx->parray);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(B3gPattern));
- }
-
- if (ctx->B3G) {
- SCFree(ctx->B3G);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(B3G_TYPE) * ctx->hash_size);
- }
-
- if (ctx->bloom) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt -= BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size -= BloomFilterMemorySize(ctx->bloom[h]);
-
- BloomFilterFree(ctx->bloom[h]);
- }
-
- SCFree(ctx->bloom);
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(BloomFilter *) * ctx->hash_size);
- }
-
- if (ctx->hash) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->hash[h] == NULL)
- continue;
-
- B3gHashFree(mpm_ctx, ctx->hash[h]);
- }
-
- SCFree(ctx->hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(B3gHashItem) * ctx->hash_size);
- }
- if (ctx->hash2) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->hash2[h] == NULL)
- continue;
-
- B3gHashFree(mpm_ctx, ctx->hash2[h]);
- }
-
- SCFree(ctx->hash2);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(B3gHashItem) * ctx->hash_size);
- }
-
- if (ctx->pminlen) {
- SCFree(ctx->pminlen);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(uint8_t) * ctx->hash_size);
- }
-
- SCFree(mpm_ctx->ctx);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(B3gCtx);
-}
-
-void B3gThreadInitCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint32_t matchsize)
-{
- memset(mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
-
- if (sizeof(B3gThreadCtx) > 0) { /* size can be 0 when optimized */
- mpm_thread_ctx->ctx = SCMalloc(sizeof(B3gThreadCtx));
- if (mpm_thread_ctx->ctx == NULL)
- return;
-
- memset(mpm_thread_ctx->ctx, 0, sizeof(B3gThreadCtx));
-
- mpm_thread_ctx->memory_cnt++;
- mpm_thread_ctx->memory_size += sizeof(B3gThreadCtx);
- }
-}
-
-void B3gThreadDestroyCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx)
-{
- B3gThreadCtx *ctx = (B3gThreadCtx *)mpm_thread_ctx->ctx;
-
- B3gPrintSearchStats(mpm_thread_ctx);
-
- if (ctx != NULL) { /* can be NULL when optimized */
- mpm_thread_ctx->memory_cnt--;
- mpm_thread_ctx->memory_size -= sizeof(B3gThreadCtx);
- SCFree(mpm_thread_ctx->ctx);
- }
-}
-
-inline uint32_t B3gSearchWrap(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- return ctx->Search(mpm_ctx, mpm_thread_ctx, pmq, buf, buflen);
-}
-
-uint32_t B3gSearchBNDMq(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-#ifdef B3G_COUNTERS
- B3gThreadCtx *tctx = (B3gThreadCtx *)mpm_thread_ctx->ctx;
-#endif
- uint32_t pos = ctx->m - B3G_Q + 1, matches = 0;
- B3G_TYPE d;
-
- COUNT(tctx->stat_calls++);
- COUNT(tctx->stat_m_total+=ctx->m);
-
- if (buflen < ctx->m)
- return 0;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (pos <= (uint32_t)(buflen - B3G_Q + 1)) {
- uint16_t h = B3G_HASH(u8_tolower(buf[pos - 1]), u8_tolower(buf[pos]),u8_tolower(buf[pos + 1]));
- d = ctx->B3G[h];
-
- if (d != 0) {
- COUNT(tctx->stat_d0++);
- uint32_t j = pos;
- uint32_t first = pos - (ctx->m - B3G_Q + 1);
-
- do {
- j = j - 1;
- if (d >= (uint32_t)(1 << (ctx->m - 1))) {
- if (j > first) pos = j;
- else {
- /* get our patterns from the hash */
- h = B3G_HASH(u8_tolower(buf[j + ctx->m - 3]), u8_tolower(buf[j + ctx->m - 2]),u8_tolower(buf[j + ctx->m - 1]));
-
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((buflen - j) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf+j, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
-
- //printf("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "\n", ctx->bloom[h], buflen, pos, ctx->pminlen[h]);
- goto skip_loop;
- }
- }
- }
-
- B3gHashItem *hi = ctx->hash[h], *thi;
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- COUNT(tctx->stat_d0_hashloop++);
- B3gPattern *p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (buflen - j < p->len)
- continue;
-
- if (memcmp_lowercase(p->ci, buf+j, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (buflen - j < p->len)
- continue;
-
- if (memcmp(p->cs, buf+j, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
-skip_loop:
- //printf("output at pos %" PRIu32 ": ", j); prt(buf + (j), ctx->m); printf("\n");
- ; // gcc doesn't like the goto label without this :-S
- }
- }
-
- if (j == 0)
- break;
-
- h = B3G_HASH(u8_tolower(buf[j - 1]), u8_tolower(buf[j - 0]),u8_tolower(buf[j+1]));
- d = (d << 1) & ctx->B3G[h];
- } while (d != 0);
- }
- COUNT(tctx->stat_num_shift++);
- COUNT(tctx->stat_total_shift += (ctx->m - B3G_Q + 1));
- pos = pos + ctx->m - B3G_Q + 1;
- }
- return matches;
-}
-
-uint32_t B3gSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
-#ifdef B3G_COUNTERS
- B3gThreadCtx *tctx = (B3gThreadCtx *)mpm_thread_ctx->ctx;
-#endif
- uint32_t pos = 0, matches = 0;
- B3G_TYPE d;
- uint32_t j;
-
- COUNT(tctx->stat_calls++);
- COUNT(tctx->stat_m_total+=ctx->m);
-
- if (buflen < ctx->m)
- return 0;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (pos <= (buflen - ctx->m)) {
- j = ctx->m - 2;
- d = ~0;
-
- do {
- uint16_t h = B3G_HASH(u8_tolower(buf[pos + j - 1]), u8_tolower(buf[pos + j - 0]),u8_tolower(buf[pos + j + 1]));
- d = ((d << 1) & ctx->B3G[h]);
- j = j - 1;
- } while (d != 0 && j != 0);
-
- /* (partial) match, move on to verification */
- if (d != 0) {
- COUNT(tctx->stat_d0++);
- //printf("output at pos %" PRIu32 ": ", pos); prt(buf + pos, ctx->m); printf("\n");
-
- /* get our patterns from the hash */
- uint16_t h = B3G_HASH(u8_tolower(buf[pos + ctx->m - 3]), u8_tolower(buf[pos + ctx->m - 2]),u8_tolower(buf[pos + ctx->m - 1]));
-
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((buflen - pos) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf+pos, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
-
- //printf("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "\n", ctx->bloom[h], buflen, pos, ctx->pminlen[h]);
- goto skip_loop;
- }
- }
- }
-
- B3gHashItem *hi = ctx->hash[h], *thi;
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- COUNT(tctx->stat_d0_hashloop++);
- B3gPattern *p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (buflen - pos < p->len)
- continue;
-
- if (memcmp_lowercase(p->ci, buf+pos, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (buflen - pos < p->len)
- continue;
-
- if (memcmp(p->cs, buf+pos, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
-skip_loop:
- pos = pos + 1;
- //pos = pos + ctx->s0;
- } else {
- COUNT(tctx->stat_num_shift++);
- COUNT(tctx->stat_total_shift += (j + 1));
-
- pos = pos + j + 1;
- }
- }
-
- //printf("Total matches %" PRIu32 "\n", matches);
- return matches;
-}
-
-uint32_t B3gSearch12(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
- B3gPattern *p;
- B3gHashItem *thi, *hi;
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- uint8_t h8 = u8_tolower(*buf);
- hi = &ctx->hash1[h8];
-
- if (hi->flags & 0x01) {
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (h8 == p->ci[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- } else {
- if (*buf == p->cs[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- }
- }
- }
-
- if (buf != bufend) {
- /* save one conversion by reusing h8 */
- uint16_t h16 = (uint16_t)(h8 << b3g_hash_shift | u8_tolower(*(buf+1)));
- hi = ctx->hash2[h16];
-
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (h8 == p->ci[0] && u8_tolower(*(buf+1)) == p->ci[1]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- } else {
- if (*buf == p->cs[0] && *(buf+1) == p->cs[1]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- }
- }
- }
- buf += 1;
- }
-
- //printf("B3gSearch12: after 1/2byte cnt %" PRIu32 "\n", cnt);
- if (ctx->pat_x_cnt > 0) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- //printf("B3gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt);
- }
- return cnt;
-}
-
-uint32_t B3gSearch2(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
- B3gPattern *p;
- B3gHashItem *thi, *hi;
-
- if (buflen < 2)
- return 0;
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- uint16_t h = u8_tolower(*buf) << b3g_hash_shift | u8_tolower(*(buf+1));
- hi = ctx->hash2[h];
-
- if (hi != NULL) {
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- if (p->len != 2)
- continue;
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (u8_tolower(*buf) == p->ci[0] && u8_tolower(*(buf+1)) == p->ci[1]) {
- //printf("CI Exact match: "); prt(p->ci, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B3gSearch1)\n");
- if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size))
- cnt++;
- }
- } else {
- if (*buf == p->cs[0] && *(buf+1) == p->cs[1]) {
- //printf("CS Exact match: "); prt(p->cs, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B3gSearch1)\n");
- if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size))
- cnt++;
- }
- }
- }
- }
- buf += 1;
- }
-
- //printf("B3gSearch2: after 2byte cnt %" PRIu32 "\n", cnt);
- if (ctx->pat_x_cnt) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- //printf("B3gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt);
- }
- return cnt;
-}
-uint32_t B3gSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- B3gCtx *ctx = (B3gCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
- B3gPattern *p;
- B3gHashItem *thi, *hi;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- uint8_t h = u8_tolower(*buf);
- hi = &ctx->hash1[h];
-
- if (hi->flags & 0x01) {
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- if (p->len != 1)
- continue;
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (u8_tolower(*buf) == p->ci[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- } else {
- if (*buf == p->cs[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- }
- }
- }
- buf += 1;
- }
-
- if (ctx->pat_2_cnt) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch2(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- } else if (ctx->pat_x_cnt) {
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- }
- return cnt;
-}
-
-void MpmB3gRegister (void)
-{
- mpm_table[MPM_B3G].name = "b3g";
- mpm_table[MPM_B3G].max_pattern_length = B3G_WORD_SIZE;
- mpm_table[MPM_B3G].InitCtx = B3gInitCtx;
- mpm_table[MPM_B3G].InitThreadCtx = B3gThreadInitCtx;
- mpm_table[MPM_B3G].DestroyCtx = B3gDestroyCtx;
- mpm_table[MPM_B3G].DestroyThreadCtx = B3gThreadDestroyCtx;
- mpm_table[MPM_B3G].AddPattern = B3gAddPatternCS;
- mpm_table[MPM_B3G].AddPatternNocase = B3gAddPatternCI;
- mpm_table[MPM_B3G].Prepare = B3gPreparePatterns;
- mpm_table[MPM_B3G].Search = B3gSearchWrap;
- mpm_table[MPM_B3G].Cleanup = NULL;
- mpm_table[MPM_B3G].PrintCtx = B3gPrintInfo;
- mpm_table[MPM_B3G].PrintThreadCtx = B3gPrintSearchStats;
- mpm_table[MPM_B3G].RegisterUnittests = B3gRegisterTests;
-}
-
-/*
- * TESTS
- */
-
-#ifdef UNITTESTS
-static int B3gTestInit01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->m == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 " ", ctx->m);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-#if 0
-static int B3gTestS0Init01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 " ", ctx->s0);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestS0Init02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"cdef", 4, 0, 0, 1, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ", ctx->s0);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestS0Init03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", ctx->s0);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestS0Init04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abab", 4, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ", ctx->s0);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestS0Init05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcab", 5, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
-
- if (ctx->s0 == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ", ctx->s0);
-
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-#endif
-
-static int B3gTestSearch01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abce", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghj", 4, 0, 0, 2, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-/* test patterns longer than 'm'. M is 4 here. */
-static int B3gTestSearch04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcdegh", 6, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"fghjxyz", 7, 0, 0, 2, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-/* case insensitive test patterns longer than 'm'. M is 4 here. */
-static int B3gTestSearch05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"ABCD", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"bCdEfG", 6, 0, 0, 1, 0, 0); /* 1 match */
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"fghJikl", 7, 0, 0, 2, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3 /* 3 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch06 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch07 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch08 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"a", 1);
-
- if (cnt == 0)
- result = 1;
- else
- printf("0 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch09 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"ab", 2, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"ab", 2);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch10 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcdefgh", 8, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */);
-
- char *input = "012345679012345679012345679012345679012345679012345679"
- "012345679012345679012345679012345679abcdefgh0123456790"
- "123456790123456790123456790123456790123456790123456790"
- "12345679012345679012345679";
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)input, strlen(input));
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch11 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcde", 5, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2 /* 2 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int B3gTestSearch12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_B3G);
- B3gCtx *ctx = (B3gCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"wxyz", 4, 0, 0, 0, 0, 0); /* 1 match */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"vwxyz", 5, 0, 0, 0, 0, 0); /* 1 match */
-
- B3gPreparePatterns(&mpm_ctx);
- B3gThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2 /* 2 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefghjiklmnopqrstuvwxyz", 26);
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 " ",cnt);
-
- B3gThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- B3gDestroyCtx(&mpm_ctx);
- return result;
-}
-
-#endif /* UNITTESTS */
-
-void B3gRegisterTests(void)
-{
-#ifdef UNITTESTS
- UtRegisterTest("B3gTestInit01", B3gTestInit01, 1);
-/*
- UtRegisterTest("B3gTestS0Init01", B3gTestS0Init01, 1);
- UtRegisterTest("B3gTestS0Init02", B3gTestS0Init02, 1);
- UtRegisterTest("B3gTestS0Init03", B3gTestS0Init03, 1);
- UtRegisterTest("B3gTestS0Init04", B3gTestS0Init04, 1);
- UtRegisterTest("B3gTestS0Init05", B3gTestS0Init05, 1);
-*/
- UtRegisterTest("B3gTestSearch01", B3gTestSearch01, 1);
-
- UtRegisterTest("B3gTestSearch02", B3gTestSearch02, 1);
- UtRegisterTest("B3gTestSearch03", B3gTestSearch03, 1);
- UtRegisterTest("B3gTestSearch04", B3gTestSearch04, 1);
- UtRegisterTest("B3gTestSearch05", B3gTestSearch05, 1);
- UtRegisterTest("B3gTestSearch06", B3gTestSearch06, 1);
- UtRegisterTest("B3gTestSearch07", B3gTestSearch07, 1);
- UtRegisterTest("B3gTestSearch08", B3gTestSearch08, 1);
- UtRegisterTest("B3gTestSearch09", B3gTestSearch09, 1);
- UtRegisterTest("B3gTestSearch10", B3gTestSearch10, 1);
- UtRegisterTest("B3gTestSearch11", B3gTestSearch11, 1);
- UtRegisterTest("B3gTestSearch12", B3gTestSearch12, 1);
-#endif /* UNITTESTS */
-}
-
+++ /dev/null
-/* Copyright (C) 2007-2010 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- */
-
-#ifndef __UTIL_MPM_B3G_H__
-#define __UTIL_MPM_B3G_H__
-
-#include "util-mpm.h"
-#include "util-bloomfilter.h"
-
-#define B3G_HASHSHIFT_MAX 8
-#define B3G_HASHSHIFT_MAX2 5
-#define B3G_HASHSHIFT_HIGHER 7
-#define B3G_HASHSHIFT_HIGHER2 4
-#define B3G_HASHSHIFT_HIGH 6
-#define B3G_HASHSHIFT_HIGH2 3
-#define B3G_HASHSHIFT_MEDIUM 5
-#define B3G_HASHSHIFT_MEDIUM2 2
-#define B3G_HASHSHIFT_LOW 4
-#define B3G_HASHSHIFT_LOW2 1
-#define B3G_HASHSHIFT_LOWEST 3
-#define B3G_HASHSHIFT_LOWEST2 1
-
-#define B3G_TYPE uint32_t
-//#define B3G_TYPE uint16_t
-//#define B3G_TYPE uint8_t
-//#define B3G_WORD_SIZE 16
-//#define B3G_WORD_SIZE 8
-#define B3G_WORD_SIZE 32
-
-#define B3G_Q 3
-
-//#define B3G_SEARCHFUNC B3gSearch
-#define B3G_SEARCHFUNC B3gSearchBNDMq
-
-//#define B3G_COUNTERS
-
-typedef struct B3gPattern_ {
- uint8_t *cs; /* case sensitive */
- uint8_t *ci; /* case INsensitive */
- uint16_t len;
- uint8_t flags;
- uint32_t id;
-
- /* sid(s) for this pattern */
- uint32_t sids_size;
- SigIntId *sids;
-
- struct B3gPattern_ *next;
-
-} B3gPattern;
-
-typedef struct B3gHashItem_ {
- uint8_t flags;
- uint16_t idx;
- struct B3gHashItem_ *nxt;
-} B3gHashItem;
-
-typedef struct B3gCtx_ {
- /* hash used during ctx initialization */
- B3gPattern **init_hash;
-
- B3G_TYPE m;
- B3G_TYPE *B3G;
-
- uint8_t s0;
-
- uint16_t pat_1_cnt;
- uint16_t pat_2_cnt;
- uint16_t pat_x_cnt;
-
- uint32_t hash_size;
- B3gHashItem **hash;
- BloomFilter **bloom;
- uint8_t *pminlen; /* array containing the minimal length
- of the patters in a hash bucket. Used
- for the BloomFilter. */
- B3gHashItem hash1[256];
- B3gHashItem **hash2;
-
- uint32_t (*Search)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
-
- /* we store our own multi byte search func ptr here for B3gSearch1 */
- uint32_t (*MBSearch2)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
- uint32_t (*MBSearch)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
-
- /* pattern arrays */
- B3gPattern **parray;
-} B3gCtx;
-
-typedef struct B3gThreadCtx_ {
-#ifdef B3G_COUNTERS
- uint32_t stat_pminlen_calls;
- uint32_t stat_pminlen_total;
- uint32_t stat_bloom_calls;
- uint32_t stat_bloom_hits;
- uint32_t stat_calls;
- uint32_t stat_m_total;
- uint32_t stat_d0;
- uint32_t stat_d0_hashloop;
- uint32_t stat_loop_match;
- uint32_t stat_loop_no_match;
- uint32_t stat_num_shift;
- uint32_t stat_total_shift;
-#endif /* B3G_COUNTERS */
-} B3gThreadCtx;
-
-void MpmB3gRegister(void);
-
-#endif
-
+++ /dev/null
-/* Copyright (C) 2007-2014 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- *
- * Implementation of the Wu-Manber pattern matching algorithm.
- *
- * Ideas:
- * - the hash contains a list of patterns. Maybe we can 'train' the hash
- * so the most common patterns always appear first in this list.
- *
- * \todo make hash1 a array of ptr and get rid of the flag field in the
- * WmHashItem
- * \todo remove exit() calls
- * \todo only calc prefixci_buf for nocase patterns? -- would be in a
- * loop though, so probably not a performance inprovement.
- * \todo make sure runtime counters can be disabled (at compile time)
- */
-
-#include "suricata-common.h"
-#include "suricata.h"
-#include "util-mpm.h"
-#include "util-mpm-wumanber.h"
-#include "conf.h"
-
-#include "util-unittest.h"
-#include "util-debug.h"
-
-#define INIT_HASH_SIZE 65535
-
-#define HASH16_SIZE 65536
-#define HASH16(a,b) (((a)<<8) | (b))
-#define HASH15_SIZE 32768
-#define HASH15(a,b) (((a)<<7) | (b))
-#define HASH14_SIZE 16384
-#define HASH14(a,b) (((a)<<6) | (b))
-#define HASH12_SIZE 4096
-#define HASH12(a,b) (((a)<<4) | (b))
-#define HASH9_SIZE 512
-#define HASH9(a,b) (((a)<<1) | (b))
-
-static uint32_t wm_hash_size = 0;
-static uint32_t wm_bloom_size = 0;
-
-void WmInitCtx (MpmCtx *mpm_ctx);
-void WmThreadInitCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint32_t);
-void WmDestroyCtx(MpmCtx *mpm_ctx);
-void WmThreadDestroyCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx);
-int WmAddPatternCI(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, uint32_t, SigIntId, uint8_t);
-int WmAddPatternCS(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, uint32_t, SigIntId, uint8_t);
-int WmPreparePatterns(MpmCtx *mpm_ctx);
-uint32_t WmSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch2Hash9(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch2Hash12(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch2Hash14(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch2Hash15(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-uint32_t WmSearch2Hash16(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *, uint8_t *buf, uint16_t buflen);
-void WmPrintInfo(MpmCtx *mpm_ctx);
-void WmPrintSearchStats(MpmThreadCtx *mpm_thread_ctx);
-void WmRegisterTests(void);
-
-/* uppercase to lowercase conversion lookup table */
-static uint8_t lowercasetable[256];
-/* marco to do the actual lookup */
-#define wm_tolower(c) lowercasetable[(c)]
-
-#ifdef WUMANBER_COUNTERS
-#define COUNT(counter) \
- (counter)
-#else
-#define COUNT(counter)
-#endif /* WUMANBER_COUNTERS */
-
-void prt (uint8_t *buf, uint16_t buflen)
-{
- uint16_t i;
-
- for (i = 0; i < buflen; i++) {
- if (isprint(buf[i])) printf("%c", buf[i]);
- else printf("\\x%" PRIX32, buf[i]);
- }
- //printf("\n");
-}
-
-void WmPrintInfo(MpmCtx *mpm_ctx)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-
- printf("MPM WuManber Information:\n");
- printf("Memory allocs: %" PRIu32 "\n", mpm_ctx->memory_cnt);
- printf("Memory alloced: %" PRIu32 "\n", mpm_ctx->memory_size);
- printf(" Sizeofs:\n");
- printf(" MpmCtx %" PRIuMAX "\n", (uintmax_t)sizeof(MpmCtx));
- printf(" WmCtx: %" PRIuMAX "\n", (uintmax_t)sizeof(WmCtx));
- printf(" WmPattern %" PRIuMAX "\n", (uintmax_t)sizeof(WmPattern));
- printf(" WmHashItem %" PRIuMAX "\n", (uintmax_t)sizeof(WmHashItem));
- printf("Unique Patterns: %" PRIu32 "\n", mpm_ctx->pattern_cnt);
- printf("Smallest: %" PRIu32 "\n", mpm_ctx->minlen);
- printf("Largest: %" PRIu32 "\n", mpm_ctx->maxlen);
- printf("Max shiftlen: %" PRIu32 "\n", ctx->shiftlen);
- printf("Hash size: %" PRIu32 "\n", ctx->hash_size);
- printf("Search function: ");
- if (ctx->Search == WmSearch1) {
- printf("WmSearch1 (allows single byte patterns)\n");
- printf("MBSearch funct: ");
- if (ctx->MBSearch == WmSearch2Hash16) printf("WmSearch2Hash16\n");
- else if (ctx->MBSearch == WmSearch2Hash15) printf("WmSearch2Hash15\n");
- else if (ctx->MBSearch == WmSearch2Hash14) printf("WmSearch2Hash14\n");
- else if (ctx->MBSearch == WmSearch2Hash12) printf("WmSearch2Hash12\n");
- else if (ctx->MBSearch == WmSearch2Hash9) printf("WmSearch2Hash9\n");
- }
- if (ctx->Search == WmSearch2Hash16) printf("WmSearch2Hash16 (only for multibyte patterns)\n");
- else if (ctx->Search == WmSearch2Hash15) printf("WmSearch2Hash15 (only for multibyte patterns)\n");
- else if (ctx->Search == WmSearch2Hash14) printf("WmSearch2Hash14 (only for multibyte patterns)\n");
- else if (ctx->Search == WmSearch2Hash12) printf("WmSearch2Hash12 (only for multibyte patterns)\n");
- else if (ctx->Search == WmSearch2Hash9) printf("WmSearch2Hash9 (only for multibyte patterns)\n");
- else printf("ERROR\n");
- printf("\n");
-}
-
-static inline WmPattern *WmAllocPattern(MpmCtx *mpm_ctx)
-{
- WmPattern *p = SCMalloc(sizeof(WmPattern));
- if (unlikely(p == NULL))
- return NULL;
- memset(p,0,sizeof(WmPattern));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(WmPattern);
- return p;
-}
-
-static inline WmHashItem *
-WmAllocHashItem(MpmCtx *mpm_ctx)
-{
- WmHashItem *hi = SCMalloc(sizeof(WmHashItem));
- if (unlikely(hi == NULL))
- return NULL;
- memset(hi,0,sizeof(WmHashItem));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(WmHashItem);
- return hi;
-}
-
-static void WmHashFree(MpmCtx *mpm_ctx, WmHashItem *hi)
-{
- if (hi == NULL)
- return;
-
- WmHashItem *t = hi->nxt;
- WmHashFree(mpm_ctx, t);
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(WmHashItem);
- SCFree(hi);
-}
-
-static inline void memcpy_tolower(uint8_t *d, uint8_t *s, uint16_t len)
-{
- uint16_t i;
- for (i = 0; i < len; i++) {
- d[i] = wm_tolower(s[i]);
- }
-}
-
-/*
- * INIT HASH START
- */
-static inline uint32_t WmInitHash(WmPattern *p)
-{
- uint32_t hash = p->len * p->cs[0];
- if (p->len > 1)
- hash += p->cs[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline uint32_t WmInitHashRaw(uint8_t *pat, uint16_t patlen)
-{
- uint32_t hash = patlen * pat[0];
- if (patlen > 1)
- hash += pat[1];
-
- return (hash % INIT_HASH_SIZE);
-}
-
-static inline int WmInitHashAdd(WmCtx *ctx, WmPattern *p)
-{
- uint32_t hash = WmInitHash(p);
-
- //printf("WmInitHashAdd: %" PRIu32 "\n", hash);
-
- if (ctx->init_hash[hash] == NULL) {
- ctx->init_hash[hash] = p;
- //printf("WmInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
- return 0;
- }
-
- WmPattern *tt = NULL;
- WmPattern *t = ctx->init_hash[hash];
-
- /* get the list tail */
- do {
- tt = t;
- t = t->next;
- } while (t != NULL);
-
- tt->next = p;
- //printf("WmInitHashAdd: hash %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
-
- return 0;
-}
-
-static inline int WmCmpPattern(WmPattern *p, uint8_t *pat, uint16_t patlen, char flags);
-
-static inline WmPattern *WmInitHashLookup(WmCtx *ctx, uint8_t *pat, uint16_t patlen, char flags)
-{
- uint32_t hash = WmInitHashRaw(pat,patlen);
-
- //printf("WmInitHashLookup: %" PRIu32 ", head %p\n", hash, ctx->init_hash[hash]);
-
- if (ctx->init_hash[hash] == NULL) {
- return NULL;
- }
-
- WmPattern *t = ctx->init_hash[hash];
- for ( ; t != NULL; t = t->next) {
- if (WmCmpPattern(t,pat,patlen,flags) == 1)
- return t;
- }
-
- return NULL;
-}
-
-static inline int WmCmpPattern(WmPattern *p, uint8_t *pat, uint16_t patlen, char flags)
-{
- if (p->len != patlen)
- return 0;
-
- if (p->flags != flags)
- return 0;
-
- if (memcmp(p->cs, pat, patlen) != 0)
- return 0;
-
- return 1;
-}
-
-/*
- * INIT HASH END
- */
-
-void WmFreePattern(MpmCtx *mpm_ctx, WmPattern *p)
-{
- if (p && p->cs && p->cs != p->ci) {
- SCFree(p->cs);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->ci) {
- SCFree(p->ci);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->len;
- }
-
- if (p && p->sids) {
- SCFree(p->sids);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= p->sids_size * sizeof(uint32_t);
- }
-
- if (p) {
- SCFree(p);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(WmPattern);
- }
-}
-
-/* WmAddPattern
- *
- * pat: ptr to the pattern
- * patlen: length of the pattern
- * nocase: nocase flag: 1 enabled, 0 disable
- * pid: pattern id
- * sid: signature id (internal id)
- */
-static int WmAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, uint16_t offset, uint16_t depth, uint32_t pid, uint32_t sid, uint8_t flags)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-
-// printf("WmAddPattern: ctx %p \"", mpm_ctx); prt(pat, patlen);
-// printf("\" id %" PRIu32 ", nocase %s\n", id, nocase ? "true" : "false");
-
- if (patlen == 0)
- return 0;
-
- /* get a memory piece */
- WmPattern *p = WmInitHashLookup(ctx, pat, patlen, flags);
- if (p == NULL) {
-// printf("WmAddPattern: allocing new pattern\n");
- p = WmAllocPattern(mpm_ctx);
- if (p == NULL)
- goto error;
-
- p->len = patlen;
- p->flags = flags;
- p->id = pid;
-
- /* setup the case insensitive part of the pattern */
- p->ci = SCMalloc(patlen);
- if (p->ci == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy_tolower(p->ci, pat, patlen);
-
- /* setup the case sensitive part of the pattern */
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- /* nocase means no difference between cs and ci */
- p->cs = p->ci;
- } else {
- if (memcmp(p->ci,pat,p->len) == 0) {
- /* no diff between cs and ci: pat is lowercase */
- p->cs = p->ci;
- } else {
- p->cs = SCMalloc(patlen);
- if (p->cs == NULL)
- goto error;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += patlen;
- memcpy(p->cs, pat, patlen);
- }
- }
-
- if (p->len > 1) {
- p->prefix_cs = (uint16_t)(*(p->cs)+*(p->cs+1));
- p->prefix_ci = (uint16_t)(*(p->ci)+*(p->ci+1));
- }
-
- //printf("WmAddPattern: ci \""); prt(p->ci,p->len);
- //printf("\" cs \""); prt(p->cs,p->len);
- //printf("\" prefix_ci %" PRIu32 ", prefix_cs %" PRIu32 "\n", p->prefix_ci, p->prefix_cs);
-
- /* put in the pattern hash */
- WmInitHashAdd(ctx, p);
-
- if (mpm_ctx->pattern_cnt == 65535) {
- printf("Max search words reached\n");
- exit(1);
- }
- mpm_ctx->pattern_cnt++;
-
- if (mpm_ctx->maxlen < patlen) mpm_ctx->maxlen = patlen;
- if (mpm_ctx->minlen == 0) mpm_ctx->minlen = patlen;
- else if (mpm_ctx->minlen > patlen) mpm_ctx->minlen = patlen;
-
- p->sids_size = 1;
- p->sids = SCMalloc(p->sids_size * sizeof(SigIntId));
- BUG_ON(p->sids == NULL);
- p->sids[0] = sid;
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(SigIntId);
-
- } else {
- /* TODO figure out how we can be called multiple times for the same CTX with the same sid */
-
- int found = 0;
- uint32_t x = 0;
- for (x = 0; x < p->sids_size; x++) {
- if (p->sids[x] == sid) {
- found = 1;
- break;
- }
- }
- if (!found) {
- SigIntId *sids = SCRealloc(p->sids, (sizeof(SigIntId) * (p->sids_size + 1)));
- BUG_ON(sids == NULL);
- p->sids = sids;
- p->sids[p->sids_size] = sid;
- p->sids_size++;
- mpm_ctx->memory_size += sizeof(uint32_t);
- }
- }
-
- return 0;
-
-error:
- WmFreePattern(mpm_ctx, p);
- return -1;
-}
-
-int WmAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- flags |= MPM_PATTERN_FLAG_NOCASE;
- return WmAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-int WmAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
- uint16_t offset, uint16_t depth, uint32_t pid, SigIntId sid, uint8_t flags)
-{
- return WmAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags);
-}
-
-static uint32_t WmBloomHash(void *data, uint16_t datalen, uint8_t iter, uint32_t hash_size)
-{
- uint8_t *d = (uint8_t *)data;
- uint16_t i;
- uint32_t hash = (uint32_t)wm_tolower(*d);
-
- for (i = 1; i < datalen - 1; i++) {
- hash += (wm_tolower((*d++))) ^ i;
- }
- hash <<= (iter+1);
-
- hash %= hash_size;
- return hash;
-}
-/*
-static uint32_t BloomHash(void *data, uint16_t datalen, uint8_t iter, uint32_t hash_size)
-{
- uint8_t *d = (uint8_t *)data;
- uint32_t i;
- uint32_t hash = 0;
-
- for (i = 0; i < datalen; i++) {
- if (i == 0) hash += (((uint32_t)*d++));
- else if (i == 1) hash += (((uint32_t)*d++) * datalen);
- else hash *= (((uint32_t)*d++) * i);
- }
-
- hash *= (iter + datalen);
- hash %= hash_size;
- return hash;
-}
-*/
-static void WmSearchPrepareHash(MpmCtx *mpm_ctx)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
- uint16_t i;
- uint16_t idx = 0;
- uint8_t idx8 = 0;
-
- ctx->hash = (WmHashItem **)SCMalloc(sizeof(WmHashItem *) * ctx->hash_size);
- if (ctx->hash == NULL)
- goto error;
- memset(ctx->hash, 0, sizeof(WmHashItem *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(WmHashItem *) * ctx->hash_size);
-
- /* alloc the pminlen array */
- ctx->pminlen = (uint8_t *)SCMalloc(sizeof(uint8_t) * ctx->hash_size);
- if (ctx->pminlen == NULL)
- goto error;
- memset(ctx->pminlen, 0, sizeof(uint8_t) * ctx->hash_size);
-
- for (i = 0; i < mpm_ctx->pattern_cnt; i++)
- {
- if(ctx->parray[i]->len == 1) {
- idx8 = (uint8_t)ctx->parray[i]->ci[0];
- if (ctx->hash1[idx8].flags == 0) {
- ctx->hash1[idx8].idx = i;
- ctx->hash1[idx8].flags |= 0x01;
- } else {
- WmHashItem *hi = WmAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- /* Append this HashItem to the list */
- WmHashItem *thi = &ctx->hash1[idx8];
- while (thi->nxt) thi = thi->nxt;
- thi->nxt = hi;
- }
- } else {
- uint16_t patlen = ctx->shiftlen;
-
- if (ctx->hash_size == HASH9_SIZE)
- idx = HASH9(ctx->parray[i]->ci[patlen-1], ctx->parray[i]->ci[patlen-2]);
- else if (ctx->hash_size == HASH12_SIZE)
- idx = HASH12(ctx->parray[i]->ci[patlen-1], ctx->parray[i]->ci[patlen-2]);
- else if (ctx->hash_size == HASH14_SIZE)
- idx = HASH14(ctx->parray[i]->ci[patlen-1], ctx->parray[i]->ci[patlen-2]);
- else if (ctx->hash_size == HASH15_SIZE)
- idx = HASH15(ctx->parray[i]->ci[patlen-1], ctx->parray[i]->ci[patlen-2]);
- else
- idx = HASH16(ctx->parray[i]->ci[patlen-1], ctx->parray[i]->ci[patlen-2]);
-
- if (ctx->hash[idx] == NULL) {
- WmHashItem *hi = WmAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- ctx->hash[idx] = hi;
- } else {
- WmHashItem *hi = WmAllocHashItem(mpm_ctx);
- if (hi == NULL)
- goto error;
- hi->idx = i;
- hi->flags |= 0x01;
-
- if (ctx->parray[i]->len < ctx->pminlen[idx])
- ctx->pminlen[idx] = ctx->parray[i]->len;
-
- /* Append this HashItem to the list */
- WmHashItem *thi = ctx->hash[idx];
- while (thi->nxt) thi = thi->nxt;
- thi->nxt = hi;
- }
- }
- }
-
- /* alloc the bloom array */
- ctx->bloom = (BloomFilter **)SCMalloc(sizeof(BloomFilter *) * ctx->hash_size);
- if (ctx->bloom == NULL)
- goto error;
- memset(ctx->bloom, 0, sizeof(BloomFilter *) * ctx->hash_size);
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(BloomFilter *) * ctx->hash_size);
-
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- WmHashItem *hi = ctx->hash[h];
- if (hi == NULL)
- continue;
-
- ctx->bloom[h] = BloomFilterInit(wm_bloom_size, 2, WmBloomHash);
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt += BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size += BloomFilterMemorySize(ctx->bloom[h]);
-
- if (ctx->pminlen[h] > 8)
- ctx->pminlen[h] = 8;
-
- WmHashItem *thi = hi;
- do {
- BloomFilterAdd(ctx->bloom[h], ctx->parray[thi->idx]->ci, ctx->pminlen[h]);
- thi = thi->nxt;
- } while (thi != NULL);
- }
- return;
-error:
- return;
-}
-static void WmSearchPrepareShiftTable(MpmCtx *mpm_ctx)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-
- uint16_t shift = 0, k = 0, idx = 0;
- uint32_t i = 0;
-
- uint16_t smallest = mpm_ctx->minlen;
- if (smallest > 255) smallest = 255;
- if (smallest < 2) smallest = 2;
-
- ctx->shiftlen = smallest;
-
- ctx->shifttable = SCMalloc(sizeof(uint16_t) * ctx->hash_size);
- if (ctx->shifttable == NULL)
- return;
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (sizeof(uint16_t) * ctx->hash_size);
-
- /* default shift table is set to minimal shift */
- for (i = 0; i < ctx->hash_size; i++)
- ctx->shifttable[i] = ctx->shiftlen;
-
- for (i = 0; i < mpm_ctx->pattern_cnt; i++)
- {
- /* ignore one byte patterns */
- if (ctx->parray[i]->len == 1)
- continue;
-
- /* add the first character of the pattern preceeded by
- * every possible other character. */
- for (k = 0; k < 256; k++) {
- shift = ctx->shiftlen - 1;
- if (shift > 255) shift = 255;
-
- if (ctx->hash_size == HASH9_SIZE) {
- idx = HASH9(ctx->parray[i]->ci[0], (uint8_t)k);
- //printf("HASH9 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH12_SIZE) {
- idx = HASH12(ctx->parray[i]->ci[0], (uint8_t)k);
- //printf("HASH12 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH14_SIZE) {
- idx = HASH14(ctx->parray[i]->ci[0], (uint8_t)k);
- //printf("HASH14 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH15_SIZE) {
- idx = HASH15(ctx->parray[i]->ci[0], (uint8_t)k);
- //printf("HASH15 idx %" PRIu32 "\n", idx);
- } else {
- idx = HASH16(ctx->parray[i]->ci[0], (uint8_t)k);
- //printf("HASH15 idx %" PRIu32 "\n", idx);
- }
- if (shift < ctx->shifttable[idx]) {
- ctx->shifttable[idx] = shift;
- }
- }
-
- for (k = 0; k < ctx->shiftlen-1; k++)
- {
- shift = (ctx->shiftlen - 2 - k);
- if (shift > 255) shift = 255;
-
- if (ctx->hash_size == HASH9_SIZE) {
- idx = HASH9(ctx->parray[i]->ci[k+1], ctx->parray[i]->ci[k]);
- //printf("HASH9 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH12_SIZE) {
- idx = HASH12(ctx->parray[i]->ci[k+1], ctx->parray[i]->ci[k]);
- //printf("HASH12 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH14_SIZE) {
- idx = HASH14(ctx->parray[i]->ci[k+1], ctx->parray[i]->ci[k]);
- //printf("HASH14 idx %" PRIu32 "\n", idx);
- } else if (ctx->hash_size == HASH15_SIZE) {
- idx = HASH15(ctx->parray[i]->ci[k+1], ctx->parray[i]->ci[k]);
- //printf("HASH15 idx %" PRIu32 "\n", idx);
- } else {
- idx = HASH16(ctx->parray[i]->ci[k+1], ctx->parray[i]->ci[k]);
- //printf("HASH15 idx %" PRIu32 "\n", idx);
- }
- if (shift < ctx->shifttable[idx]) {
- ctx->shifttable[idx] = shift;
- }
- //printf("WmPrepareShiftTable: i %" PRIu32 ", k %" PRIu32 ", idx %" PRIu32 ", shift set to %" PRIu32 ": \"%c%c\"\n",
- // i, k, idx, shift, ctx->parray[i]->ci[k], ctx->parray[i]->ci[k+1]);
- }
- }
-}
-
-int WmPreparePatterns(MpmCtx *mpm_ctx)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-
- /* alloc the pattern array */
- ctx->parray = (WmPattern **)SCMalloc(mpm_ctx->pattern_cnt * sizeof(WmPattern *));
- if (ctx->parray == NULL)
- goto error;
- memset(ctx->parray, 0, mpm_ctx->pattern_cnt * sizeof(WmPattern *));
- //printf("mpm_ctx %p, parray %p\n", mpm_ctx,ctx->parray);
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += (mpm_ctx->pattern_cnt * sizeof(WmPattern *));
-
- /* populate it with the patterns in the hash */
- uint32_t i = 0, p = 0;
- for (i = 0; i < INIT_HASH_SIZE; i++) {
- WmPattern *node = ctx->init_hash[i], *nnode = NULL;
- for ( ; node != NULL; ) {
- nnode = node->next;
- node->next = NULL;
-
- ctx->parray[p] = node;
-
- p++;
- node = nnode;
- }
- }
- /* we no longer need the hash, so free it's memory */
- SCFree(ctx->init_hash);
- ctx->init_hash = NULL;
-
- /* TODO VJ these values are chosen pretty much randomly, so
- * we should do some performance testing
- * */
-
- if (ctx->hash_size == 0) {
- if (mpm_ctx->pattern_cnt < 50) {
- ctx->hash_size = HASH9_SIZE;
- } else if(mpm_ctx->pattern_cnt < 300) {
- ctx->hash_size = HASH12_SIZE;
- } else if(mpm_ctx->pattern_cnt < 1200) {
- ctx->hash_size = HASH14_SIZE;
- } else if(mpm_ctx->pattern_cnt < 2400) {
- ctx->hash_size = HASH15_SIZE;
- } else {
- ctx->hash_size = HASH16_SIZE;
- }
- }
-
- WmSearchPrepareShiftTable(mpm_ctx);
- WmSearchPrepareHash(mpm_ctx);
-
- if (ctx->hash_size == HASH9_SIZE) {
- ctx->MBSearch = WmSearch2Hash9;
- ctx->Search = WmSearch2Hash9;
- } else if (ctx->hash_size == HASH12_SIZE) {
- ctx->MBSearch = WmSearch2Hash12;
- ctx->Search = WmSearch2Hash12;
- } else if (ctx->hash_size == HASH14_SIZE) {
- ctx->MBSearch = WmSearch2Hash14;
- ctx->Search = WmSearch2Hash14;
- } else if (ctx->hash_size == HASH15_SIZE) {
- ctx->MBSearch = WmSearch2Hash15;
- ctx->Search = WmSearch2Hash15;
- } else {
- ctx->MBSearch = WmSearch2Hash16;
- ctx->Search = WmSearch2Hash16;
- }
-
- if (mpm_ctx->minlen == 1) {
- ctx->Search = WmSearch1;
- }
-
- return 0;
-error:
- return -1;
-}
-
-void WmPrintSearchStats(MpmThreadCtx *mpm_thread_ctx)
-{
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-
- printf("Shift 0: %" PRIu32 "\n", tctx->stat_shift_null);
- printf("Loop match: %" PRIu32 "\n", tctx->stat_loop_match);
- printf("Loop no match: %" PRIu32 "\n", tctx->stat_loop_no_match);
- printf("Num shifts: %" PRIu32 "\n", tctx->stat_num_shift);
- printf("Total shifts: %" PRIu32 "\n", tctx->stat_total_shift);
-#endif /* WUMANBER_COUNTERS */
-}
-
-static inline int
-memcmp_lowercase(uint8_t *s1, uint8_t *s2, uint16_t n)
-{
- size_t i;
-
- /* check backwards because we already tested the first
- * 2 to 4 chars. This way we are more likely to detect
- * a miss and thus speed up a little... */
- for (i = n - 1; i; i--) {
- if (wm_tolower(*(s2+i)) != s1[i])
- return 1;
- }
-
- return 0;
-}
-
-inline uint32_t WmSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
- return ctx->Search(mpm_ctx, mpm_thread_ctx, pmq, buf, buflen);
-}
-
-/* SCAN FUNCTIONS */
-uint32_t WmSearch2Hash9(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-#endif /* WUMANBER_COUNTERS */
- uint32_t cnt = 0;
- uint8_t *bufend = buf + buflen - 1;
- uint16_t sl = ctx->shiftlen;
- uint16_t h;
- uint8_t shift;
- WmHashItem *thi, *hi;
- WmPattern *p;
- uint16_t prefixci_buf;
- uint16_t prefixcs_buf;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF(%" PRIu32 ") ", buflen); prt(buf,buflen); printf(" (sl %" PRIu32 ")\n", sl);
-
- buf+=(sl-1);
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- h = HASH9(wm_tolower(*buf),(wm_tolower(*(buf-1))));
- shift = ctx->shifttable[h];
- //printf("%p %" PRIu32 " search: h %" PRIu32 ", shift %" PRIu32 "\n", buf, buf - bufmin, h, shift);
-
- if (shift == 0) {
- COUNT(tctx->stat_shift_null++);
-
- hi = ctx->hash[h];
- //printf("search: hi %p\n", hi);
- if (hi != NULL) {
- /* get our patterns from the hash */
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((bufend - (buf-sl)) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf-sl+1, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
- goto skip_loop;
- }
- }
- }
-
- prefixci_buf = (uint16_t)(wm_tolower(*(buf-sl+1)) + wm_tolower(*(buf-sl+2)));
- prefixcs_buf = (uint16_t)(*(buf-sl+1) + *(buf-sl+2));
-
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- //printf("WmSearch2: p->prefix_ci %" PRIu32 ", p->prefix_cs %" PRIu32 "\n",
- // p->prefix_ci, p->prefix_cs);
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (p->prefix_ci != prefixci_buf || p->len > (bufend-(buf-sl)))
- continue;
-
- if (memcmp_lowercase(p->ci, buf-sl+1, p->len) == 0) {
- //printf("CI Exact match: "); prt(p->ci, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
-
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (p->prefix_cs != prefixcs_buf || p->len > (bufend-(buf-sl)))
- continue;
- if (memcmp(p->cs, buf-sl+1, p->len) == 0) {
- //printf("CS Exact match: "); prt(p->cs, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
-
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
- }
-skip_loop:
- shift = 1;
- } else {
- COUNT(tctx->stat_total_shift += shift);
- COUNT(tctx->stat_num_shift++);
- }
- buf += shift;
- }
-
- //printf("cnt %" PRIu32 "\n", cnt);
- return cnt;
-}
-
-uint32_t WmSearch2Hash12(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-#endif /* WUMANBER_COUNTERS */
- uint32_t cnt = 0;
- uint8_t *bufend = buf + buflen - 1;
- uint16_t sl = ctx->shiftlen;
- uint16_t h;
- uint8_t shift;
- WmHashItem *thi, *hi;
- WmPattern *p;
- uint16_t prefixci_buf;
- uint16_t prefixcs_buf;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF(%" PRIu32 ") ", buflen); prt(buf,buflen); printf("\n");
-
- buf+=(sl-1);
- //buf++;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- //h = (wm_tolower(*buf)<<8)+(wm_tolower(*(buf-1)));
- h = HASH12(wm_tolower(*buf),(wm_tolower(*(buf-1))));
- shift = ctx->shifttable[h];
- //printf("search: h %" PRIu32 ", shift %" PRIu32 "\n", h, shift);
-
- if (shift == 0) {
- COUNT(tctx->stat_shift_null++);
- /* get our hash item */
- hi = ctx->hash[h];
- //printf("search: hi %p\n", hi);
- if (hi != NULL) {
- /* get our patterns from the hash */
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((bufend - (buf-sl)) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf-sl+1, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
- goto skip_loop;
- }
- }
- }
-
- prefixci_buf = (uint16_t)(wm_tolower(*(buf-sl+1)) + wm_tolower(*(buf-sl+2)));
- prefixcs_buf = (uint16_t)(*(buf-sl+1) + *(buf-sl+2));
- //printf("WmSearch2: prefixci_buf %" PRIu32 ", prefixcs_buf %" PRIu32 "\n", prefixci_buf, prefixcs_buf);
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- //printf("WmSearch2: p->prefix_ci %" PRIu32 ", p->prefix_cs %" PRIu32 "\n",
- // p->prefix_ci, p->prefix_cs);
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (p->prefix_ci != prefixci_buf || p->len > (bufend-(buf-sl)))
- continue;
-
- if (memcmp_lowercase(p->ci, buf-sl+1, p->len) == 0) {
- //printf("CI Exact match: "); prt(p->ci, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
-
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (p->prefix_cs != prefixcs_buf || p->len > (bufend-(buf-sl)))
- continue;
- if (memcmp(p->cs, buf-sl+1, p->len) == 0) {
- //printf("CS Exact match: "); prt(p->cs, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
-
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
- }
-skip_loop:
- shift = 1;
- } else {
- COUNT(tctx->stat_total_shift += shift);
- COUNT(tctx->stat_num_shift++);
- }
- buf += shift;
- }
-
- return cnt;
-}
-
-uint32_t WmSearch2Hash14(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-#endif /* WUMANBER_COUNTERS */
- uint32_t cnt = 0;
- uint8_t *bufend = buf + buflen - 1;
- uint16_t sl = ctx->shiftlen;
- uint16_t h;
- uint8_t shift;
- WmHashItem *thi, *hi;
- WmPattern *p;
- uint16_t prefixci_buf;
- uint16_t prefixcs_buf;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF(%" PRIu32 ") ", buflen); prt(buf,buflen); printf("\n");
-
- buf+=(sl-1);
- //buf++;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- //h = (wm_tolower(*buf)<<8)+(wm_tolower(*(buf-1)));
- h = HASH14(wm_tolower(*buf),(wm_tolower(*(buf-1))));
- shift = ctx->shifttable[h];
- //printf("search: h %" PRIu32 ", shift %" PRIu32 "\n", h, shift);
-
- if (shift == 0) {
- COUNT(tctx->stat_shift_null++);
- /* get our hash item */
- hi = ctx->hash[h];
- //printf("search: hi %p\n", hi);
- if (hi != NULL) {
- /* get our patterns from the hash */
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((bufend - (buf-sl)) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf-sl+1, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
- goto skip_loop;
- }
- }
- }
-
- prefixci_buf = (uint16_t)(wm_tolower(*(buf-sl+1)) + wm_tolower(*(buf-sl+2)));
- prefixcs_buf = (uint16_t)(*(buf-sl+1) + *(buf-sl+2));
- //printf("WmSearch2: prefixci_buf %" PRIu32 ", prefixcs_buf %" PRIu32 "\n", prefixci_buf, prefixcs_buf);
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- //printf("WmSearch2: p->prefix_ci %" PRIu32 ", p->prefix_cs %" PRIu32 "\n",
- // p->prefix_ci, p->prefix_cs);
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (p->prefix_ci != prefixci_buf || p->len > (bufend-(buf-sl)))
- continue;
-
- if (memcmp_lowercase(p->ci, buf-sl+1, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (p->prefix_cs != prefixcs_buf || p->len > (bufend-(buf-sl)))
- continue;
- if (memcmp(p->cs, buf-sl+1, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
- }
-skip_loop:
- shift = 1;
- } else {
- COUNT(tctx->stat_total_shift += shift);
- COUNT(tctx->stat_num_shift++);
- }
- buf += shift;
- }
-
- return cnt;
-}
-
-uint32_t WmSearch2Hash15(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-#endif /* WUMANBER_COUNTERS */
- uint32_t cnt = 0;
- uint8_t *bufend = buf + buflen - 1;
- uint16_t sl = ctx->shiftlen;
- uint16_t h;
- uint8_t shift;
- WmHashItem *thi, *hi;
- WmPattern *p;
- uint16_t prefixci_buf;
- uint16_t prefixcs_buf;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF(%" PRIu32 ") ", buflen); prt(buf,buflen); printf("\n");
-
- buf+=(sl-1);
- //buf++;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- //h = (wm_tolower(*buf)<<8)+(wm_tolower(*(buf-1)));
- h = HASH15(wm_tolower(*buf),(wm_tolower(*(buf-1))));
- shift = ctx->shifttable[h];
- //printf("search: h %" PRIu32 ", shift %" PRIu32 "\n", h, shift);
-
- if (shift == 0) {
- COUNT(tctx->stat_shift_null++);
- /* get our hash item */
- hi = ctx->hash[h];
- //printf("search: hi %p\n", hi);
- if (hi != NULL) {
- /* get our patterns from the hash */
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((bufend - (buf-sl)) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf-sl+1, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
- goto skip_loop;
- }
- }
- }
-
- prefixci_buf = (uint16_t)(wm_tolower(*(buf-sl+1)) + wm_tolower(*(buf-sl+2)));
- prefixcs_buf = (uint16_t)(*(buf-sl+1) + *(buf-sl+2));
- //printf("WmSearch2: prefixci_buf %" PRIu32 ", prefixcs_buf %" PRIu32 "\n", prefixci_buf, prefixcs_buf);
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- //printf("WmSearch2: p->prefix_ci %" PRIu32 ", p->prefix_cs %" PRIu32 "\n",
- // p->prefix_ci, p->prefix_cs);
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (p->prefix_ci != prefixci_buf || p->len > (bufend-(buf-sl)))
- continue;
-
- if (memcmp_lowercase(p->ci, buf-sl+1, p->len) == 0) {
- //printf("CI Exact match: "); prt(p->ci, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (p->prefix_cs != prefixcs_buf || p->len > (bufend-(buf-sl)))
- continue;
- if (memcmp(p->cs, buf-sl+1, p->len) == 0) {
- //printf("CS Exact match: "); prt(p->cs, p->len); printf("\n");
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
- }
-skip_loop:
- shift = 1;
- } else {
- COUNT(tctx->stat_total_shift += shift);
- COUNT(tctx->stat_num_shift++);
- }
- buf += shift;
- }
-
- return cnt;
-}
-
-uint32_t WmSearch2Hash16(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
-#ifdef WUMANBER_COUNTERS
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
-#endif /* WUMANBER_COUNTERS */
- uint32_t cnt = 0;
- uint8_t *bufend = buf + buflen - 1;
- uint16_t sl = ctx->shiftlen;
- uint16_t h;
- uint8_t shift;
- WmHashItem *thi, *hi;
- WmPattern *p;
- uint16_t prefixci_buf;
- uint16_t prefixcs_buf;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF(%" PRIu32 ") ", buflen); prt(buf,buflen); printf("\n");
-
- buf+=(sl-1);
- //buf++;
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- while (buf <= bufend) {
- //h = (wm_tolower(*buf)<<8)+(wm_tolower(*(buf-1)));
- h = HASH16(wm_tolower(*buf),(wm_tolower(*(buf-1))));
- shift = ctx->shifttable[h];
- //printf("search: h %" PRIu32 ", shift %" PRIu32 "\n", h, shift);
-
- if (shift == 0) {
- COUNT(tctx->stat_shift_null++);
- /* get our hash item */
- hi = ctx->hash[h];
- //printf("search: hi %p\n", hi);
- if (hi != NULL) {
- /* get our patterns from the hash */
- if (ctx->bloom[h] != NULL) {
- COUNT(tctx->stat_pminlen_calls++);
- COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]);
-
- if ((bufend - (buf-sl)) < ctx->pminlen[h]) {
- goto skip_loop;
- } else {
- COUNT(tctx->stat_bloom_calls++);
-
- if (BloomFilterTest(ctx->bloom[h], buf-sl+1, ctx->pminlen[h]) == 0) {
- COUNT(tctx->stat_bloom_hits++);
- goto skip_loop;
- }
- }
- }
-
- prefixci_buf = (uint16_t)(wm_tolower(*(buf-sl+1)) + wm_tolower(*(buf-sl+2)));
- prefixcs_buf = (uint16_t)(*(buf-sl+1) + *(buf-sl+2));
- //printf("WmSearch2: prefixci_buf %" PRIu32 ", prefixcs_buf %" PRIu32 "\n", prefixci_buf, prefixcs_buf);
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- //printf("WmSearch2: p->prefix_ci %" PRIu32 ", p->prefix_cs %" PRIu32 "\n",
- // p->prefix_ci, p->prefix_cs);
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (p->prefix_ci != prefixci_buf || p->len > (bufend-(buf-sl)))
- continue;
-
- if (memcmp_lowercase(p->ci, buf-sl+1, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- } else {
- if (p->prefix_cs != prefixcs_buf || p->len > (bufend-(buf-sl)))
- continue;
- if (memcmp(p->cs, buf-sl+1, p->len) == 0) {
- COUNT(tctx->stat_loop_match++);
-
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- } else {
- COUNT(tctx->stat_loop_no_match++);
- }
- }
- }
- }
-skip_loop:
- shift = 1;
- } else {
- COUNT(tctx->stat_total_shift += shift);
- COUNT(tctx->stat_num_shift++);
- }
- buf += shift;
- }
-
- return cnt;
-}
-
-uint32_t WmSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
- uint8_t *bufmin = buf;
- uint8_t *bufend = buf + buflen - 1;
- uint32_t cnt = 0;
- WmPattern *p;
- WmHashItem *thi, *hi;
-
- if (buflen == 0)
- return 0;
-
- //printf("BUF "); prt(buf,buflen); printf("\n");
-
- uint8_t *bitarray = NULL;
- if (pmq) {
- bitarray = alloca(pmq->pattern_id_bitarray_size);
- memset(bitarray, 0, pmq->pattern_id_bitarray_size);
- }
-
- if (mpm_ctx->minlen == 1) {
- while (buf <= bufend) {
- uint8_t h = wm_tolower(*buf);
- hi = &ctx->hash1[h];
-
- if (hi->flags & 0x01) {
- for (thi = hi; thi != NULL; thi = thi->nxt) {
- p = ctx->parray[thi->idx];
-
- if (p->len != 1)
- continue;
-
- if (p->flags & MPM_PATTERN_FLAG_NOCASE) {
- if (wm_tolower(*buf) == p->ci[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- } else {
- if (*buf == p->cs[0]) {
- cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id, bitarray, p->sids, p->sids_size);
- }
- }
- }
- }
- buf += 1;
- }
- }
- //printf("WmSearch1: after 1byte cnt %" PRIu32 "\n", cnt);
- if (mpm_ctx->maxlen > 1) {
- /* Pass bufmin on because buf no longer points to the
- * start of the buffer. */
- cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen);
- //printf("WmSearch1: after 2+byte cnt %" PRIu32 "\n", cnt);
- }
- return cnt;
-}
-
-/**
- * \brief Function to get the user defined values for wumanber algorithm from
- * the config file 'suricata.yaml'
- */
-void WmGetConfig()
-{
- ConfNode *wm_conf;
- const char *hash_val = NULL;
- const char *bloom_val = NULL;
-
- /* init defaults */
- wm_hash_size = HASHSIZE_LOW;
- wm_bloom_size = BLOOMSIZE_MEDIUM;
-
- ConfNode *pm = ConfGetNode("pattern-matcher");
-
- if (pm != NULL) {
-
- TAILQ_FOREACH(wm_conf, &pm->head, next) {
- if (strncmp(wm_conf->val, "wumanber", 8) == 0) {
- hash_val = ConfNodeLookupChildValue(wm_conf->head.tqh_first,
- "hash_size");
- bloom_val = ConfNodeLookupChildValue(wm_conf->head.tqh_first,
- "bf_size");
-
- if (hash_val != NULL)
- wm_hash_size = MpmGetHashSize(hash_val);
-
- if (bloom_val != NULL)
- wm_bloom_size = MpmGetBloomSize(bloom_val);
-
- SCLogDebug("hash size is %"PRIu32" and bloom size is %"PRIu32"",
- wm_hash_size, wm_bloom_size);
- }
- }
- }
-}
-
-void WmInitCtx (MpmCtx *mpm_ctx)
-{
- SCLogDebug("mpm_ctx %p", mpm_ctx);
-
- mpm_ctx->ctx = SCMalloc(sizeof(WmCtx));
- if (mpm_ctx->ctx == NULL)
- return;
- memset(mpm_ctx->ctx, 0, sizeof(WmCtx));
-
- mpm_ctx->memory_cnt++;
- mpm_ctx->memory_size += sizeof(WmCtx);
-
- /* initialize the hash we use to speed up pattern insertions */
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
- ctx->init_hash = SCMalloc(sizeof(WmPattern *) * INIT_HASH_SIZE);
- if (ctx->init_hash == NULL)
- return;
-
- memset(ctx->init_hash, 0, sizeof(WmPattern *) * INIT_HASH_SIZE);
-
- /* Initialize the defaults value from the config file. The given check make
- sure that we query config file only once for config values */
- if (wm_hash_size == 0)
- WmGetConfig();
-
-}
-
-void WmDestroyCtx(MpmCtx *mpm_ctx)
-{
- WmCtx *ctx = (WmCtx *)mpm_ctx->ctx;
- if (ctx == NULL)
- return;
-
- if (ctx->init_hash) {
- SCFree(ctx->init_hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (INIT_HASH_SIZE * sizeof(WmPattern *));
- }
-
- if (ctx->parray) {
- uint32_t i;
- for (i = 0; i < mpm_ctx->pattern_cnt; i++) {
- if (ctx->parray[i] != NULL) {
- WmFreePattern(mpm_ctx, ctx->parray[i]);
- }
- }
-
- SCFree(ctx->parray);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(WmPattern));
- }
-
- if (ctx->bloom) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->bloom[h] == NULL)
- continue;
-
- mpm_ctx->memory_cnt -= BloomFilterMemoryCnt(ctx->bloom[h]);
- mpm_ctx->memory_size -= BloomFilterMemorySize(ctx->bloom[h]);
-
- BloomFilterFree(ctx->bloom[h]);
- }
-
- SCFree(ctx->bloom);
-
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(BloomFilter *) * ctx->hash_size);
- }
-
- if (ctx->hash) {
- uint32_t h;
- for (h = 0; h < ctx->hash_size; h++) {
- if (ctx->hash[h] == NULL)
- continue;
-
- WmHashFree(mpm_ctx, ctx->hash[h]);
- }
-
- SCFree(ctx->hash);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(WmHashItem) * ctx->hash_size);
- }
-
- if (ctx->shifttable) {
- SCFree(ctx->shifttable);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(uint16_t) * ctx->hash_size);
- }
-
- if (ctx->pminlen) {
- SCFree(ctx->pminlen);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= (sizeof(uint8_t) * ctx->hash_size);
- }
-
- SCFree(mpm_ctx->ctx);
- mpm_ctx->memory_cnt--;
- mpm_ctx->memory_size -= sizeof(WmCtx);
-}
-
-void WmThreadInitCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint32_t matchsize)
-{
- memset(mpm_thread_ctx, 0, sizeof(MpmThreadCtx));
-
-#ifdef WUMANBER_COUNTERS
- mpm_thread_ctx->ctx = SCMalloc(sizeof(WmThreadCtx));
- if (mpm_thread_ctx->ctx == NULL)
- return;
-
- memset(mpm_thread_ctx->ctx, 0, sizeof(WmThreadCtx));
-
- mpm_thread_ctx->memory_cnt++;
- mpm_thread_ctx->memory_size += sizeof(WmThreadCtx);
-#endif
-}
-
-void WmThreadDestroyCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx)
-{
- WmThreadCtx *ctx = (WmThreadCtx *)mpm_thread_ctx->ctx;
- if (ctx != NULL) { /* size can be 0 when optimized */
- mpm_thread_ctx->memory_cnt--;
- mpm_thread_ctx->memory_size -= sizeof(WmThreadCtx);
- SCFree(mpm_thread_ctx->ctx);
- }
-}
-
-void MpmWuManberRegister (void)
-{
- mpm_table[MPM_WUMANBER].name = "wumanber";
- mpm_table[MPM_WUMANBER].max_pattern_length = 0;
- mpm_table[MPM_WUMANBER].InitCtx = WmInitCtx;
- mpm_table[MPM_WUMANBER].InitThreadCtx = WmThreadInitCtx;
- mpm_table[MPM_WUMANBER].DestroyCtx = WmDestroyCtx;
- mpm_table[MPM_WUMANBER].DestroyThreadCtx = WmThreadDestroyCtx;
- mpm_table[MPM_WUMANBER].AddPattern = WmAddPatternCS;
- mpm_table[MPM_WUMANBER].AddPatternNocase = WmAddPatternCI;
- mpm_table[MPM_WUMANBER].Prepare = WmPreparePatterns;
- mpm_table[MPM_WUMANBER].Search = WmSearch;
- mpm_table[MPM_WUMANBER].Cleanup = NULL;
- mpm_table[MPM_WUMANBER].PrintCtx = WmPrintInfo;
- mpm_table[MPM_WUMANBER].PrintThreadCtx = WmPrintSearchStats;
- mpm_table[MPM_WUMANBER].RegisterUnittests = WmRegisterTests;
-
- /* create table for O(1) lowercase conversion lookup */
- int c = 0;
- for ( ; c < 256; c++) {
- if (c >= 'A' && c <= 'Z')
- lowercasetable[c] = (c + ('a' - 'A'));
- else
- lowercasetable[c] = c;
- }
-}
-
-/*
- * ONLY TESTS BELOW THIS COMMENT
- */
-
-#ifdef UNITTESTS
-int WmTestInitCtx01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- WmInitCtx(&mpm_ctx);
-
- if (mpm_ctx.ctx != NULL)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitCtx02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- WmInitCtx(&mpm_ctx);
-
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- if (ctx->parray == NULL)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitCtx03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- if (mpm_table[MPM_WUMANBER].Search == WmSearch)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestThreadInitCtx01 (void)
-{
-#ifdef WUMANBER_COUNTERS
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- if (mpm_thread_ctx.memory_cnt == 2)
- result = 1;
- else
- printf("mpm_thread_ctx.memory_cnt %"PRIu32", expected 2: ", mpm_thread_ctx.memory_cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-#else
- return 1;
-#endif
-}
-
-int WmTestThreadInitCtx02 (void)
-{
-#ifdef WUMANBER_COUNTERS
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- WmThreadCtx *tctx = (WmThreadCtx *)mpm_thread_ctx.ctx;
-
- if (tctx->search_stat_shift_null == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
-#else
- int result = 1;
-#endif
- return result;
-}
-
-int WmTestInitAddPattern01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- int ret = MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- if (ret == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitAddPattern02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- if (ctx->init_hash != NULL)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitAddPattern03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- WmPattern *pat = WmInitHashLookup(ctx, (uint8_t *)"abcd", 4, 0);
- if (pat != NULL) {
- if (pat->len == 4)
- result = 1;
- }
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitAddPattern04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- WmPattern *pat = WmInitHashLookup(ctx, (uint8_t *)"abcd", 4, MPM_PATTERN_FLAG_NOCASE);
- if (pat != NULL) {
- if (pat->flags & MPM_PATTERN_FLAG_NOCASE)
- result = 1;
- }
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitAddPattern05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- WmPattern *pat = WmInitHashLookup(ctx, (uint8_t *)"abcd", 4, 0);
- if (pat != NULL) {
- if (!(pat->flags & MPM_PATTERN_FLAG_NOCASE))
- result = 1;
- }
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestInitAddPattern06 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 1234, 0, 0);
- WmPattern *pat = WmInitHashLookup(ctx, (uint8_t *)"abcd", 4, 0);
- if (pat != NULL) {
- if (memcmp(pat->cs, "abcd", 4) == 0)
- result = 1;
- }
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"a", 1, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
-
- if (ctx->Search == WmSearch1)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- if (ctx->shiftlen == 4)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- if (ctx->shifttable[1] == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 ": ", ctx->shifttable[1]);
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"a", 1, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
-
- if (ctx->Search == WmSearch1)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- if (ctx->shiftlen == 4)
- result = 1;
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestPrepare06 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- if (ctx->shifttable[1] == 4)
- result = 1;
- else
- printf("4 != %" PRIu32 ": ", ctx->shifttable[1]);
-
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch01 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //mpm_ctx.PrintCtx(&mpm_ctx);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch01Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
-
- ctx->hash_size = HASH12_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //mpm_ctx.PrintCtx(&mpm_ctx);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch01Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
-
- ctx->hash_size = HASH14_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //mpm_ctx.PrintCtx(&mpm_ctx);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch01Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
-
- ctx->hash_size = HASH15_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //mpm_ctx.PrintCtx(&mpm_ctx);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch01Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
-
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
-
- ctx->hash_size = HASH16_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //mpm_ctx.PrintCtx(&mpm_ctx);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcd", 4);
-
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch02 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abce", 4);
-
- if (cnt == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch03 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
- if (cnt == 1)
- result = 1;
- else
- printf("1 != %" PRIu32 " ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch04 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch05 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"efgh", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch06 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"eFgH", 4, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdEfGh", 8);
-
- if (cnt == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch07 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcd", 4, 0, 0, 0, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"eFgH", 4, 0, 0, 1, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdEfGh", 8);
-
- if (cnt == 2)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch08 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"abcde", 5, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bcde", 4, 0, 0, 1, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 2)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch09 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"ab", 2, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"ab", 2);
-
- if (cnt == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch10 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"bc", 2, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"gh", 2, 0, 0, 1, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 2);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 2)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch11 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"a", 1, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"d", 1, 0, 0, 1, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"h", 1, 0, 0, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 3)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"d", 1, 0, 0, 1, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"Z", 1, 0, 0, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 2)
- result = 1;
- else
- printf("2 != %" PRIu32 ": ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch13 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"a", 1, 0, 0, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"de",2, 0, 0, 1, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"h", 1, 0, 0, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 3)
- result = 1;
- else
- printf("3 != %" PRIu32 ": ", cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"de",2, 0, 0, 1, 0, 0);
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"Z", 1, 0, 0, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- if (cnt == 2)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-/** \todo VJ disabled because it tests the old match storage */
-#if 0
-int WmTestSearch15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 1, 1, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"de",2, 0, 0, 1, 1, 1, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"Z", 1, 0, 0, 1, 1, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- uint32_t len = mpm_thread_ctx.match[1].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 1, 1, 0, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"de",2, 0, 0, 1, 1, 1, 0, 0);
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"Z", 1, 0, 0, 1, 1, 2, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 3);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"abcdefgh", 8);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch17 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch18Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH12_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch18Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH14_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch18Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH15_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch18 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH16_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch18Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH16_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch19 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch19Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH12_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch19Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH14_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch19Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH15_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch19Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCI(&mpm_ctx, (uint8_t *)"/VideoAccessCodecInstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH16_SIZE;
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstaLL.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch20 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch20Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH12_SIZE; /* force hash12 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch20Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH14_SIZE; /* force hash14 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch20Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH15_SIZE; /* force hash15 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch20Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH16_SIZE; /* force hash16 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/VideoAccessCodecInstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 0)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-int WmTestSearch21 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
-
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/videoaccesscodecinstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch21Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH12_SIZE; /* force hash16 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //WmPrintInfo(&mpm_ctx);
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/videoaccesscodecinstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch21Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH14_SIZE; /* force hash16 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //WmPrintInfo(&mpm_ctx);
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/videoaccesscodecinstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch21Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH15_SIZE; /* force hash16 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //WmPrintInfo(&mpm_ctx);
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/videoaccesscodecinstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch21Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"/videoaccesscodecinstall.exe", 28, 0, 0, 0, 0, 0);
- ctx->hash_size = HASH16_SIZE; /* force hash16 */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1);
- //WmPrintInfo(&mpm_ctx);
- ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"/videoaccesscodecinstall.exe", 28);
-
- uint32_t len = mpm_thread_ctx.match[0].len;
-
-
- if (len == 1)
- result = 1;
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-#endif
-static int WmTestSearch22Hash9 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- ctx->hash_size = HASH9_SIZE; /* force hash size */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch22Hash12 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- ctx->hash_size = HASH12_SIZE; /* force hash size */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch22Hash14 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- ctx->hash_size = HASH14_SIZE; /* force hash size */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch22Hash15 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- ctx->hash_size = HASH15_SIZE; /* force hash size */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-
-static int WmTestSearch22Hash16 (void)
-{
- int result = 0;
- MpmCtx mpm_ctx;
- memset(&mpm_ctx, 0x00, sizeof(MpmCtx));
- MpmThreadCtx mpm_thread_ctx;
- MpmInitCtx(&mpm_ctx, MPM_WUMANBER);
- WmCtx *ctx = (WmCtx *)mpm_ctx.ctx;
-
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"A", 1, 0, 0, 0, 0, 0); /* should match 30 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AA", 2, 0, 0, 1, 0, 0); /* should match 29 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAA", 3, 0, 0, 2, 0, 0); /* should match 28 times */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAA", 5, 0, 0, 3, 0, 0); /* 26 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAA", 10, 0, 0, 4, 0, 0); /* 21 */
- MpmAddPatternCS(&mpm_ctx, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30, 0, 0, 5, 0, 0); /* 1 */
- /* total matches: 135 */
-
- ctx->hash_size = HASH16_SIZE; /* force hash size */
- WmPreparePatterns(&mpm_ctx);
- WmThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 6 /* 6 patterns */);
-
- uint32_t cnt = ctx->Search(&mpm_ctx, &mpm_thread_ctx, NULL, (uint8_t *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 30);
-
-
- if (cnt == 135)
- result = 1;
- else
- printf("135 != %" PRIu32 " ",cnt);
-
- WmThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx);
- WmDestroyCtx(&mpm_ctx);
- return result;
-}
-#endif /* UNITTESTS */
-
-void WmRegisterTests(void)
-{
-#ifdef UNITTESTS
- UtRegisterTest("WmTestInitCtx01", WmTestInitCtx01, 1);
- UtRegisterTest("WmTestInitCtx02", WmTestInitCtx02, 1);
- UtRegisterTest("WmTestInitCtx03", WmTestInitCtx03, 1);
-
- UtRegisterTest("WmTestThreadInitCtx01", WmTestThreadInitCtx01, 1);
- UtRegisterTest("WmTestThreadInitCtx02", WmTestThreadInitCtx02, 1);
-
- UtRegisterTest("WmTestInitAddPattern01", WmTestInitAddPattern01, 1);
- UtRegisterTest("WmTestInitAddPattern02", WmTestInitAddPattern02, 1);
- UtRegisterTest("WmTestInitAddPattern03", WmTestInitAddPattern03, 1);
- UtRegisterTest("WmTestInitAddPattern04", WmTestInitAddPattern04, 1);
- UtRegisterTest("WmTestInitAddPattern05", WmTestInitAddPattern05, 1);
- UtRegisterTest("WmTestInitAddPattern06", WmTestInitAddPattern06, 1);
-
- UtRegisterTest("WmTestPrepare01", WmTestPrepare01, 1);
- UtRegisterTest("WmTestPrepare02", WmTestPrepare02, 1);
- UtRegisterTest("WmTestPrepare03", WmTestPrepare03, 1);
- UtRegisterTest("WmTestPrepare04", WmTestPrepare01, 1);
- UtRegisterTest("WmTestPrepare05", WmTestPrepare02, 1);
- UtRegisterTest("WmTestPrepare06", WmTestPrepare03, 1);
-
- UtRegisterTest("WmTestSearch01", WmTestSearch01, 1);
- UtRegisterTest("WmTestSearch01Hash12", WmTestSearch01Hash12, 1);
- UtRegisterTest("WmTestSearch01Hash14", WmTestSearch01Hash14, 1);
- UtRegisterTest("WmTestSearch01Hash15", WmTestSearch01Hash15, 1);
- UtRegisterTest("WmTestSearch01Hash16", WmTestSearch01Hash16, 1);
-
- UtRegisterTest("WmTestSearch02", WmTestSearch02, 1);
- UtRegisterTest("WmTestSearch03", WmTestSearch03, 1);
- UtRegisterTest("WmTestSearch04", WmTestSearch04, 1);
- UtRegisterTest("WmTestSearch05", WmTestSearch05, 1);
- UtRegisterTest("WmTestSearch06", WmTestSearch06, 1);
- UtRegisterTest("WmTestSearch07", WmTestSearch07, 1);
- UtRegisterTest("WmTestSearch08", WmTestSearch08, 1);
- UtRegisterTest("WmTestSearch09", WmTestSearch09, 1);
- UtRegisterTest("WmTestSearch10", WmTestSearch10, 1);
- UtRegisterTest("WmTestSearch11", WmTestSearch11, 1);
- UtRegisterTest("WmTestSearch12", WmTestSearch12, 1);
- UtRegisterTest("WmTestSearch13", WmTestSearch13, 1);
-
- UtRegisterTest("WmTestSearch14", WmTestSearch14, 1);
-#if 0
- UtRegisterTest("WmTestSearch15", WmTestSearch15, 1);
- UtRegisterTest("WmTestSearch16", WmTestSearch16, 1);
- UtRegisterTest("WmTestSearch17", WmTestSearch17, 1);
-
- UtRegisterTest("WmTestSearch18", WmTestSearch18, 1);
- UtRegisterTest("WmTestSearch18Hash12", WmTestSearch18Hash12, 1);
- UtRegisterTest("WmTestSearch18Hash14", WmTestSearch18Hash14, 1);
- UtRegisterTest("WmTestSearch18Hash15", WmTestSearch18Hash15, 1);
- UtRegisterTest("WmTestSearch18Hash16", WmTestSearch18Hash16, 1);
-
- UtRegisterTest("WmTestSearch19", WmTestSearch19, 1);
- UtRegisterTest("WmTestSearch19Hash12", WmTestSearch19Hash12, 1);
- UtRegisterTest("WmTestSearch19Hash14", WmTestSearch19Hash14, 1);
- UtRegisterTest("WmTestSearch19Hash15", WmTestSearch19Hash15, 1);
- UtRegisterTest("WmTestSearch19Hash16", WmTestSearch19Hash16, 1);
-
- UtRegisterTest("WmTestSearch20", WmTestSearch20, 1);
- UtRegisterTest("WmTestSearch20Hash12", WmTestSearch20Hash12, 1);
- UtRegisterTest("WmTestSearch20Hash14", WmTestSearch20Hash14, 1);
- UtRegisterTest("WmTestSearch20Hash15", WmTestSearch20Hash15, 1);
- UtRegisterTest("WmTestSearch20Hash16", WmTestSearch20Hash16, 1);
-
- UtRegisterTest("WmTestSearch21", WmTestSearch21, 1);
- UtRegisterTest("WmTestSearch21Hash12", WmTestSearch21Hash12, 1);
- UtRegisterTest("WmTestSearch21Hash14", WmTestSearch21Hash14, 1);
- UtRegisterTest("WmTestSearch21Hash15", WmTestSearch21Hash15, 1);
- UtRegisterTest("WmTestSearch21Hash16", WmTestSearch21Hash16, 1);
-#endif
- UtRegisterTest("WmTestSearch22Hash9", WmTestSearch22Hash9, 1);
- UtRegisterTest("WmTestSearch22Hash12", WmTestSearch22Hash12, 1);
- UtRegisterTest("WmTestSearch22Hash14", WmTestSearch22Hash14, 1);
- UtRegisterTest("WmTestSearch22Hash15", WmTestSearch22Hash15, 1);
- UtRegisterTest("WmTestSearch22Hash16", WmTestSearch22Hash16, 1);
-#endif /* UNITTESTS */
-}
-
+++ /dev/null
-/* Copyright (C) 2007-2010 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Victor Julien <victor@inliniac.net>
- */
-
-#ifndef __UTIL_MPM_WUMANBER_H__
-#define __UTIL_MPM_WUMANBER_H__
-
-#include "util-mpm.h"
-#include "util-bloomfilter.h"
-
-//#define WUMANBER_COUNTERS
-
-typedef struct WmPattern_ {
- uint8_t *cs; /* case sensitive */
- uint8_t *ci; /* case INsensitive */
- uint16_t len;
- struct WmPattern_ *next;
- uint16_t prefix_ci;
- uint16_t prefix_cs;
- uint8_t flags;
- uint32_t id; /* global pattern id */
-
- /* sid(s) for this pattern */
- uint32_t sids_size;
- SigIntId *sids;
-
-} WmPattern;
-
-typedef struct WmHashItem_ {
- uint8_t flags;
- uint16_t idx;
- struct WmHashItem_ *nxt;
-} WmHashItem;
-
-typedef struct WmCtx_ {
- /* hash used during ctx initialization */
- WmPattern **init_hash;
-
- uint16_t shiftlen;
-
- uint32_t hash_size;
- WmHashItem **hash;
- BloomFilter **bloom;
- uint8_t *pminlen; /* array containing the minimal length
- of the patters in a hash bucket. Used
- for the BloomFilter. */
- WmHashItem hash1[256];
-
- /* we store our own search func ptr here for WmSearch1 */
- uint32_t (*Search)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
- /* we store our own multi byte search func ptr here for WmSearch1 */
- uint32_t (*MBSearch)(struct MpmCtx_ *, struct MpmThreadCtx_ *, PatternMatcherQueue *, uint8_t *, uint16_t);
-
- /* pattern arrays */
- WmPattern **parray;
-
- /* only used for multibyte pattern search */
- uint16_t *shifttable;
-} WmCtx;
-
-typedef struct WmThreadCtx_ {
-#ifdef WUMANBER_COUNTERS
- uint32_t stat_pminlen_calls;
- uint32_t stat_pminlen_total;
- uint32_t stat_bloom_calls;
- uint32_t stat_bloom_hits;
- uint32_t stat_shift_null;
- uint32_t stat_loop_match;
- uint32_t stat_loop_no_match;
- uint32_t stat_num_shift;
- uint32_t stat_total_shift;
-#endif /* WUMANBER_COUNTERS */
-} WmThreadCtx;
-
-void MpmWuManberRegister(void);
-
-#endif /* __UTIL_MPM_WUMANBER_H__ */
-
#include "util-debug.h"
/* include pattern matchers */
-#include "util-mpm-wumanber.h"
-#include "util-mpm-b2g.h"
-#include "util-mpm-b3g.h"
#include "util-mpm-ac.h"
-#include "util-mpm-ac-gfbs.h"
#include "util-mpm-ac-bs.h"
#include "util-mpm-ac-tile.h"
#include "util-mpm-hs.h"
return new_size;
}
-/** \brief Verify and store a match
- *
- * used at search runtime
- *
- * \param thread_ctx mpm thread ctx
- * \param pmq storage for match results
- * \param patid pattern ID being checked
- * \param bitarray Array of bits for patterns IDs found in current search
- * \param sids pointer to array of Signature IDs
- * \param sids_size number of Signature IDs in sids array.
- *
- * \retval 0 no match after all
- * \retval 1 (new) match
- */
-int
-MpmVerifyMatch(MpmThreadCtx *thread_ctx, PatternMatcherQueue *pmq, uint32_t patid,
- uint8_t *bitarray, SigIntId *sids, uint32_t sids_size)
-{
- SCEnter();
-
- /* Handle pattern id storage */
- if (pmq != NULL && pmq->pattern_id_bitarray != NULL) {
- SCLogDebug("using pattern id arrays, storing %"PRIu32, patid);
-
- if ((bitarray[(patid / 8)] & (1<<(patid % 8))) == 0) {
- bitarray[(patid / 8)] |= (1<<(patid % 8));
- /* flag this pattern id as being added now */
- pmq->pattern_id_bitarray[(patid / 8)] |= (1<<(patid % 8));
- /* append the pattern_id to the array with matches */
- MpmAddPid(pmq, patid);
- MpmAddSids(pmq, sids, sids_size);
- }
- }
-
- SCReturnInt(1);
-}
-
/**
* \brief Merge two pmq's bitarrays
*
{
memset(mpm_table, 0, sizeof(mpm_table));
- MpmWuManberRegister();
- MpmB2gRegister();
- MpmB3gRegister();
MpmACRegister();
MpmACBSRegister();
- MpmACGfbsRegister();
MpmACTileRegister();
#ifdef BUILD_HYPERSCAN
MpmHSRegister();
#endif /* __SC_CUDA_SUPPORT__ */
}
-/** \brief Function to return the default hash size for the mpm algorithm,
- * which has been defined by the user in the config file
- *
- * \param conf_val pointer to the string value of hash size
- * \retval hash_value returns the hash value as defined by user, otherwise
- * default low size value
- */
-uint32_t MpmGetHashSize(const char *conf_val)
-{
- SCEnter();
- uint32_t hash_value = HASHSIZE_LOW;
-
- if(strcmp(conf_val, "lowest") == 0) {
- hash_value = HASHSIZE_LOWEST;
- } else if(strcmp(conf_val, "low") == 0) {
- hash_value = HASHSIZE_LOW;
- } else if(strcmp(conf_val, "medium") == 0) {
- hash_value = HASHSIZE_MEDIUM;
- } else if(strcmp(conf_val, "high") == 0) {
- hash_value = HASHSIZE_HIGH;
- /* "highest" is supported in 1.0 to 1.0.2, so we keep supporting
- * it for backwards compatibility */
- } else if(strcmp(conf_val, "highest") == 0) {
- hash_value = HASHSIZE_HIGHER;
- } else if(strcmp(conf_val, "higher") == 0) {
- hash_value = HASHSIZE_HIGHER;
- } else if(strcmp(conf_val, "max") == 0) {
- hash_value = HASHSIZE_MAX;
- }
-
- SCReturnInt(hash_value);
-}
-
-/** \brief Function to return the default bloomfilter size for the mpm algorithm,
- * which has been defined by the user in the config file
- *
- * \param conf_val pointer to the string value of bloom filter size
- * \retval bloom_value returns the bloom filter value as defined by user,
- * otherwise default medium size value
- */
-uint32_t MpmGetBloomSize(const char *conf_val)
-{
- SCEnter();
- uint32_t bloom_value = BLOOMSIZE_MEDIUM;
-
- if(strncmp(conf_val, "low", 3) == 0) {
- bloom_value = BLOOMSIZE_LOW;
- } else if(strncmp(conf_val, "medium", 6) == 0) {
- bloom_value = BLOOMSIZE_MEDIUM;
- } else if(strncmp(conf_val, "high", 4) == 0) {
- bloom_value = BLOOMSIZE_HIGH;
- }
-
- SCReturnInt(bloom_value);
-}
-
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)
#define __UTIL_MPM_H__
#include "suricata-common.h"
-#define MPM_ENDMATCH_SINGLE 0x01 /**< A single match is sufficient. No
- depth, offset, etc settings. */
-#define MPM_ENDMATCH_OFFSET 0x02 /**< has offset setting */
-#define MPM_ENDMATCH_DEPTH 0x04 /**< has depth setting */
-#define MPM_ENDMATCH_NOSEARCH 0x08 /**< if this matches, no search is
- required (for this pattern) */
-
-#define HASHSIZE_LOWEST 2048 /**< Lowest hash size for the multi
- pattern matcher algorithms */
-#define HASHSIZE_LOW 4096 /**< Low hash size for the multi
- pattern matcher algorithms */
-#define HASHSIZE_MEDIUM 8192 /**< Medium hash size for the multi
- pattern matcher algorithms */
-#define HASHSIZE_HIGH 16384 /**< High hash size for the multi
- pattern matcher algorithms */
-#define HASHSIZE_HIGHER 32768 /**< Higher hash size for the multi
- pattern matcher algorithms */
-#define HASHSIZE_MAX 65536 /**< Max hash size for the multi
- pattern matcher algorithms */
-#define BLOOMSIZE_LOW 512 /*<* Low bloomfilter size for the multi
- pattern matcher algorithms */
-#define BLOOMSIZE_MEDIUM 1024 /**< Medium bloomfilter size for the multi
- pattern matcher algorithms */
-#define BLOOMSIZE_HIGH 2048 /**< High bloomfilter size for the multi
- pattern matcher algorithms */
-
enum {
MPM_NOTSET = 0,
- /* wumanber as the name suggests */
- MPM_WUMANBER,
- /* bndmq 2 gram */
- MPM_B2G,
- /* bndmq 3 gram */
- MPM_B3G,
- MPM_B2GC,
- MPM_B2GM,
-
/* aho-corasick */
MPM_AC,
#ifdef __SC_CUDA_SUPPORT__
MPM_AC_CUDA,
#endif
- /* aho-corasick-goto-failure state based */
- MPM_AC_GFBS,
MPM_AC_BS,
MPM_AC_TILE,
MPM_HS,
void MpmTableSetup(void);
void MpmRegisterTests(void);
-int MpmVerifyMatch(MpmThreadCtx *thread_ctx, PatternMatcherQueue *pmq, uint32_t patid,
- uint8_t *bitarray, SigIntId *sids, uint32_t sids_size);
void MpmInitCtx(MpmCtx *mpm_ctx, uint16_t matcher);
void MpmInitThreadCtx(MpmThreadCtx *mpm_thread_ctx, uint16_t, uint32_t);
-uint32_t MpmGetHashSize(const char *);
-uint32_t MpmGetBloomSize(const char *);
int MpmAddPatternCS(struct MpmCtx_ *mpm_ctx, uint8_t *pat, uint16_t patlen,
uint16_t offset, uint16_t depth,
mpm-algo: ac
-# The memory settings for hash size of these algorithms can vary from lowest
-# (2048) - low (4096) - medium (8192) - high (16384) - higher (32768) - max
-# (65536). The bloomfilter sizes of these algorithms can vary from low (512) -
-# medium (1024) - high (2048).
-#
-# For B2g/B3g algorithms, there is a support for two different scan/search
-# algorithms. For B2g the scan algorithms are B2gScan & B2gScanBNDMq, and
-# search algorithms are B2gSearch & B2gSearchBNDMq. For B3g scan algorithms
-# are B3gScan & B3gScanBNDMq, and search algorithms are B3gSearch &
-# B3gSearchBNDMq.
-#
-# For B2g the different scan/search algorithms and, hash and bloom
-# filter size settings. For B3g the different scan/search algorithms and, hash
-# and bloom filter size settings. For wumanber the hash and bloom filter size
-# settings.
-
-pattern-matcher:
- - b2g:
- search-algo: B2gSearchBNDMq
- hash-size: low
- bf-size: medium
- - b3g:
- search-algo: B3gSearchBNDMq
- hash-size: low
- bf-size: medium
- - wumanber:
- hash-size: low
- bf-size: medium
-
# Defrag settings:
defrag: