Use normal memcmp in ac. Improves perf

remotes/origin/master-1.1.x
Anoop Saldanha 15 years ago committed by Victor Julien
parent 66d496c255
commit 8e95884333

@ -1191,7 +1191,7 @@ uint32_t SCACSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
SCACCtx *ctx = (SCACCtx *)mpm_ctx->ctx; SCACCtx *ctx = (SCACCtx *)mpm_ctx->ctx;
int i = 0; int i = 0;
int matches = 0; int matches = 0;
int j = 0; //int j = 0;
if (ctx->state_count < 65536) { if (ctx->state_count < 65536) {
/* \todo tried loop unrolling with register var, with no perf increase. Need /* \todo tried loop unrolling with register var, with no perf increase. Need
@ -1206,21 +1206,19 @@ uint32_t SCACSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
uint32_t *pids = ctx->output_table[state].pids; uint32_t *pids = ctx->output_table[state].pids;
for (k = 0; k < no_of_entries; k++) { for (k = 0; k < no_of_entries; k++) {
if (pids[k] & 0xFFFF0000) { if (pids[k] & 0xFFFF0000) {
int ibuf = i; if (memcmp(ctx->pid_pat_list[pids[k] & 0x0000FFFF].cs,
for (j = ctx->pid_pat_list[pids[k] & 0x0000FFFF].patlen - 1; j >= 0; j--, ibuf--) { buf + i - ctx->pid_pat_list[pids[k] & 0x0000FFFF].patlen + 1,
if (buf[ibuf] != ctx->pid_pat_list[pids[k] & 0x0000FFFF].cs[j]) { ctx->pid_pat_list[pids[k] & 0x0000FFFF].patlen) != 0) {
if (ctx->pid_pat_list[pids[k] & 0x0000FFFF].case_state == 3) /* inside loop */
break; if (ctx->pid_pat_list[pids[k] & 0x0000FFFF].case_state != 3)
else continue;
goto loop;
}
} }
matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k] & 0x0000FFFF); matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k] & 0x0000FFFF);
} else { } else {
matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k]); matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k]);
} }
loop: //loop:
; //;
} }
} }
} /* for (i = 0; i < buflen; i++) */ } /* for (i = 0; i < buflen; i++) */
@ -1229,6 +1227,7 @@ uint32_t SCACSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
* to dig deeper */ * to dig deeper */
/* \todo Change it for stateful MPM. Supply the state using mpm_thread_ctx */ /* \todo Change it for stateful MPM. Supply the state using mpm_thread_ctx */
SC_AC_STATE_TYPE_U32 (*state_table_u32)[256] = ctx->state_table_u32; SC_AC_STATE_TYPE_U32 (*state_table_u32)[256] = ctx->state_table_u32;
SCACPatternList *pid_pat_list = ctx->pid_pat_list;
register SC_AC_STATE_TYPE_U32 state = 0; register SC_AC_STATE_TYPE_U32 state = 0;
for (i = 0; i < buflen; i++) { for (i = 0; i < buflen; i++) {
state = state_table_u32[state & 0x00FFFFFF][u8_tolower(buf[i])]; state = state_table_u32[state & 0x00FFFFFF][u8_tolower(buf[i])];
@ -1238,16 +1237,21 @@ uint32_t SCACSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
uint32_t k; uint32_t k;
for (k = 0; k < no_of_entries; k++) { for (k = 0; k < no_of_entries; k++) {
if (pids[k] & 0xFFFF0000) { if (pids[k] & 0xFFFF0000) {
int ibuf = i; if (memcmp(pid_pat_list[pids[k] & 0x0000FFFF].cs,
for (j = ctx->pid_pat_list[pids[k] & 0x0000FFFF].patlen - 1; j >= 0; j--, ibuf--) { buf + i - pid_pat_list[pids[k] & 0x0000FFFF].patlen + 1,
if (buf[ibuf] != ctx->pid_pat_list[pids[k] & 0x0000FFFF].cs[j]) { pid_pat_list[pids[k] & 0x0000FFFF].patlen) != 0) {
if (ctx->pid_pat_list[pids[k] & 0x0000FFFF].case_state == 3) /* inside loop */
break; if (pid_pat_list[pids[k] & 0x0000FFFF].case_state != 3) {
else continue;
goto loop1;
} }
} }
matches += MpmVerifyMatch(mpm_thread_ctx, pmq, pids[k] & 0x0000FFFF); if (pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] & (1 << ((pids[k] & 0x0000FFFF) % 8))) {
;
} else {
pmq->pattern_id_bitarray[(pids[k] & 0x0000FFFF) / 8] |= (1 << ((pids[k] & 0x0000FFFF) % 8));
pmq->pattern_id_array[pmq->pattern_id_array_cnt++] = pids[k] & 0x0000FFFF;
}
matches++;
} else { } else {
if (pmq->pattern_id_bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) { if (pmq->pattern_id_bitarray[pids[k] / 8] & (1 << (pids[k] % 8))) {
; ;
@ -1257,8 +1261,8 @@ uint32_t SCACSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
} }
matches++; matches++;
} }
loop1: //loop1:
; //;
} }
} }
} /* for (i = 0; i < buflen; i++) */ } /* for (i = 0; i < buflen; i++) */

Loading…
Cancel
Save