diff --git a/src/util-mpm-ac-gfbs.c b/src/util-mpm-ac-gfbs.c index ba3e0dc2cb..a52bbc3c7a 100644 --- a/src/util-mpm-ac-gfbs.c +++ b/src/util-mpm-ac-gfbs.c @@ -1244,6 +1244,7 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, uint16_t no_of_entries; uint16_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 @@ -1251,6 +1252,10 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, /* 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] + 258)[u8_tolower(buf[i])]; + } else { + /* get the goto state transition */ no_of_entries = *(goto_table_mod_pointers[state & 0x7FFF]); if (no_of_entries == 0) { @@ -1265,10 +1270,10 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, temp_state = SC_AC_GFBS_FAIL; } else { buf_local = u8_tolower(buf[i]); - if (state == 0) { - ascii_codes = goto_table_mod_pointers[state] + 2; - temp_state = ((ascii_codes + no_of_entries))[buf_local]; - } else { + //if (state == 0) { + // ascii_codes = goto_table_mod_pointers[state] + 2; + // temp_state = ((ascii_codes + no_of_entries))[buf_local]; + //} else { ascii_codes = goto_table_mod_pointers[state & 0x7FFF] + 2; int low = 0; int high = no_of_entries; @@ -1285,7 +1290,7 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, high = mid - 1; } } - } + //} } } while (temp_state == SC_AC_GFBS_FAIL) { @@ -1330,6 +1335,9 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, } /* 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; @@ -1377,6 +1385,10 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, * to dig deeper */ register int32_t state = 0; for (i = 0; i < buflen; i++) { + if (state == 0) { + state = (goto_table_mod_pointers[0] + 258)[u8_tolower(buf[i])]; + } else { + /* get the goto state transition */ no_of_entries = *(goto_table_mod_pointers[state & 0x00FFFFFF]); if (no_of_entries == 0) { @@ -1391,10 +1403,10 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, temp_state = SC_AC_GFBS_FAIL; } else { buf_local = u8_tolower(buf[i]); - if (state == 0) { - ascii_codes = goto_table_mod_pointers[state] + 2; - temp_state = ((ascii_codes + no_of_entries))[buf_local]; - } else { + //if (state == 0) { + // ascii_codes = goto_table_mod_pointers[state] + 2; + // temp_state = ((ascii_codes + no_of_entries))[buf_local]; + //} else { ascii_codes = goto_table_mod_pointers[state & 0x00FFFFFF] + 2; int low = 0; int high = no_of_entries; @@ -1411,7 +1423,7 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, high = mid - 1; } } - } + //} } } while (temp_state == SC_AC_GFBS_FAIL) { @@ -1455,6 +1467,9 @@ uint32_t SCACGfbsSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, } /* 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;