unfinished work
This commit is contained in:
721
src/maat_api.cpp
721
src/maat_api.cpp
@@ -21,31 +21,22 @@
|
||||
#include "maat_kv.h"
|
||||
#include "maat_command.h"
|
||||
#include "maat_ex_data.h"
|
||||
#include "maat_table_schema.h"
|
||||
#include "maat_table_runtime.h"
|
||||
#include "maat_table.h"
|
||||
#include "maat_config_monitor.h"
|
||||
#include "maat_redis_monitor.h"
|
||||
#include "maat_hierarchy.h"
|
||||
#include "maat_compile.h"
|
||||
#include "alignment.h"
|
||||
#include "maat_plugin.h"
|
||||
#include "maat_ip_plugin.h"
|
||||
|
||||
#define MODULE_MAAT_API module_name_str("maat.api")
|
||||
|
||||
#define DISTRICT_ANY -1
|
||||
#define DISTRICT_UNKNOWN -2
|
||||
|
||||
struct maat_state {
|
||||
struct maat *maat_instance;
|
||||
int16_t thread_id;
|
||||
unsigned char is_set_district;
|
||||
unsigned char is_last_scan;
|
||||
int district_id; //-1: Any District; -2: Unkonwn District;
|
||||
int scan_cnt;
|
||||
struct maat_hierarchy_compile_mid *compile_mid;
|
||||
};
|
||||
|
||||
struct scan_item_hit_wrapper {
|
||||
int Nth_scan;
|
||||
struct maat_item_inner* wrapped_items[MAX_SCANNER_HIT_NUM];
|
||||
struct maat_item_inner* wrapped_items[MAX_SCANNER_HIT_COMPILE_NUM];
|
||||
size_t n_wrapped_item;
|
||||
|
||||
int *virtual_table_ids;
|
||||
@@ -56,7 +47,7 @@ struct scan_item_hit_wrapper {
|
||||
inline int scan_state_should_compile_NOT(struct maat_state *mid)
|
||||
{
|
||||
if (mid && mid->is_last_scan==1 && mid->compile_mid &&
|
||||
maat_hierarchy_compile_mid_has_NOT_clause(mid->compile_mid)) {
|
||||
maat_compile_state_has_NOT_clause(mid->compile_mid)) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -78,6 +69,19 @@ struct maat_options* maat_options_new(void)
|
||||
return options;
|
||||
}
|
||||
|
||||
void maat_options_free(struct maat_options *opts)
|
||||
{
|
||||
if (NULL == opts) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (opts->accept_tags != NULL) {
|
||||
FREE(opts->accept_tags);
|
||||
}
|
||||
|
||||
FREE(opts);
|
||||
}
|
||||
|
||||
int maat_options_set_caller_thread_number(struct maat_options *opts, size_t n_thread)
|
||||
{
|
||||
opts->nr_worker_threads = n_thread;
|
||||
@@ -85,6 +89,13 @@ int maat_options_set_caller_thread_number(struct maat_options *opts, size_t n_th
|
||||
return 0;
|
||||
}
|
||||
|
||||
int maat_options_set_accept_tags(struct maat_options *opts, const char *accept_tags)
|
||||
{
|
||||
opts->accept_tags = maat_strdup(accept_tags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int maat_options_set_rule_effect_interval_ms(struct maat_options *opts, int interval_ms)
|
||||
{
|
||||
opts->rule_effect_interval_ms = interval_ms;
|
||||
@@ -244,15 +255,15 @@ struct maat *maat_new(struct maat_options *opts, const char *table_info_path)
|
||||
}
|
||||
maat_instance->logger = log_handle_create(log_path, opts->log_level);
|
||||
}
|
||||
|
||||
maat_instance->table_schema_mgr = table_schema_manager_create(table_info_path, maat_instance->logger);
|
||||
if (NULL == maat_instance->table_schema_mgr) {
|
||||
|
||||
maat_instance->tbl_mgr = table_manager_create(table_info_path, opts->accept_tags, maat_instance->logger);
|
||||
if (NULL == maat_instance->tbl_mgr) {
|
||||
goto failed;
|
||||
}
|
||||
//TODO: by luis
|
||||
//maat_instance->default_compile_table_id = table_manager_get_defaut_compile_table_id(maat_instance->tbl_mgr);
|
||||
maat_instance->default_compile_table_id = -1;
|
||||
|
||||
if (opts->compile_tablename != NULL) {
|
||||
memcpy(maat_instance->compile_tablename, opts->compile_tablename, strlen(opts->compile_tablename));
|
||||
}
|
||||
maat_instance->input_mode = opts->input_mode;
|
||||
switch (maat_instance->input_mode) {
|
||||
case DATA_SOURCE_REDIS:
|
||||
@@ -317,8 +328,8 @@ int maat_table_get_id(struct maat *maat_instance, const char *table_name)
|
||||
{
|
||||
int table_id = -1;
|
||||
|
||||
struct table_schema_manager *table_schema_mgr = maat_instance->table_schema_mgr;
|
||||
table_id = table_schema_manager_get_table_id(table_schema_mgr, table_name);
|
||||
struct table_manager *table_mgr = maat_instance->tbl_mgr;
|
||||
table_id = table_manager_get_table_id(table_mgr, table_name);
|
||||
|
||||
return table_id;
|
||||
}
|
||||
@@ -333,6 +344,24 @@ inline void maat_runtime_ref_dec(struct maat_runtime *maat_rt, int thread_id)
|
||||
alignment_int64_array_add(maat_rt->ref_cnt, thread_id, -1);
|
||||
}
|
||||
|
||||
void fill_maat_rule(struct maat_rule *rule, const struct maat_rule_head *rule_head,
|
||||
const char *srv_def, int srv_def_len)
|
||||
{
|
||||
memcpy(rule, rule_head, sizeof(struct maat_rule_head));
|
||||
memcpy(rule->service_defined, srv_def, MIN(srv_def_len, MAX_SERVICE_DEFINE_LEN));
|
||||
}
|
||||
|
||||
size_t generic_plugin_runtime_cached_row_count(void *custom_rt, enum table_type table_type)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const char *generic_plugin_runtime_get_cached_row(void *custom_rt, enum table_type table_type, size_t row_id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/* must be plugin table */
|
||||
int maat_table_callback_register(struct maat *maat_instance, int table_id,
|
||||
maat_start_callback_t *start,
|
||||
maat_update_callback_t *update,
|
||||
@@ -342,8 +371,9 @@ int maat_table_callback_register(struct maat *maat_instance, int table_id,
|
||||
int ret = -1;
|
||||
|
||||
pthread_mutex_lock(&(maat_instance->background_update_mutex));
|
||||
ret = table_schema_add_callback(maat_instance->table_schema_mgr, table_id,
|
||||
start, update, finish, u_para, maat_instance->logger);
|
||||
void *schema = table_manager_get_schema(maat_instance->tbl_mgr, table_id);
|
||||
ret = plugin_table_add_callback(schema, table_id, start, update, finish,
|
||||
u_para, maat_instance->logger);
|
||||
if (ret < 0) {
|
||||
pthread_mutex_unlock(&(maat_instance->background_update_mutex));
|
||||
return -1;
|
||||
@@ -354,15 +384,17 @@ int maat_table_callback_register(struct maat *maat_instance, int table_id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct table_runtime *table_rt = table_runtime_get(maat_instance->maat_rt->table_rt_mgr, table_id);
|
||||
size_t row_count = table_runtime_cached_row_count(table_rt);
|
||||
if (row_count > 0) {
|
||||
void *runtime = table_manager_get_runtime(maat_instance->tbl_mgr, table_id);
|
||||
enum table_type table_type = table_manager_get_table_type(maat_instance->tbl_mgr, table_id);
|
||||
size_t row_cnt = generic_plugin_runtime_cached_row_count(runtime, table_type);
|
||||
|
||||
if (row_cnt > 0) {
|
||||
if (start != NULL) {
|
||||
start(MAAT_RULE_UPDATE_TYPE_FULL, u_para);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < row_count; i++) {
|
||||
const char *line = table_runtime_get_cached_row(table_rt, i);
|
||||
const char *line = generic_plugin_runtime_get_cached_row(runtime, table_type, i);
|
||||
if (NULL == line) {
|
||||
break;
|
||||
}
|
||||
@@ -380,26 +412,132 @@ int maat_table_callback_register(struct maat *maat_instance, int table_id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int generic_plugin_table_ex_schema_register(struct table_manager *tbl_mgr, int table_id,
|
||||
maat_plugin_ex_new_func_t *new_func,
|
||||
maat_plugin_ex_free_func_t *free_func,
|
||||
maat_plugin_ex_dup_func_t *dup_func,
|
||||
long argl, void *argp)
|
||||
{
|
||||
if (NULL == tbl_mgr || NULL == new_func || NULL == free_func || NULL == dup_func) {
|
||||
assert(0);
|
||||
log_error(tbl_mgr->logger, MODULE_MAAT_API,
|
||||
"table(table_id:%d) %s failed: invalid parameter", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
void *schema = table_manager_get_schema(tbl_mgr, table_id);
|
||||
if (NULL == schema) {
|
||||
log_error(tbl_mgr->logger, MODULE_MAAT_API,
|
||||
"Error: %s, table(table_id:%d) is not registered", __FUNCTION__, table_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct ex_data_schema *ex_schema = NULL;
|
||||
enum table_type table_type = table_manager_get_table_type(tbl_mgr, table_id);
|
||||
switch (table_type) {
|
||||
case TABLE_TYPE_PLUGIN:
|
||||
ex_schema = plugin_table_get_ex_data_schema(schema);
|
||||
if (NULL == ex_schema) {
|
||||
log_error(tbl_mgr->logger, MODULE_MAAT_API,
|
||||
"Error: %s, table(table_id:%d) is not a valid plugin table",
|
||||
__FUNCTION__, table_id);
|
||||
return -1;
|
||||
}
|
||||
plugin_table_set_ex_data_schema(schema, new_func, free_func,
|
||||
dup_func, argl, argp, tbl_mgr->logger);
|
||||
break;
|
||||
case TABLE_TYPE_IP_PLUGIN:
|
||||
ex_schema = ip_plugin_table_get_ex_data_schema(schema);
|
||||
if (NULL == ex_schema) {
|
||||
log_error(tbl_mgr->logger, MODULE_MAAT_API,
|
||||
"Error: %s, table(table_id:%d) is not a valid ip_plugin table",
|
||||
__FUNCTION__, table_id);
|
||||
return -1;
|
||||
}
|
||||
ip_plugin_table_set_ex_data_schema(schema, new_func, free_func,
|
||||
dup_func, argl, argp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void generic_plugin_runtime_commit_ex_schema(void *runtime, void *schema, enum table_type table_type,
|
||||
int nr_worker_thread, long long version, struct log_handle *logger)
|
||||
{
|
||||
struct ex_data_schema *ex_data_schema = NULL;
|
||||
struct ex_data_runtime *ex_data_rt = NULL;
|
||||
|
||||
switch (table_type) {
|
||||
case TABLE_TYPE_PLUGIN:
|
||||
ex_data_schema = plugin_table_get_ex_data_schema(schema);
|
||||
ex_data_rt = plugin_runtime_get_ex_data_rt(runtime);
|
||||
break;
|
||||
case TABLE_TYPE_IP_PLUGIN:
|
||||
ex_data_schema = ip_plugin_table_get_ex_data_schema(schema);
|
||||
ex_data_rt = ip_plugin_runtime_get_ex_data_rt(runtime);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ex_data_runtime_set_schema(ex_data_rt, ex_data_schema);
|
||||
struct ex_container_ctx *ctx = ALLOC(struct ex_container_ctx, 1);
|
||||
|
||||
ctx->table_id = table_schema_get_table_id(custom_schema);
|
||||
ctx->ex_schema = ex_data_schema;
|
||||
ex_data_runtime_set_ex_container_ctx(ex_data_rt, ctx);
|
||||
|
||||
size_t n_cached_row = ex_data_runtime_cached_row_count(ex_data_rt);
|
||||
for (size_t i = 0; i < n_cached_row; i++) {
|
||||
const char *row = ex_data_runtime_cached_row_get(ex_data_rt, i);
|
||||
switch (table_rt->table_type) {
|
||||
case TABLE_TYPE_PLUGIN:
|
||||
plugin_runtime_update_row(custom_rt, custom_schema, row, NULL, 0, 1);
|
||||
break;
|
||||
case TABLE_TYPE_IP_PLUGIN:
|
||||
ip_plugin_runtime_update_row(custom_rt, custom_schema, NULL, NULL, 0, NULL, 1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
ex_data_runtime_clear_row_cache(ex_data_rt);
|
||||
|
||||
switch (table_type) {
|
||||
case TABLE_TYPE_PLUGIN:
|
||||
plugin_runtime_commit(custom_rt);
|
||||
break;
|
||||
case TABLE_TYPE_IP_PLUGIN:
|
||||
ip_plugin_runtime_commit(custom_rt);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int maat_plugin_table_ex_schema_register(struct maat *maat_instance, int table_id,
|
||||
maat_plugin_ex_new_func_t *new_func,
|
||||
maat_plugin_ex_free_func_t *free_func,
|
||||
maat_plugin_ex_dup_func_t *dup_func,
|
||||
long argl, void *argp)
|
||||
{
|
||||
struct table_schema *table_schema = table_schema_get(maat_instance->table_schema_mgr, table_id);
|
||||
pthread_mutex_lock(&(maat_instance->background_update_mutex));
|
||||
int ret = table_schema_set_ex_data_schema(table_schema, new_func, free_func, dup_func,
|
||||
argl, argp, maat_instance->logger);
|
||||
int ret = generic_plugin_table_ex_schema_register(maat_instance->tbl_mgr, table_id,
|
||||
new_func, free_func, dup_func, argl, argp);
|
||||
if (ret < 0) {
|
||||
pthread_mutex_unlock(&(maat_instance->background_update_mutex));
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct table_runtime *table_rt = NULL;
|
||||
if (maat_instance->maat_rt != NULL) {
|
||||
table_rt = table_runtime_get(maat_instance->maat_rt->table_rt_mgr, table_id);
|
||||
table_runtime_commit_ex_data_schema(table_rt, table_schema, maat_instance->nr_worker_thread,
|
||||
maat_instance->maat_rt->version, maat_instance->logger);
|
||||
void *runtime = table_manager_get_runtime(maat_instance->tbl_mgr, table_id);
|
||||
void *schema = table_manager_get_schema(maat_instance->tbl_mgr, table_id);
|
||||
enum table_type table_type = table_manager_get_table_type(maat_instance->tbl_mgr, table_id);
|
||||
generic_plugin_runtime_commit_ex_schema(runtime, schema, table_type, maat_instance->nr_worker_thread,
|
||||
maat_instance->maat_rt->version, maat_instance->logger);
|
||||
}
|
||||
pthread_mutex_unlock(&(maat_instance->background_update_mutex));
|
||||
|
||||
@@ -413,22 +551,29 @@ void *maat_plugin_table_get_ex_data(struct maat *maat_instance, int table_id, co
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct table_schema *table_schema = table_schema_get(maat_instance->table_schema_mgr, table_id);
|
||||
if (NULL == table_schema) {
|
||||
enum table_type table_type = table_manager_get_table_type(maat_rt->ref_tbl_mgr, table_id);
|
||||
void *runtime = table_manager_get_runtime(maat_rt->ref_tbl_mgr, table_id);
|
||||
if (NULL == runtime) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct table_runtime *table_rt = table_runtime_get(maat_rt->table_rt_mgr, table_id);
|
||||
if (NULL == table_rt) {
|
||||
return NULL;
|
||||
struct ex_data_runtime *ex_data_rt = NULL;
|
||||
switch (table_type) {
|
||||
case TABLE_TYPE_PLUGIN:
|
||||
ex_data_rt = plugin_runtime_get_ex_data_rt(runtime);
|
||||
break;
|
||||
case TABLE_TYPE_IP_PLUGIN:
|
||||
ex_data_rt = ip_plugin_runtime_get_ex_data_rt(runtime);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
struct ex_data_runtime *ex_data_rt = table_runtime_get_ex_data_rt(table_rt);
|
||||
|
||||
if (NULL == ex_data_rt) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ex_data_runtime_dup_ex_data(ex_data_rt, key, key_len);
|
||||
return ex_data_runtime_get_ex_data(ex_data_rt, key, key_len);
|
||||
}
|
||||
|
||||
static void scan_count_inc(struct maat_state *mid)
|
||||
@@ -444,11 +589,12 @@ struct maat_state *make_outer_state(struct maat *maat_instance, int thread_id)
|
||||
outer_state->maat_instance = maat_instance;
|
||||
outer_state->district_id = DISTRICT_ANY;
|
||||
outer_state->thread_id = (signed short)thread_id;
|
||||
outer_state->compile_table_id = -1; //-1 means caller not specify compile table, use default compile table
|
||||
|
||||
return outer_state;
|
||||
}
|
||||
|
||||
struct maat_state *grab_mid(struct maat_state **state, struct maat *maat_instance, int thread_id, int is_hit_item)
|
||||
struct maat_state *grab_state(struct maat_state **state, struct maat *maat_instance, int thread_id)
|
||||
{
|
||||
struct maat_state *mid = *state;
|
||||
|
||||
@@ -466,13 +612,12 @@ struct maat_state *grab_mid(struct maat_state **state, struct maat *maat_instanc
|
||||
alignment_int64_array_add(maat_instance->outer_mid_cnt, thread_id, 1);
|
||||
}
|
||||
|
||||
if (is_hit_item == 1) {
|
||||
if (NULL == mid->compile_mid) {
|
||||
mid->compile_mid = maat_hierarchy_compile_mid_new(maat_instance->maat_rt->hier, thread_id);
|
||||
alignment_int64_array_add(maat_instance->compile_mid_cnt, thread_id, 1);
|
||||
}
|
||||
}
|
||||
return mid;
|
||||
if (NULL == mid->compile_mid) {
|
||||
mid->compile_mid = maat_compile_state_new(thread_id);
|
||||
alignment_int64_array_add(maat_instance->compile_mid_cnt, thread_id, 1);
|
||||
}
|
||||
|
||||
return mid;
|
||||
}
|
||||
|
||||
void scan_item_hit_wrapper_build(struct scan_item_hit_wrapper* wrapper, struct scan_result* results, size_t n_result,
|
||||
@@ -497,186 +642,27 @@ void scan_item_hit_wrapper_build(struct scan_item_hit_wrapper* wrapper, struct s
|
||||
wrapper->virtual_table_ids = NULL;
|
||||
}
|
||||
|
||||
struct compile_sort_para {
|
||||
double evaluation_order;
|
||||
int declared_clause_num;
|
||||
int compile_id;
|
||||
void *user;
|
||||
};
|
||||
|
||||
static void compile_sort_para_set(struct compile_sort_para *para,
|
||||
const struct maat_compile_rule *compile_relation, void *user)
|
||||
{
|
||||
para->compile_id=compile_relation->compile_id;
|
||||
para->evaluation_order=compile_relation->evaluation_order;
|
||||
para->declared_clause_num=compile_relation->declared_clause_num;
|
||||
para->user = user;
|
||||
}
|
||||
|
||||
static int compile_sort_para_compare(const struct compile_sort_para *a, const struct compile_sort_para *b)
|
||||
{
|
||||
//If both of compile rule's evaluation order are specified, compile rule with small evaluation order is priority.
|
||||
if(a->evaluation_order!=0 && b->evaluation_order!=0)
|
||||
{
|
||||
if(a->evaluation_order - b->evaluation_order <0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if(a->evaluation_order - b->evaluation_order >0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
//If one of compile rule's evaluation order is zero, compile rule with big evaluation order is priority.
|
||||
else if(a->evaluation_order + b->evaluation_order!= 0)
|
||||
{
|
||||
return (a->evaluation_order - b->evaluation_order >0) ? -1 : 1;
|
||||
}
|
||||
//If compile rule's execute sequences are not specified or equal.
|
||||
if(a->declared_clause_num!=b->declared_clause_num)
|
||||
{
|
||||
return (a->declared_clause_num-b->declared_clause_num);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (b->compile_id-a->compile_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int compare_compile_rule(const void *a, const void *b)
|
||||
{
|
||||
const struct maat_compile_rule *ra=*(const struct Maat_compile_rule **)a;
|
||||
const struct maat_compile_rule *rb=*(const struct Maat_compile_rule **)b;
|
||||
|
||||
struct compile_sort_para sa, sb;
|
||||
compile_sort_para_set(&sa, ra, NULL);
|
||||
compile_sort_para_set(&sb, rb, NULL);
|
||||
|
||||
return compile_sort_para_compare(&sa, &sb);
|
||||
}
|
||||
|
||||
int item_compile(struct maat *maat_instance, struct maat_hierarchy_compile_mid *compile_mid,
|
||||
const struct scan_item_hit_wrapper *item_hit_wrapper, int *result,
|
||||
int size, int thread_id)
|
||||
{
|
||||
int is_last_item = item_hit_wrapper->is_last_item;
|
||||
size_t item_hit_num = item_hit_wrapper->n_wrapped_item;
|
||||
|
||||
int scan_ret=0;
|
||||
int i=0;
|
||||
|
||||
struct maat_compile_rule *compile_rule_array[size];
|
||||
struct maat_compile_rule *compile_rule = NULL;
|
||||
int virtual_table_id = 0;
|
||||
|
||||
struct maat_item_inner *item = NULL;
|
||||
|
||||
for (i = 0; (size_t)i < item_hit_num;i++) {
|
||||
item = item_hit_wrapper->wrapped_items[i];
|
||||
assert(item->magic_num == ITEM_RULE_MAGIC);
|
||||
if (item_hit_wrapper->virtual_table_ids) {
|
||||
virtual_table_id = item_hit_wrapper->virtual_table_ids[i];
|
||||
} else {
|
||||
virtual_table_id = item_hit_wrapper->virtual_table_id;
|
||||
}
|
||||
maat_hierarchy_compile_mid_update(feather->scanner->hier, compile_mid, item->item_id, virtual_table_id, item_hit_wrapper->Nth_scan, i);
|
||||
}
|
||||
|
||||
scan_ret = maat_hierarchy_item_compile(feather->scanner->hier, compile_mid, is_last_item, (void **)compile_rule_array, size);
|
||||
//Maat_hierarchy is rwlock protected, it always returns non-NULL compile_rule.
|
||||
if (scan_ret > 1) {
|
||||
qsort(compile_rule_array, scan_ret, sizeof(struct maat_compile_rule *),
|
||||
compare_compile_rule);
|
||||
}
|
||||
for (i = 0; i < scan_ret && i < size; i++) {
|
||||
compile_rule = compile_rule_array[i];
|
||||
assert(compile_rule->magic_num == COMPILE_RULE_MAGIC);
|
||||
result[i] = compile_rule->compile_id;
|
||||
/*
|
||||
fill_maat_rule(&(result[i]), &(compile_rule->head), compile_rule->service_defined,
|
||||
compile_rule->head.serv_def_len);*/
|
||||
}
|
||||
|
||||
if (scan_ret > 0) {
|
||||
alignment_int64_array_add(feather->hit_cnt, thread_id, 1);
|
||||
}
|
||||
|
||||
if (item_hit_num == 0 && scan_ret > 0) {
|
||||
alignment_int64_array_add(feather->not_grp_hit_cnt, thread_id, 1);
|
||||
}
|
||||
|
||||
return MIN(scan_ret, size);
|
||||
}
|
||||
|
||||
int maat_scan_integer(struct maat *instance, int table_id, int thread_id,
|
||||
unsigned int intval, int results[], size_t *n_result,
|
||||
struct maat_state **state)
|
||||
unsigned int intval, int *results, size_t n_result,
|
||||
size_t *n_hit_result, struct maat_state **state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ip_scan_data_set(struct ip_addr *scan_data, struct addr_2tuple *addr, enum component_table_type child_type)
|
||||
static int ip_scan_data_set(struct ip_addr *scan_data, const char *ip_addr)
|
||||
{
|
||||
switch (addr->type) {
|
||||
case IP_TYPE_V4:
|
||||
scan_data->ip_type = IP_TYPE_V4;
|
||||
switch (child_type) {
|
||||
case COMPONENT_TABLE_TYPE_SIP:
|
||||
scan_data->ipv4 = ntohl(addr->ipv4.sip);
|
||||
break;
|
||||
case COMPONENT_TABLE_TYPE_DIP:
|
||||
scan_data->ipv4 = ntohl(addr->ipv4.dip);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case IP_TYPE_V6:
|
||||
scan_data->ip_type = IP_TYPE_V6;
|
||||
switch (child_type) {
|
||||
case COMPONENT_TABLE_TYPE_SIP:
|
||||
memcpy(scan_data->ipv6, addr->ipv6.sip, sizeof(addr->ipv6.sip));
|
||||
ipv6_ntoh(scan_data->ipv6);
|
||||
break;
|
||||
case COMPONENT_TABLE_TYPE_DIP:
|
||||
memcpy(scan_data->ipv6, addr->ipv6.dip, sizeof(addr->ipv6.dip));
|
||||
ipv6_ntoh(scan_data->ipv6);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ip_composition_scan(int thread_id, struct addr_2tuple *addr,
|
||||
int parent_table_id, enum component_table_type child_type,
|
||||
int *virtual_table_id,
|
||||
static int ip_composition_scan(int thread_id, const char *ip_addr,
|
||||
int parent_table_id, int *virtual_table_id,
|
||||
struct table_schema_manager *table_schema_mgr,
|
||||
struct table_runtime_manager *table_rt_mgr,
|
||||
struct scan_result *item_results, size_t n_result_array)
|
||||
int *group_id_array, size_t n_group_id_array,
|
||||
struct maat_state *state)
|
||||
{
|
||||
int child_table_id = 0;
|
||||
|
||||
if (child_type == COMPONENT_TABLE_TYPE_NONE) {
|
||||
child_table_id = parent_table_id;
|
||||
child_type = COMPONENT_TABLE_TYPE_SESSION;
|
||||
} else {
|
||||
child_table_id = table_schema_manager_get_child_table_id(table_schema_mgr, parent_table_id, child_type);
|
||||
}
|
||||
|
||||
if (child_table_id < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct table_schema *real_table = table_schema_get_by_scan_type(table_schema_mgr, child_table_id, SCAN_TYPE_IP, virtual_table_id);
|
||||
if (NULL == real_table) {
|
||||
return 0;
|
||||
@@ -688,7 +674,7 @@ static int ip_composition_scan(int thread_id, struct addr_2tuple *addr,
|
||||
}
|
||||
|
||||
int table_id = table_schema_get_table_id(real_table);
|
||||
struct table_runtime *table_rt = table_runtime_get(table_rt_mgr, table_id);
|
||||
struct table_runtime *table_rt = table_manager_get_runtime(table_rt_mgr, table_id);
|
||||
size_t rule_num = table_runtime_rule_count(table_rt);
|
||||
if (0 == rule_num) {
|
||||
return 0;
|
||||
@@ -697,122 +683,150 @@ static int ip_composition_scan(int thread_id, struct addr_2tuple *addr,
|
||||
struct ip_addr scan_data;
|
||||
memset(&scan_data, 0, sizeof(struct ip_addr));
|
||||
|
||||
ip_scan_data_set(&scan_data, addr, child_type);
|
||||
size_t hit_cnt = 0;
|
||||
int ret = table_runtime_scan_ip(table_rt, thread_id, &scan_data, item_results, &hit_cnt, n_result_array);
|
||||
ip_scan_data_set(&scan_data, ip_addr);
|
||||
size_t hit_group_cnt = 0;
|
||||
int ret = table_runtime_scan_ip(table_rt, thread_id, &scan_data, group_id_array, n_group_id_array, *virtual_table_id, state);
|
||||
if (ret < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return hit_cnt;
|
||||
return hit_group_cnt;
|
||||
}
|
||||
|
||||
int maat_scan_ip(struct maat *maat_instance, int table_id, int thread_id, struct addr_2tuple *addr,
|
||||
int results[], size_t *n_result, struct maat_state **state)
|
||||
int maat_scan_ipv4(struct maat *maat_instance, int table_id, int thread_id,
|
||||
uint32_t ip_addr, int *results, size_t n_result,
|
||||
size_t *n_hit_result, struct maat_state **state)
|
||||
{
|
||||
if ((NULL == maat_instance) || (table_id < 0) || (table_id >= MAX_TABLE_NUM) ||
|
||||
(thread_id < 0) || (NULL == addr) || (NULL == results) || (NULL == n_result) ||
|
||||
(thread_id < 0) || (NULL == ip_addr) || (NULL == results) || (0 == n_result) ||
|
||||
(NULL == state)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct maat_state *mid = NULL;
|
||||
mid = grab_mid(state, maat_instance, thread_id, 0);
|
||||
mid = grab_state(state, maat_instance, thread_id);
|
||||
scan_count_inc(mid);
|
||||
|
||||
struct maat_runtime *maat_rt = maat_instance->maat_rt;
|
||||
if (NULL == maat_rt) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct table_runtime_manager *table_rt_mgr = maat_rt->table_rt_mgr;
|
||||
struct table_runtime *table_rt = table_runtime_get(table_rt_mgr, table_id);
|
||||
enum table_type table_type = table_runtime_get_type(table_rt);
|
||||
if (table_type == TABLE_TYPE_INVALID) {
|
||||
maat_instance->scan_err_cnt++;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int item_ret = 0;
|
||||
int virtual_table_id = 0;
|
||||
struct scan_result *item_result = maat_rt->item_result_buff + thread_id * MAX_SCANNER_HIT_NUM;
|
||||
int item_hit_cnt = 0;
|
||||
int item_result_virtual_table_ids[MAX_SCANNER_HIT_NUM];
|
||||
alignment_int64_array_add(maat_instance->thread_call_cnt, thread_id, 1);
|
||||
maat_runtime_ref_inc(maat_rt, thread_id);
|
||||
struct table_schema *table_schema = table_schema_get_by_scan_type(maat_instance->table_schema_mgr, table_id,
|
||||
SCAN_TYPE_IP, &virtual_table_id);
|
||||
if (NULL == table_schema) {
|
||||
return MAAT_ERR;
|
||||
}
|
||||
|
||||
if (table_type == TABLE_TYPE_COMPOSITION) {
|
||||
/*
|
||||
item_ret = ip_composition_scan(thread_id, addr, table_id, COMPONENT_TABLE_TYPE_SIP, &virtual_table_id,
|
||||
maat_instance->table_schema_mgr, maat_instance->maat_rt->table_rt_mgr,
|
||||
item_result + item_hit_cnt, MAX_SCANNER_HIT_NUM - item_hit_cnt);
|
||||
item_hit_cnt += item_ret; */
|
||||
enum component_table_type childs[3] = {COMPONENT_TABLE_TYPE_SIP, COMPONENT_TABLE_TYPE_DIP, COMPONENT_TABLE_TYPE_SESSION};
|
||||
for (int i = 0; i < 3; i++) {
|
||||
item_ret = ip_composition_scan(thread_id, addr, table_id, childs[i], &virtual_table_id,
|
||||
maat_instance->table_schema_mgr, maat_instance->maat_rt->table_rt_mgr,
|
||||
item_result + item_hit_cnt, MAX_SCANNER_HIT_NUM - item_hit_cnt);
|
||||
if (item_ret < 0) {
|
||||
maat_instance->scan_err_cnt++;
|
||||
} else {
|
||||
for (int j = 0; j < item_ret; j++) {
|
||||
item_result_virtual_table_ids[item_hit_cnt++] = virtual_table_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
struct maat_runtime *maat_rt = maat_instance->maat_rt;
|
||||
int group_result[MAX_SCANNER_HIT_GROUP_NUM] = {-1};
|
||||
int group_hit_cnt = 0;
|
||||
int group_result_virtual_table_ids[MAX_SCANNER_HIT_GROUP_NUM];
|
||||
enum table_type table_type = table_manager_get_table_type(maat_instance->tbl_mgr, table_id);
|
||||
int group_ret = -1;
|
||||
|
||||
group_ret = ip_composition_scan(thread_id, ip_addr, table_id, &virtual_table_id,
|
||||
maat_instance->table_schema_mgr, maat_instance->maat_rt->table_rt_mgr,
|
||||
group_result + group_hit_cnt, MAX_SCANNER_HIT_COMPILE_NUM - group_hit_cnt, mid);
|
||||
if (group_ret < 0) {
|
||||
maat_instance->scan_err_cnt++;
|
||||
} else if (0 == group_ret) {
|
||||
return MAAT_OK;
|
||||
} else {
|
||||
item_ret = ip_composition_scan(thread_id, addr, table_id, COMPONENT_TABLE_TYPE_NONE, &virtual_table_id,
|
||||
maat_instance->table_schema_mgr, maat_instance->maat_rt->table_rt_mgr,
|
||||
item_result + item_hit_cnt, MAX_SCANNER_HIT_NUM - item_hit_cnt);
|
||||
if (item_ret < 0) {
|
||||
maat_instance->scan_err_cnt++;
|
||||
} else {
|
||||
item_hit_cnt += item_ret;
|
||||
}
|
||||
group_hit_cnt += group_ret;
|
||||
}
|
||||
|
||||
int compile_ret = 0;
|
||||
struct scan_item_hit_wrapper item_hit_wrapper;
|
||||
if (item_hit_cnt > 0 || scan_state_should_compile_NOT(mid)) {
|
||||
mid = grab_mid(state, maat_instance, thread_id, 1);
|
||||
scan_item_hit_wrapper_build(&item_hit_wrapper, item_result, item_hit_cnt, -1,
|
||||
mid->is_last_scan, virtual_table_id, mid->scan_cnt);
|
||||
if (table_type == TABLE_TYPE_COMPOSITION) {
|
||||
item_hit_wrapper.virtual_table_ids = item_result_virtual_table_ids;
|
||||
}
|
||||
// come here means group_hit_cnt > 0, at least MAAT_HALF_HIT, or MAAT_HIT
|
||||
|
||||
compile_ret = item_compile(maat_instance, mid->compile_mid,
|
||||
&item_hit_wrapper,
|
||||
results, item_hit_cnt,
|
||||
thread_id);
|
||||
assert(mid->is_last_scan < 2);
|
||||
if (mid->is_last_scan == 1) {
|
||||
mid->is_last_scan = 2;
|
||||
}
|
||||
struct table_runtime *g2g_rt = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->g2g_table_id);
|
||||
int top_group_ids[MAX_SCANNER_HIT_GROUP_NUM] = {-1};
|
||||
int n_top_group_ids = group2group_runtime_get_top_groups(g2g_rt, group_result, group_hit_cnt, top_group_ids);
|
||||
size_t n_all_group_ids = 0;
|
||||
if (n_top_group_ids > 0) {
|
||||
n_all_group_ids = group_hit_cnt + n_top_group_ids;
|
||||
} else {
|
||||
n_all_group_ids = group_hit_cnt;
|
||||
}
|
||||
maat_runtime_ref_dec(maat_rt, thread_id);
|
||||
|
||||
int all_group_ids[n_all_group_ids] = {-1};
|
||||
// maat state find compile_table_id, if not found, maat_instance->default_compile_table_id
|
||||
struct table_runtime *compile_table_rt = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->default_compile_table_id);
|
||||
int n_compile_ids = compile_runtime_match(compile_table_rt, all_group_ids, n_all_group_ids, results, n_result, mid);
|
||||
*n_hit_result = n_compile_ids;
|
||||
|
||||
if (compile_ret == 0 && item_hit_cnt > 0) {
|
||||
return -2;
|
||||
}
|
||||
*n_result = compile_ret;
|
||||
return compile_ret;
|
||||
if (n_compile_ids > 0) {
|
||||
return MAAT_HIT;
|
||||
} else {
|
||||
return MAAT_HALF_HIT;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int maat_scan_ipv6(struct maat *instance, int table_id, int thread_id,
|
||||
uint8_t *ip_addr, int *results, size_t n_result,
|
||||
size_t *n_hit_result, struct maat_state **state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int maat_scan_string(struct maat *maat_instance, int table_id, int thread_id,
|
||||
const char *data, size_t data_len, int results[], size_t *n_result,
|
||||
struct maat_state **state)
|
||||
const char *data, size_t data_len, int *results, size_t n_result,
|
||||
size_t *n_hit_result, struct maat_state **state)
|
||||
{
|
||||
if ((NULL == maat_instance) || (table_id < 0) || (table_id >= MAX_TABLE_NUM) ||
|
||||
(thread_id < 0) || (NULL == data) || (0 == data_len) || (NULL == results) ||
|
||||
(NULL == n_result) || (NULL == state)) {
|
||||
return -1;
|
||||
(0 == n_result) || (NULL == state)) {
|
||||
return MAAT_ERR;
|
||||
}
|
||||
|
||||
struct table_runtime_manager *table_rt_mgr = maat_instance->maat_rt->table_rt_mgr;
|
||||
struct table_runtime *table_rt = table_runtime_get(table_rt_mgr, table_id);
|
||||
struct maat_state *mid = NULL;
|
||||
mid = grab_state(state, maat_instance, thread_id);
|
||||
scan_count_inc(mid);
|
||||
|
||||
int virtual_table_id = 0;
|
||||
struct table_schema *table_schema = table_schema_get_by_scan_type(maat_instance->table_schema_mgr, table_id,
|
||||
SCAN_TYPE_STRING, &virtual_table_id);
|
||||
if (NULL == table_schema) {
|
||||
return MAAT_ERR;
|
||||
}
|
||||
|
||||
struct table_runtime *table_rt = table_manager_get_runtime(maat_instance->tbl_mgr, table_id);
|
||||
|
||||
return table_runtime_scan_string(table_rt, thread_id, data, data_len, results, n_result);
|
||||
int group_ids[MAX_SCANNER_HIT_GROUP_NUM] = {-1};
|
||||
int group_hit_cnt = table_runtime_scan_string(table_rt, thread_id, data, data_len, group_ids, MAX_SCANNER_HIT_GROUP_NUM,
|
||||
virtual_table_id, mid);
|
||||
if (group_hit_cnt <= 0) {
|
||||
return MAAT_OK;
|
||||
}
|
||||
|
||||
// come here means group_hit_cnt > 0, at least MAAT_HALF_HIT, or MAAT_HIT
|
||||
|
||||
struct table_runtime *g2g_rt = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->g2g_table_id);
|
||||
int top_group_ids[MAX_SCANNER_HIT_GROUP_NUM] = {-1};
|
||||
int n_top_group_ids = group2group_runtime_get_top_groups(g2g_rt, group_ids, group_hit_cnt, top_group_ids);
|
||||
size_t n_all_group_ids = 0;
|
||||
if (n_top_group_ids > 0) {
|
||||
n_all_group_ids = group_hit_cnt + n_top_group_ids;
|
||||
} else {
|
||||
n_all_group_ids = group_hit_cnt;
|
||||
}
|
||||
|
||||
int all_group_ids[n_all_group_ids] = {-1};
|
||||
int i = 0, j = 0, k = 0;
|
||||
for (i = 0; i < group_hit_cnt; i++) {
|
||||
all_group_ids[i] = group_ids[i];
|
||||
}
|
||||
for (j = i; j < n_all_group_ids; j++, k++) {
|
||||
all_group_ids[j] = top_group_ids[k];
|
||||
}
|
||||
|
||||
// maat state find compile_table_id, if not found, maat_instance->default_compile_table_id
|
||||
struct table_runtime *compile_table_rt = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->default_compile_table_id);
|
||||
int n_compile_ids = compile_runtime_match(compile_table_rt, all_group_ids, n_all_group_ids, results, n_result, mid);
|
||||
|
||||
*n_hit_result = n_compile_ids;
|
||||
|
||||
if (n_compile_ids > 0) {
|
||||
return MAAT_HIT;
|
||||
} else {
|
||||
return MAAT_HALF_HIT;
|
||||
}
|
||||
}
|
||||
|
||||
struct maat_stream *maat_scan_stream_open(struct maat *instance, int table_id, int thread_id)
|
||||
@@ -831,25 +845,112 @@ void maat_scan_stream_close(struct maat_stream **stream)
|
||||
|
||||
}
|
||||
|
||||
int maat_state_set(struct maat *instance, struct maat_state **mid, enum maat_scan_opt opt,
|
||||
const void *value, int size)
|
||||
int maat_state_set_scan_district(struct maat *maat_instance, struct maat_state **state, const char *district, size_t district_len)
|
||||
{
|
||||
if (NULL == maat_instance->maat_rt || NULL == district || district_len <= 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct maat_state *mid = grab_state(state, maat_instance, -1);
|
||||
int map_ret = maat_kv_read_unNull(maat_instance->maat_rt->district_map, district, district_len, &(mid->district_id));
|
||||
if (map_ret < 0) {
|
||||
mid->district_id = DISTRICT_UNKNOWN;
|
||||
}
|
||||
|
||||
mid->is_set_district = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//return >=0 if success, return -1 when failed;
|
||||
int maat_state_get(struct maat *instance, struct maat_state **mid, enum maat_scan_opt opt,
|
||||
void *value, int size)
|
||||
int maat_state_set_last_scan(struct maat *maat_instance, struct maat_state **state)
|
||||
{
|
||||
if (NULL == maat_instance->maat_rt) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct maat_state *mid = grab_state(state, maat_instance, -1);
|
||||
assert(mid->is_last_scan == 0);
|
||||
mid->is_last_scan = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int maat_state_set_scan_compile_table(struct maat *maat_instance, struct maat_state **state, int compile_table_id)
|
||||
{
|
||||
if (NULL == maat_instance->maat_rt) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct maat_state *mid = grab_state(state, maat_instance, -1);
|
||||
mid->compile_table_id = compile_table_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t maat_get_hit_paths(struct maat *maat_instance, struct maat_state *mid, struct maat_hit_path *paths, size_t n_path)
|
||||
{
|
||||
int compile_table_id = -1;
|
||||
|
||||
if (mid->compile_table_id == -1) {
|
||||
compile_table_id = maat_instance->default_compile_table_id;
|
||||
} else {
|
||||
compile_table_id = mid->compile_table_id;
|
||||
}
|
||||
|
||||
compile_runtime_get_hit_paths(maat_instance->maat_rt->table_rt_mgr, compile_table_id, maat_instance->g2g_table_id, mid, paths, n_path);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t maat_get_hit_objects(struct maat_compile_state *compile_state, struct maat_hit_object *objs, size_t n_objs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int maat_state_get_hit_paths(struct maat *maat_instance, struct maat_state **state, struct maat_hit_path *paths, size_t n_path)
|
||||
{
|
||||
struct maat_state *mid = NULL;
|
||||
struct maat_hit_path *paths;
|
||||
|
||||
mid = grab_state(state, maat_instance, 0);
|
||||
if (NULL == mid->compile_mid || NULL == maat_instance->maat_rt) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int n_read = maat_get_hit_paths(mid->maat_instance, mid, paths, n_path);
|
||||
|
||||
return n_read;
|
||||
}
|
||||
|
||||
int maat_state_get_hit_objects(struct maat *instance, struct maat_state **state, struct maat_hit_object *objs, size_t n_obj)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void maat_state_free(struct maat_state **state)
|
||||
{
|
||||
struct maat_state *mid = NULL;
|
||||
if (NULL == *state) {
|
||||
return;
|
||||
}
|
||||
|
||||
mid = *state;
|
||||
if (mid->thread_id >= 0) {
|
||||
alignment_int64_array_add(mid->maat_instance->outer_mid_cnt, mid->thread_id, -1);
|
||||
}
|
||||
|
||||
if (mid->compile_mid != NULL) {
|
||||
maat_compile_state_free(mid->compile_mid);
|
||||
mid->compile_mid = NULL;
|
||||
alignment_int64_array_add(mid->maat_instance->compile_mid_cnt, mid->thread_id, -1);
|
||||
}
|
||||
|
||||
mid->maat_instance = NULL;
|
||||
free(mid);
|
||||
*state = NULL;
|
||||
}
|
||||
|
||||
int maat_matched_compile_id(struct maat *instance, struct maat_matched *matched)
|
||||
int maat_hit_object_compile_id(struct maat *instance, struct maat_hit_object *obj)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user