|
|
|
@ -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++) */
|
|
|
|
|