summaryrefslogtreecommitdiff
path: root/src/mctrl.cpp
diff options
context:
space:
mode:
authorjixinyi <[email protected]>2019-01-21 16:12:13 +0800
committerjixinyi <[email protected]>2019-01-21 16:12:13 +0800
commit88f7a17eb08c2494ba1b239291918449b842abc7 (patch)
tree907770762efa476bbf52fa98332750fa4896efba /src/mctrl.cpp
parent2e83f0db5a94ba44cbbcd9d41863215934a738c0 (diff)
调用maat新接口,完善说明文档
Diffstat (limited to 'src/mctrl.cpp')
-rw-r--r--src/mctrl.cpp138
1 files changed, 92 insertions, 46 deletions
diff --git a/src/mctrl.cpp b/src/mctrl.cpp
index 4f347ac..e29ca5c 100644
--- a/src/mctrl.cpp
+++ b/src/mctrl.cpp
@@ -29,7 +29,7 @@ int set_ir_line(Maat_feather_t feather,const char *ir_table_name,const char *tab
char m_table_line[HTABLE_DATA_LEN];
struct IR_MCTRL_INFO mctrl_info;
memset(&mctrl_info,0,sizeof(mctrl_info));
- memset(&line_rule, 0,sizeof(line_rule));
+ memset(&line_rule,0,sizeof(line_rule));
line_rule.label_id=0;
line_rule.rule_id=rule_id;
@@ -63,15 +63,15 @@ int set_ir_line(Maat_feather_t feather,const char *ir_table_name,const char *tab
ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_ADD);
- MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"set_line", "set_table_name:%s set_table_line:%s",ir_table_name,m_table_line);
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"set_line", "%s,set_table_line:%s",ir_table_name,m_table_line);
if(ret==-1)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"set_line","%s:set rule_id:%d redis line error",ir_table_name,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"set_line","%s:set rule_id:%d,set redis line error",ir_table_name,rule_id);
}
else
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"set_line","%s:set rule_id:%d redis line success",ir_table_name,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"set_line","%s:set rule_id:%d,set redis line success",ir_table_name,rule_id);
}
return ret;
}
@@ -102,15 +102,15 @@ int del_ir_line(Maat_feather_t feather,const char *ir_table_name,const char *tab
ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_DEL);
}
- MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"del_line", "del_table_name:%s del_rule_id is:%d table_line:%s",ir_table_name,rule_id,table_line);
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"del_line", "del_table_name:%s,del rule_id:%d,table_line:%s",ir_table_name,rule_id,table_line);
if(ret==-1)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"del_line","%s:del rule_id is %d redis line error",ir_table_name,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"del_line","%s:del rule_id:%d,redis line error",ir_table_name,rule_id);
}
else
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"del_line","%s:del rule_id is %d redis line success",ir_table_name,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"del_line","%s:del rule_id:%d,redis line success",ir_table_name,rule_id);
}
return ret;
@@ -192,6 +192,36 @@ void htable_data_free(void *data)
return;
}
+void table_id_change_name(int table_id,char **table_name)
+{
+ switch(table_id)
+ {
+ case STATIC_NOMINEE_ID:
+ *table_name=(char*)STATIC_NOMINEE_TABLE_NAME;
+ break;
+ case DYNAMIC_NOMINEE_ID:
+ *table_name=(char*)DYNAMIC_NOMINEE_TABLE_NAME;
+ break;
+ case DNAT_POLICY_ID:
+ *table_name=(char*)DNAT_POLICY_TABLE_NAME;
+ break;
+ case NOMINEE_ID:
+ *table_name=(char*)NOMINEE_TABLE_NAME;
+ break;
+ case INTERCEPT_ID:
+ *table_name=(char*)INTERCEPT_TABLE_NAME;
+ break;
+ case CANDIDATE_ID:
+ *table_name=(char*)CANDIDATE_TABLE_NAME;
+ break;
+ default:
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"table_id_change_name","table_id error!!");
+ break;
+ }
+ return;
+}
+
+
void static_dynamic_dpolicy_table_new_cb(int table_id, const char* key, const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp)
{
struct IR_MCTRL_INFO mctrl_info;
@@ -201,58 +231,53 @@ void static_dynamic_dpolicy_table_new_cb(int table_id, const char* key, const ch
int *add_data=NULL;
int add_ret=0;
long cb_ret=0;
-
+ char *table_name=NULL;
+ memcpy(mctrl_info.effective_range,"{}",sizeof("{}"));
+ memcpy(mctrl_info.mask_src_ip,"255.255.255.255",sizeof("255.255.255.255"));
+ memcpy(mctrl_info.mask_dst_ip,"255.255.255.255",sizeof("255.255.255.255"));
+ memcpy(mctrl_info.mask_src_port,"65535",sizeof("65535"));
+ memcpy(mctrl_info.mask_dst_port,"65535",sizeof("65535"));
+ mctrl_info.service=832;
+
switch(table_id)
{
case DYNAMIC_NOMINEE_ID:
mctrl_info.addr_pool_id=0;
memcpy(mctrl_info.src_port,"0",sizeof("0"));
- memcpy(mctrl_info.mask_src_ip,"0.0.0.0",sizeof("0.0.0.0"));
- memcpy(mctrl_info.mask_src_port,"0",sizeof("0"));
memcpy(mctrl_info.dst_ip,"0.0.0.0",sizeof("0.0.0.0"));
- memcpy(mctrl_info.mask_dst_ip,"0.0.0.0",sizeof("0.0.0.0"));
memcpy(mctrl_info.dst_port,"0",sizeof("0"));
- memcpy(mctrl_info.mask_dst_port,"0",sizeof("0"));
- memcpy(mctrl_info.effective_range,"{}",sizeof("{}"));
mctrl_info.action=96;
- mctrl_info.service=832;
mctrl_info.htable_flag=DYNAMIC_NOMINEE_FLAG;
sscanf(table_line,"%d\t%d\t%d\t%s\t%*s\t%d\t%s\t%*d\t%d\t%d\t%*d\t%*s\t%*s",
&mctrl_info.region_id,&mctrl_info.addr_type,&mctrl_info.procotol,mctrl_info.src_ip,
&mctrl_info.direction,mctrl_info.user_region,&mctrl_info.is_valid,&mctrl_info.service);
mctrl_info.region_id=(mctrl_info.region_id%SNAT_DYNAMIC_NUMBER)+SNAT_DYNAMIC_NUMBER;
mctrl_info.group_id=mctrl_info.region_id;
+ table_name=(char*)DYNAMIC_NOMINEE_TABLE_NAME;
break;
case STATIC_NOMINEE_ID:
memcpy(mctrl_info.user_region,"0",sizeof("0"));
- memcpy(mctrl_info.effective_range,"{}",sizeof("{}"));
- mctrl_info.service=832;
mctrl_info.htable_flag=STATIC_NOMINEE_FLAG;
- sscanf(table_line,"%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%*d\t%*s\t%*s",
- &mctrl_info.region_id,&mctrl_info.group_id,&mctrl_info.addr_type,
- mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip,
- mctrl_info.dst_port,mctrl_info.mask_dst_port,&mctrl_info.procotol,&mctrl_info.direction,&mctrl_info.addr_pool_id,&mctrl_info.is_valid,
- &mctrl_info.action);
+ sscanf(table_line,"%d\t%d\t%d\t%s\t%*s\t%s\t%*s\t%s\t%*s\t%s\t%*s\t%d\t%d\t%d\t%d\t%d\t%*d\t%*s\t%*s",
+ &mctrl_info.region_id,&mctrl_info.group_id,&mctrl_info.addr_type,mctrl_info.src_ip,mctrl_info.src_port,
+ mctrl_info.dst_ip,mctrl_info.dst_port,&mctrl_info.procotol,&mctrl_info.direction,
+ &mctrl_info.addr_pool_id,&mctrl_info.is_valid,&mctrl_info.action);
mctrl_info.region_id=(mctrl_info.region_id%DNAT_NUMBER)+DNAT_NUMBER;
+ table_name=(char*)STATIC_NOMINEE_TABLE_NAME;
break;
case DNAT_POLICY_ID:
memcpy(mctrl_info.src_ip,"0.0.0.0",sizeof("0.0.0.0"));
memcpy(mctrl_info.src_port,"0",sizeof("0"));
- memcpy(mctrl_info.mask_src_ip,"0.0.0.0",sizeof("0.0.0.0"));
- memcpy(mctrl_info.mask_src_port,"0",sizeof("0"));
- memcpy(mctrl_info.mask_dst_ip,"0.0.0.0",sizeof("0.0.0.0"));
- memcpy(mctrl_info.mask_dst_port,"0",sizeof("0"));
memcpy(mctrl_info.user_region,"0",sizeof("0"));
- memcpy(mctrl_info.effective_range,"{}",sizeof("{}"));
- mctrl_info.direction=0;
+ mctrl_info.direction=0;
mctrl_info.action=96;
- mctrl_info.service=832;
mctrl_info.htable_flag=DNAT_POLICY_FLAG;
sscanf(table_line,"%d\t%d\t%s\t%s\t%d\t%*s\t%*s\t%*s\t%d\t%*d\t%*d\t%d\t%*s\t%*s",
&mctrl_info.region_id,&mctrl_info.addr_type,mctrl_info.dst_ip,mctrl_info.dst_port,&mctrl_info.procotol,
&mctrl_info.do_log,&mctrl_info.is_valid);
mctrl_info.group_id=mctrl_info.region_id;
mctrl_info.region_id=mctrl_info.region_id%DNAT_NUMBER;
+ table_name=(char*)DNAT_POLICY_TABLE_NAME;
break;
default:
MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","read_snat_or_dnat table flag error!!table_id:%d",table_id);
@@ -279,18 +304,18 @@ void static_dynamic_dpolicy_table_new_cb(int table_id, const char* key, const ch
if(add_ret<0)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable error:%d,table_id:%d,rule_id:%d",add_ret,table_id,mctrl_info.region_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable error:%d,table_name:%s,rule_id:%d",add_ret,table_name,mctrl_info.region_id);
assert(0);
}
else
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable succeed:%d,table_id:%d,rule_id:%d",add_ret,table_id,mctrl_info.region_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable succeed:%d,table_name:%s,rule_id:%d",add_ret,table_name,mctrl_info.region_id);
}
set_ir_redis_info(cb_ret,htable_data,mctrl_info.region_id);
add_data=(int*)calloc(sizeof(int),1);
if(add_data==NULL)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","malloc add_data error!!table_id:%d,rule_id:%d",table_id,mctrl_info.region_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","malloc add_data error!!table_name:%s,rule_id:%d",table_name,mctrl_info.region_id);
exit(1);
}
*add_data=mctrl_info.region_id;
@@ -298,7 +323,7 @@ void static_dynamic_dpolicy_table_new_cb(int table_id, const char* key, const ch
}
else
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_new_cb","htable_info exit!table_id:%d rule_id:%d",table_id,mctrl_info.region_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_new_cb","htable_info exit!table_name:%s rule_id:%d",table_name,mctrl_info.region_id);
}
return;
@@ -308,20 +333,24 @@ void static_dynamic_dpolicy_table_free_cb(int table_id, MAAT_PLUGIN_EX_DATA* ad,
void* search_result=NULL;
int del_ret=0;
long cb_ret=0;
+ char *table_name=NULL;
+
+ table_id_change_name(table_id,&table_name);
+
search_result=MESA_htable_search_cb(mctrl_g.mctrl_htable_handle,(unsigned char*)*ad,sizeof(int),free_update_search_htable_cb,NULL,&cb_ret);
if(search_result==NULL)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_free_cb", "already del!!!table_id:%d",table_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_free_cb", "already del!!!table_name:%s",table_name);
}
else
{
- MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_free_cb", "del data,table_id:%d,rule_id:%d",table_id,*(int*)*ad);
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_free_cb", "del data,table_name:%s,rule_id:%d",table_name,*(int*)*ad);
del_ret=MESA_htable_del(mctrl_g.mctrl_htable_handle,(unsigned char*)*ad,sizeof(int),htable_data_free);
if(del_ret<0)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_free_cb","del htable error:%d,table_id:%d,rule_id:%d",del_ret,table_id,*(int*)*ad);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_free_cb","del htable error:%d,table_name:%s,rule_id:%d",del_ret,table_name,*(int*)*ad);
assert(0);
}
}
@@ -341,6 +370,7 @@ long nominee_intercept_candidate_search_htable_cb(void *data, const uchar *key,
struct IR_MCTRL_INFO mctrl_info;
memset(&mctrl_info,0,sizeof(mctrl_info));
char *htable_data=(char*)data;
+ char *table_name=NULL;
if(htable_data==NULL)
{
@@ -360,21 +390,24 @@ long nominee_intercept_candidate_search_htable_cb(void *data, const uchar *key,
{
htable_flag+=INTERCEPT_FLAG;
}
+ table_name=(char*)INTERCEPT_TABLE_NAME;
break;
case NOMINEE_FLAG:
if(!(htable_flag & NOMINEE_FLAG))
{
htable_flag+=NOMINEE_FLAG;
}
+ table_name=(char*)NOMINEE_TABLE_NAME;
break;
case CANDIDATE_FLAG:
if(!(htable_flag & CANDIDATE_FLAG))
{
htable_flag+=CANDIDATE_FLAG;
}
+ table_name=(char*)CANDIDATE_TABLE_NAME;
break;
default:
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"nominee_intercept_candidate_search_htable_cb","read nom_intercept_candidate_table error!!!table_flag:%d",*(int*)user_arg);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"nominee_intercept_candidate_search_htable_cb","read nom_intercept_candidate_table error!!!table_name:%s",table_name);
assert(0);
break;
}
@@ -385,7 +418,7 @@ long nominee_intercept_candidate_search_htable_cb(void *data, const uchar *key,
mctrl_info.dst_port,mctrl_info.mask_dst_port,mctrl_info.procotol,mctrl_info.direction,mctrl_info.addr_pool_id,mctrl_info.is_valid,
mctrl_info.action,mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time);
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_search_htable_cb","table_flag:%d ,Data rule_id:%d htable_flag:%d",*(int*)user_arg,mctrl_info.region_id, htable_flag);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_search_htable_cb","table_name:%s ,Data rule_id:%d htable_flag:%d",table_name,mctrl_info.region_id, htable_flag);
return htable_flag;
}
@@ -396,6 +429,9 @@ void nominee_intercept_candidate_table_new_cb(int table_id, const char* key, con
void* search_htable_result=NULL;
int rule_id=0;
int *add_data=NULL;
+ char *table_name=NULL;
+ table_id_change_name(table_id,&table_name);
+
sscanf(table_line,"%d\t",&rule_id);
if(*(int*)argp==NOMINEE_FLAG&&rule_id<DNAT_NUMBER)
@@ -409,19 +445,19 @@ void nominee_intercept_candidate_table_new_cb(int table_id, const char* key, con
if(search_htable_result==NULL)
{
del_ir_redis_info(*(int*)argp,table_line,rule_id);
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_table_new_cb","table_id:%d,rule_id:%d htable data not exist,del it!",table_id,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_table_new_cb","table_name:%s,rule_id:%d htable data not exist,del it!",table_name,rule_id);
}
else
{
add_data=(int*)calloc(sizeof(int),1);
if(add_data==NULL)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"nominee_intercept_candidate_table_new_cb","table_id:%d,rule_id:%d,malloc add_data error!!",table_id,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"nominee_intercept_candidate_table_new_cb","table_name:%s,rule_id:%d,malloc add_data error!!",table_name,rule_id);
exit(1);
}
*add_data=rule_id;
*ad=add_data;
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_table_new_cb","htable data exist!table_id:%d,rule_id:%d",table_id,rule_id);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_table_new_cb","htable data exist!table_name:%s,rule_id:%d",table_name,rule_id);
}
return;
@@ -430,7 +466,9 @@ void nominee_intercept_candidate_table_free_cb(int table_id, MAAT_PLUGIN_EX_DATA
{
if(*ad!=NULL)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"nominee_intercept_candidate_table_free_cb"," del table_id:%d,rule_id:%d, del succeed",table_id,*(int*)*ad);
+ char *table_name=NULL;
+ table_id_change_name(table_id,&table_name);
+ MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"nominee_intercept_candidate_table_free_cb"," del table_name:%s,rule_id:%d, del succeed",table_name,*(int*)*ad);
free(*ad);
}
@@ -479,10 +517,10 @@ void Maat_init()
{
// load conf
const char *section = "Mctrl";
- const char *section_d = "Mctrl_D";
- const char *section_s = "Mctrl_S";
- const char *section_i = "Mctrl_I";
- const char *section_n = "Mctrl_N";
+ const char *section_d = "Mctrl_DYNAMIC";
+ const char *section_s = "Mctrl_STATIC";
+ const char *section_i = "Mctrl_INTERCEPT";
+ const char *section_n = "Mctrl_NOMINEE";
char table_info_path[MAX_PATH_LEN];
char logger_path[MAX_PATH_LEN];
int max_thread_num=0;
@@ -589,7 +627,7 @@ int htable_init()
if(0 == htable_ret)
{
- MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"htable init","htable mature succ");
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL,(char*)"htable init","htable mature succeed");
return 0;
}
else
@@ -629,6 +667,10 @@ int main(int argc, char * argv [ ])
MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL,(char*)"main","static_dynamic_dpolicy Database table register failed\n");
assert(0);
}
+ else
+ {
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL,(char*)"main","static_dynamic_dpolicy Database table register succeed\n");
+ }
register_plugin_ex_table(mctrl_g.s_feather,static_id,static_dynamic_dpolicy_table_new_cb,static_dynamic_dpolicy_table_free_cb,plugin_EX_dup_cb,NULL,0,&static_flag);
register_plugin_ex_table(mctrl_g.d_feather,dynamic_id,static_dynamic_dpolicy_table_new_cb,static_dynamic_dpolicy_table_free_cb,plugin_EX_dup_cb,NULL,0,&dynamic_flag);
@@ -643,6 +685,10 @@ int main(int argc, char * argv [ ])
MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL,(char*)"main","nominee_intercept_candidate Database table register failed\n");
assert(0);
}
+ else
+ {
+ MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL,(char*)"main","nominee_intercept_candidate Database table register succeed\n");
+ }
register_plugin_ex_table(mctrl_g.i_feather,intercept_id,nominee_intercept_candidate_table_new_cb,nominee_intercept_candidate_table_free_cb,plugin_EX_dup_cb,NULL,0,&intercept_flag);
register_plugin_ex_table(mctrl_g.n_feather,nominee_id,nominee_intercept_candidate_table_new_cb,nominee_intercept_candidate_table_free_cb,plugin_EX_dup_cb,NULL,0,&nominee_flag);