|
|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
/* Copyright (C) 2013 Open Information Security Foundation
|
|
|
|
|
/* Copyright (C) 2013-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
|
|
|
|
|
@ -173,7 +173,6 @@ typedef struct StateQueue_ {
|
|
|
|
|
*/
|
|
|
|
|
static void SCACTileGetConfig()
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -286,7 +285,7 @@ static inline SCACTilePattern *SCACTileAllocPattern(MpmCtx *mpm_ctx)
|
|
|
|
|
* \param p Pointer to the SCACTilePattern instance to be freed.
|
|
|
|
|
* \param free Free the above pointer or not.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileFreePattern(MpmCtx *mpm_ctx, SCACTilePattern *p)
|
|
|
|
|
static void SCACTileFreePattern(MpmCtx *mpm_ctx, SCACTilePattern *p)
|
|
|
|
|
{
|
|
|
|
|
if (p != NULL && p->cs != NULL && p->cs != p->ci) {
|
|
|
|
|
SCFree(p->cs);
|
|
|
|
|
@ -311,7 +310,6 @@ static inline void SCACTileFreePattern(MpmCtx *mpm_ctx, SCACTilePattern *p)
|
|
|
|
|
mpm_ctx->memory_cnt--;
|
|
|
|
|
mpm_ctx->memory_size -= sizeof(SCACTilePattern);
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -327,8 +325,6 @@ 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] = u8_tolower(s[i]);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline uint32_t SCACTileInitHash(SCACTilePattern *p)
|
|
|
|
|
@ -384,7 +380,7 @@ static inline void SCACTileHistogramAlphabet(SCACTileCtx *ctx,
|
|
|
|
|
|
|
|
|
|
/* Use Alpahbet Histogram to create compressed alphabet.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileInitTranslateTable(SCACTileCtx *ctx)
|
|
|
|
|
static void SCACTileInitTranslateTable(SCACTileCtx *ctx)
|
|
|
|
|
{
|
|
|
|
|
/* Count the number of ASCII values actually appearing in any
|
|
|
|
|
* pattern. Create compressed mapping table with unused
|
|
|
|
|
@ -599,11 +595,14 @@ static void SCACTileSetOutputState(int32_t state, uint32_t pid, MpmCtx *mpm_ctx)
|
|
|
|
|
SCACTileOutputTable *output_state = &ctx->output_table[state];
|
|
|
|
|
uint32_t i = 0;
|
|
|
|
|
|
|
|
|
|
/* Don't add the pattern more than once to the same state. */
|
|
|
|
|
for (i = 0; i < output_state->no_of_entries; i++) {
|
|
|
|
|
if (output_state->pids[i] == pid)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Increase the size of the array of pids for this state and add
|
|
|
|
|
* the new pid. */
|
|
|
|
|
output_state->no_of_entries++;
|
|
|
|
|
ptmp = SCRealloc(output_state->pids,
|
|
|
|
|
output_state->no_of_entries * sizeof(uint32_t));
|
|
|
|
|
@ -616,8 +615,6 @@ static void SCACTileSetOutputState(int32_t state, uint32_t pid, MpmCtx *mpm_ctx)
|
|
|
|
|
output_state->pids = ptmp;
|
|
|
|
|
|
|
|
|
|
output_state->pids[output_state->no_of_entries - 1] = pid;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -630,8 +627,8 @@ static void SCACTileSetOutputState(int32_t state, uint32_t pid, MpmCtx *mpm_ctx)
|
|
|
|
|
* need it to updated the output table for this pattern.
|
|
|
|
|
* \param mpm_ctx Pointer to the mpm context.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileEnter(uint8_t *pattern, uint16_t pattern_len,
|
|
|
|
|
uint32_t pid, MpmCtx *mpm_ctx)
|
|
|
|
|
static void SCACTileEnter(uint8_t *pattern, uint16_t pattern_len,
|
|
|
|
|
uint32_t pid, MpmCtx *mpm_ctx)
|
|
|
|
|
{
|
|
|
|
|
SCACTileSearchCtx *search_ctx = (SCACTileSearchCtx *)mpm_ctx->ctx;
|
|
|
|
|
SCACTileCtx *ctx = search_ctx->init_ctx;
|
|
|
|
|
@ -642,18 +639,16 @@ static inline void SCACTileEnter(uint8_t *pattern, uint16_t pattern_len,
|
|
|
|
|
int p = 0;
|
|
|
|
|
int tc;
|
|
|
|
|
|
|
|
|
|
/* walk down the trie till we have a match for the pattern prefix */
|
|
|
|
|
/* Walk down the trie till we have a match for the pattern prefix */
|
|
|
|
|
state = 0;
|
|
|
|
|
for (i = 0; i < pattern_len; i++) {
|
|
|
|
|
tc = ctx->translate_table[pattern[i]];
|
|
|
|
|
if (ctx->goto_table[state][tc] != SC_AC_TILE_FAIL) {
|
|
|
|
|
state = ctx->goto_table[state][tc];
|
|
|
|
|
} else {
|
|
|
|
|
if (ctx->goto_table[state][tc] == SC_AC_TILE_FAIL)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
state = ctx->goto_table[state][tc];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* add the non-matching pattern suffix to the trie, from the last state
|
|
|
|
|
/* Add the non-matching pattern suffix to the trie, from the last state
|
|
|
|
|
* we left off */
|
|
|
|
|
for (p = i; p < pattern_len; p++) {
|
|
|
|
|
newstate = SCACTileInitNewState(mpm_ctx);
|
|
|
|
|
@ -662,11 +657,9 @@ static inline void SCACTileEnter(uint8_t *pattern, uint16_t pattern_len,
|
|
|
|
|
state = newstate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* add this pattern id, to the output table of the last state, where the
|
|
|
|
|
/* Add this pattern id, to the output table of the last state, where the
|
|
|
|
|
* pattern ends in the trie */
|
|
|
|
|
SCACTileSetOutputState(state, pid, mpm_ctx);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -675,7 +668,7 @@ static inline void SCACTileEnter(uint8_t *pattern, uint16_t pattern_len,
|
|
|
|
|
*
|
|
|
|
|
* \param mpm_ctx Pointer to the mpm context.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileCreateGotoTable(MpmCtx *mpm_ctx)
|
|
|
|
|
static void SCACTileCreateGotoTable(MpmCtx *mpm_ctx)
|
|
|
|
|
{
|
|
|
|
|
SCACTileSearchCtx *search_ctx = (SCACTileSearchCtx *)mpm_ctx->ctx;
|
|
|
|
|
SCACTileCtx *ctx = search_ctx->init_ctx;
|
|
|
|
|
@ -694,8 +687,6 @@ static inline void SCACTileCreateGotoTable(MpmCtx *mpm_ctx)
|
|
|
|
|
ctx->goto_table[0][aa] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int SCACTileStateQueueIsEmpty(StateQueue *q)
|
|
|
|
|
@ -726,8 +717,6 @@ static inline void SCACTileEnqueue(StateQueue *q, int32_t state)
|
|
|
|
|
"Fatal Error. Exiting. Please file a bug report on this");
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int32_t SCACTileDequeue(StateQueue *q)
|
|
|
|
|
@ -753,9 +742,9 @@ static inline int32_t SCACTileDequeue(StateQueue *q)
|
|
|
|
|
* \param src_state Second state for the union operation.
|
|
|
|
|
* \param mpm_ctx Pointer to the mpm context.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileClubOutputStates(int32_t dst_state,
|
|
|
|
|
int32_t src_state,
|
|
|
|
|
MpmCtx *mpm_ctx)
|
|
|
|
|
static void SCACTileClubOutputStates(int32_t dst_state,
|
|
|
|
|
int32_t src_state,
|
|
|
|
|
MpmCtx *mpm_ctx)
|
|
|
|
|
{
|
|
|
|
|
void *ptmp;
|
|
|
|
|
SCACTileSearchCtx *search_ctx = (SCACTileSearchCtx *)mpm_ctx->ctx;
|
|
|
|
|
@ -790,8 +779,6 @@ static inline void SCACTileClubOutputStates(int32_t dst_state,
|
|
|
|
|
output_src_state->pids[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -800,7 +787,7 @@ static inline void SCACTileClubOutputStates(int32_t dst_state,
|
|
|
|
|
*
|
|
|
|
|
* \param mpm_ctx Pointer to the mpm context.
|
|
|
|
|
*/
|
|
|
|
|
static inline void SCACTileCreateFailureTable(MpmCtx *mpm_ctx)
|
|
|
|
|
static void SCACTileCreateFailureTable(MpmCtx *mpm_ctx)
|
|
|
|
|
{
|
|
|
|
|
SCACTileSearchCtx *search_ctx = (SCACTileSearchCtx *)mpm_ctx->ctx;
|
|
|
|
|
SCACTileCtx *ctx = search_ctx->init_ctx;
|
|
|
|
|
@ -849,8 +836,6 @@ static inline void SCACTileCreateFailureTable(MpmCtx *mpm_ctx)
|
|
|
|
|
mpm_ctx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@ -1009,7 +994,7 @@ static inline void SCACTileCreateDeltaTable(MpmCtx *mpm_ctx)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void SCACTileClubOutputStatePresenceWithDeltaTable(MpmCtx *mpm_ctx)
|
|
|
|
|
static void SCACTileClubOutputStatePresenceWithDeltaTable(MpmCtx *mpm_ctx)
|
|
|
|
|
{
|
|
|
|
|
SCACTileSearchCtx *search_ctx = (SCACTileSearchCtx *)mpm_ctx->ctx;
|
|
|
|
|
SCACTileCtx *ctx = search_ctx->init_ctx;
|
|
|
|
|
@ -1266,8 +1251,6 @@ void SCACTileInitThreadCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx,
|
|
|
|
|
memset(mpm_thread_ctx->ctx, 0, sizeof(SCACTileThreadCtx));
|
|
|
|
|
mpm_thread_ctx->memory_cnt++;
|
|
|
|
|
mpm_thread_ctx->memory_size += sizeof(SCACTileThreadCtx);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -1715,15 +1698,12 @@ int SCACTileAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen,
|
|
|
|
|
|
|
|
|
|
void SCACTilePrintSearchStats(MpmThreadCtx *mpm_thread_ctx)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
#ifdef SC_AC_TILE_COUNTERS
|
|
|
|
|
SCACTileThreadCtx *ctx = (SCACTileThreadCtx *)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_TILE_COUNTERS */
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SCACTilePrintInfo(MpmCtx *mpm_ctx)
|
|
|
|
|
@ -1744,8 +1724,6 @@ void SCACTilePrintInfo(MpmCtx *mpm_ctx)
|
|
|
|
|
printf("Largest: %" PRIu32 "\n", mpm_ctx->maxlen);
|
|
|
|
|
printf("Total states in the state table: %d\n", ctx->state_count);
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************** Mpm Registration ***************************/
|
|
|
|
|
@ -1770,8 +1748,6 @@ void MpmACTileRegister(void)
|
|
|
|
|
mpm_table[MPM_AC_TILE].PrintCtx = SCACTilePrintInfo;
|
|
|
|
|
mpm_table[MPM_AC_TILE].PrintThreadCtx = SCACTilePrintSearchStats;
|
|
|
|
|
mpm_table[MPM_AC_TILE].RegisterUnittests = SCACTileRegisterTests;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2837,8 +2813,6 @@ void SCACTileRegisterTests(void)
|
|
|
|
|
UtRegisterTest("SCACTileTest28", SCACTileTest28, 1);
|
|
|
|
|
UtRegisterTest("SCACTileTest29", SCACTileTest29, 1);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* __tile__ */
|
|
|
|
|
|