#include #include #include "mrl_io.h" #include "mrl_redis.h" #include "mrl_stat.h" extern struct mrl_global_instance mrl_instance; extern struct global_stat_t global_stat; bool mrl_construct_ir_vxlan_info(struct streaminfo *mystream, int cfg_id,const char* back_ip, int back_type); long ht_dnat_nominee_search_cb(void *data, const uchar *key, uint size, void *user_arg) { struct mrl_nominee* dnat_nominee = (struct mrl_nominee* )data; struct mrl_nominee_key* nominee_key = (struct mrl_nominee_key*)key; int* operation = (int*)user_arg; if(dnat_nominee != NULL) { switch(*operation) { case MRL_ADD_DNAT_NOMINEE: dnat_nominee->nominee_count ++; break; case MRL_DEL_DNAT_NOMINEE: dnat_nominee->nominee_count --; break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"ht_dnat_nominee_search_cb","cur dnat_nominee_search operation is %d",*operation); assert(0); } MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"ht_dnat_nominee_search_cb","get nominee value:" "[config_id:%d,addr_pool_id:%d,addr_type:%d,ip_addr:%s,is_valid:%d,effective_range:%s,op_time:%s,nominee_count:%d]", dnat_nominee->config_id, dnat_nominee->addr_pool_id,dnat_nominee->addr_type, dnat_nominee->ip_addr, dnat_nominee->is_valid,dnat_nominee->effective_range,dnat_nominee->op_time,dnat_nominee->nominee_count); return dnat_nominee->nominee_count; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"ht_dnat_nominee_search_cb","cur nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] is NULL!", nominee_key->sip,nominee_key->sport,nominee_key->dip,nominee_key->dport); return -1; } } void wrapped_Maat_set_feather_opt(Maat_feather_t feather, enum MAAT_INIT_OPT type, const void* value, int size) { int ret = Maat_set_feather_opt(feather, type, value, size); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"wrapped_Maat_set_feather_opt","Maat_set_feather_opt func error!"); assert(0); } } int Maat_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_callback_t *start,Maat_update_callback_t *update,Maat_finish_callback_t *finish, void *u_para) { int table_id=0,ret=0; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_plugin_table","Maat_table_register func error,feather is %d and table name is %s!",feather,table_name); assert(0); } else { ret=Maat_table_callback_register(feather, table_id, start, update,finish,u_para); if(ret<0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_plugin_table","Maat_table_callback_register func error,ret is %d!",ret); assert(0); } } return ret; } bool Maat_set_snat_candidate(Maat_feather_t feather, struct mrl_snat_candidate* sant_candidate) { struct Maat_line_t line_rule; char table_line[512]; int ret=0; memset(&line_rule,0,sizeof(line_rule)); memset(&table_line,0,sizeof(table_line)); line_rule.label_id=0; line_rule.rule_id=sant_candidate->config_id; line_rule.table_name=IR_CANDIDATE_IP_TABLE_NAME; snprintf(table_line,sizeof(table_line),"%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s", sant_candidate->config_id, sant_candidate->addr_pool_id,sant_candidate->addr_type, sant_candidate->ip_addr,sant_candidate->location,sant_candidate->is_valid, sant_candidate->effective_range, sant_candidate->op_time); line_rule.table_line=table_line; line_rule.expire_after=0; ret=Maat_cmd_set_line(feather, (const struct Maat_line_t*)&line_rule, MAAT_OP_ADD); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_candidate_line","Maat fail to set the IR_CANDIDATE_IP item:" "[config_id:%d,addr_pool_id:%d,addr_type:%d,ip_addr:%s,location:%d,is_valid:%d,effective_range:%s,op_time:%s], ret is %d", sant_candidate->config_id, sant_candidate->addr_pool_id,sant_candidate->addr_type, sant_candidate->ip_addr, sant_candidate->location,sant_candidate->is_valid,sant_candidate->effective_range,sant_candidate->op_time, ret); return false; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_candidate_line","Maat succeed to set the IR_CANDIDATE_IP item:" "[config_id:%d,addr_pool_id:%d,addr_type:%d,ip_addr:%s,location:%d,is_valid:%d,effective_range:%s,op_time:%s]", sant_candidate->config_id, sant_candidate->addr_pool_id,sant_candidate->addr_type, sant_candidate->ip_addr, sant_candidate->location,sant_candidate->is_valid,sant_candidate->effective_range,sant_candidate->op_time); return true; } } bool Maat_set_dnat_candidate(Maat_feather_t feather, struct mrl_dnat_candidate* dnat_candidate) { struct Maat_line_t line_rule; char table_line[512]; int ret=0; memset(&line_rule,0,sizeof(line_rule)); memset(&table_line,0,sizeof(table_line)); line_rule.label_id=0; line_rule.rule_id=dnat_candidate->config_id; line_rule.table_name=IR_DNAT_CANDIDATE_IP_TABLE_NAME; snprintf(table_line,sizeof(table_line),"%d\t%s\t%d\t%d\t%d\t%s\t%s", dnat_candidate->config_id,dnat_candidate->ip_addr,dnat_candidate->addr_type, dnat_candidate->location,dnat_candidate->is_valid, dnat_candidate->effective_range, dnat_candidate->op_time); line_rule.table_line=table_line; line_rule.expire_after=0; ret=Maat_cmd_set_line(feather, (const struct Maat_line_t*)&line_rule, MAAT_OP_ADD); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_dnat_candidate","Maat fail to set the IR_DNAT_CANDIDATE_IP item:" "[config_id:%d,addr_type:%d,ip_addr:%s,location:%d,is_valid:%d,effective_range:%s,op_time:%s], ret is %d", dnat_candidate->config_id, dnat_candidate->addr_type, dnat_candidate->ip_addr, dnat_candidate->location,dnat_candidate->is_valid,dnat_candidate->effective_range,dnat_candidate->op_time, ret); return false; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_dnat_candidate","Maat succeed to set the IR_DNAT_CANDIDATE_IP item:" "[config_id:%d,addr_type:%d,ip_addr:%s,location:%d,is_valid:%d,effective_range:%s,op_time:%s], ret is %d", dnat_candidate->config_id, dnat_candidate->addr_type, dnat_candidate->ip_addr, dnat_candidate->location,dnat_candidate->is_valid,dnat_candidate->effective_range,dnat_candidate->op_time, ret); return true; } } void Maat_set_vxlan_info(Maat_feather_t feather, struct mrl_vxlan_info *vxlan_info) { struct Maat_line_t line_rule; char table_line[512]; int ret=0; memset(&line_rule,0,sizeof(line_rule)); memset(&table_line,0,sizeof(table_line)); line_rule.label_id=0; line_rule.rule_id=vxlan_info->config_id; line_rule.table_name=IR_VXLAN_INFO_TABLE_NAME; snprintf(table_line,sizeof(table_line),"%d\t%s\t%d\t%lu\t%d\t%s\t%s", vxlan_info->config_id, vxlan_info->back_ip, vxlan_info->back_type, vxlan_info->link_identity, vxlan_info->is_valid, vxlan_info->effective_range, vxlan_info->op_time); line_rule.table_line=table_line; line_rule.expire_after=0; ret=Maat_cmd_set_line(feather,(const struct Maat_line_t* )&line_rule, MAAT_OP_ADD); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_set_vxlan_info_line","Maat fail to set the IR_VXLAN_INFO item:" "[config_id:%d,back_ip:%s,back_type:%d,link_identity:%lu,is_vaild:%d,effective_range:%s,op_time:%s], ret is %d", vxlan_info->config_id, vxlan_info->back_ip, vxlan_info->back_type, vxlan_info->link_identity, vxlan_info->is_valid, vxlan_info->effective_range, vxlan_info->op_time,ret); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_vxlan_info_line","Maat succeed to set the IR_VXLAN_INFO item:" "[config_id:%d,back_ip:%s,back_type:%d,link_identity:%lu,is_vaild:%d,effective_range:%s,op_time:%s]", vxlan_info->config_id, vxlan_info->back_ip, vxlan_info->back_type, vxlan_info->link_identity, vxlan_info->is_valid, vxlan_info->effective_range, vxlan_info->op_time); } return; } void Maat_set_mrl_ip(Maat_feather_t feather, struct mrl_mrl_ip* mrl_ip) { struct Maat_line_t line_rule; char table_line[512]; int ret=0; memset(&line_rule,0,sizeof(line_rule)); memset(&table_line,0,sizeof(table_line)); line_rule.label_id=0; line_rule.rule_id=mrl_ip->config_id; line_rule.table_name=IR_MRL_IP_INFO_TABLE_NAME; snprintf(table_line,sizeof(table_line),"%d\t%s\t%d\t%s\t%d\t%s\t%s", mrl_ip->config_id, mrl_ip->back_ip, mrl_ip->back_type, mrl_ip->mrl_ip, mrl_ip->is_valid, mrl_ip->effective_range, mrl_ip->op_time); line_rule.table_line=table_line; line_rule.expire_after=0; ret=Maat_cmd_set_line(feather, (const struct Maat_line_t* )&line_rule, MAAT_OP_ADD); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_set_mrl_ip_line","Maat fail to set IR_MRL_IP item:" "[config_id:%d,back_ip:%s,back_type:%d,mrl_ip:%s,is_vaild:%d,effective_range:%s,op_time:%s],ret is %d", mrl_ip->config_id, mrl_ip->back_ip, mrl_ip->back_type, mrl_ip->mrl_ip, mrl_ip->is_valid, mrl_ip->effective_range, mrl_ip->op_time,ret); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_mrl_ip_line","Maat succeed to set IR_MRL_IP item:" "[config_id:%d,back_ip:%s,back_type:%d,mrl_ip:%s,is_vaild:%d,effective_range:%s,op_time:%s]!", mrl_ip->config_id, mrl_ip->back_ip, mrl_ip->back_type, mrl_ip->mrl_ip, mrl_ip->is_valid, mrl_ip->effective_range, mrl_ip->op_time); } return; } bool Maat_del_line(Maat_feather_t feather, int rule_id, int expire_after,const char* table_name) { int ret=0; struct Maat_line_t line_rule; memset(&line_rule,0,sizeof(line_rule)); line_rule.label_id=0; line_rule.rule_id=rule_id; line_rule.table_name=table_name; line_rule.table_line = NULL; line_rule.expire_after=expire_after; ret=Maat_cmd_set_line(feather, (const struct Maat_line_t* )&line_rule, MAAT_OP_DEL); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_del_line","Maat fail to del %s item, the rule id is %d and the ret is %d",table_name,line_rule.rule_id,ret); return false; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_del_line","Maat succeed to del %s item, the rule id is %d !",table_name,rule_id); return true; } } /*del the vxlan_info_table and mrl_ip_info table*/ void Maat_del_back_info(const int cfg_id, const char *back_ip) { if(MESA_htable_search_cb(mrl_instance.ht_vxlan_info, (const unsigned char *)back_ip, MRL_STR_IP_LEN,NULL,NULL,NULL) != NULL) { if(Maat_del_line(mrl_instance.dynamic_feather, cfg_id,MRL_DEL_AFTER,IR_VXLAN_INFO_TABLE_NAME)) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle,RLOG_LV_DEBUG,"mrl_del_back_info","Maat succeed to del vlxan_info item [rule_id:%d,ip_addr:%s]",cfg_id,back_ip); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_del_back_info","Maat fail to del vlxan_info item[rule_id:%d,up_addr:%s]",cfg_id,back_ip); } if(Maat_del_line(mrl_instance.dynamic_feather,cfg_id,MRL_DEL_NOW,IR_MRL_IP_INFO_TABLE_NAME)) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_del_back_info","Maat succeed to del mrl_ip item[rule_id:%d,ip_addr: %s]",cfg_id,back_ip); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_del_back_info","Maat fail to del mrl_ip item %s",back_ip); } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_del_back_info","the vxlan_info key[back_ip:%s] is not exsit in ht_vxlan_info.",back_ip); } } void Maat_del_dnat_candidate(const char *candidate_ip,int rule_id) { if(MESA_htable_search_cb(mrl_instance.ht_dnat_candidate, (const unsigned char *)candidate_ip, MRL_STR_IP_LEN,NULL,NULL,NULL) != NULL) { if(Maat_del_line(mrl_instance.dynamic_feather, rule_id,MRL_DEL_AFTER,IR_DNAT_CANDIDATE_IP_TABLE_NAME)) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle,RLOG_LV_FATAL,"Maat_del_dnat_candidate","Maat succeed to del dnat_candidate item %s",candidate_ip); global_stat.vxlan_info_num--; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_del_dnat_candidate","Maat fail to del dnat_candidate item %s",candidate_ip); } } } void mrl_create_snat_candidate(struct mrl_snat_candidate* snat_candidate, struct mrl_nominee* snat_nominee) { snat_candidate->config_id = snat_nominee->config_id; snat_candidate->addr_pool_id= snat_nominee->addr_pool_id; snat_candidate->addr_type = MRL_IPV4_TYPE ; strncpy(snat_candidate->ip_addr,(const char*)snat_nominee->ip_addr,MRL_STR_IP_LEN); if(mrl_instance.mrl_cfg.ip_location_enable) { snat_candidate->location = mrl_is_outside_ip(snat_candidate->ip_addr); } else { snat_candidate->location = MRL_CLOSED_LOCATION; } snat_candidate->is_valid = 1; strncpy(snat_candidate->effective_range, (const char*)snat_nominee->effective_range, MRL_STR_EFFEC_RANGE_LEN); mrl_get_cur_time(snat_candidate->op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_snat_candidate","create snat candidate item:" "[config_id:%d,addr_pool_id:%d,ip_addr:%s,addr_type:%d,location:%d,is_valid:%d,effevtive_range:%s,op_time:%s]", snat_candidate->config_id,snat_candidate->addr_pool_id,snat_candidate->ip_addr,snat_candidate->addr_type, snat_candidate->location,snat_candidate->is_valid,snat_candidate->effective_range,snat_candidate->op_time); } void mrl_create_dnat_candidate(struct mrl_dnat_candidate* dnat_candidate, struct mrl_nominee* dnat_nominee) { dnat_candidate->config_id = dnat_nominee->config_id; strncpy(dnat_candidate->ip_addr, dnat_nominee->ip_addr, MRL_STR_IP_LEN); dnat_candidate->addr_type = dnat_nominee->addr_type; if(mrl_instance.mrl_cfg.ip_location_enable) { dnat_candidate->location = mrl_is_outside_ip(dnat_candidate->ip_addr); } else { dnat_candidate->location = MRL_CLOSED_LOCATION; } dnat_candidate->is_valid = 1; strncpy(dnat_candidate->effective_range, dnat_nominee->effective_range,MRL_STR_EFFEC_RANGE_LEN); mrl_get_cur_time(dnat_candidate->op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_dnat_candidate","create dnat_candidate item:" "[config_id:%d,ip_addr:%s,addr_type:%d,location:%d,is_valid:%d,effevtive_range:%s,op_time:%s]", dnat_candidate->config_id,dnat_candidate->ip_addr,dnat_candidate->addr_type,dnat_candidate->location, dnat_candidate->is_valid,dnat_candidate->effective_range,dnat_candidate->op_time); } void mrl_create_vxlan_info(struct mrl_vxlan_info *vxlan_info, int cfg_id, uint64_t link_identity, const char *back_ip, int back_type) { switch(back_type) { case MRL_SNAT_BACK_TYPE: vxlan_info->config_id = (cfg_id % MRL_CFG_ID_MOD)+ MRL_CFG_ID_MOD; break; case MRL_DNAT_BACK_TYPE: vxlan_info->config_id = cfg_id % MRL_CFG_ID_MOD; break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_vxlan_info_item","cur back_type is %d",back_type); break; } strncpy(vxlan_info->back_ip,(const char*)back_ip,MRL_STR_IP_LEN); vxlan_info->back_type = back_type; vxlan_info->link_identity = link_identity; vxlan_info->is_valid = 1; strncpy(vxlan_info->effective_range, DEFAULT_EFFECTIVE_RANGE,MRL_STR_EFFEC_RANGE_LEN); mrl_get_cur_time(vxlan_info->op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_vxlan_info_item","create vxlan_info item:" "[config_id:%d,back_ip:%s,back_type:%d,link_identity:%d,is_vaild:%d,effective_range:%s,op_time:%s]", vxlan_info->config_id, vxlan_info->back_ip, vxlan_info->back_type,vxlan_info->link_identity, vxlan_info->is_valid, vxlan_info->effective_range, vxlan_info->op_time); } void mrl_create_mrl_ip(struct mrl_mrl_ip *mrl_ip, int config_id, const char *back_ip, int back_type) { switch(back_type) { case MRL_SNAT_BACK_TYPE: mrl_ip->config_id = (config_id % MRL_CFG_ID_MOD)+ MRL_CFG_ID_MOD; break; case MRL_DNAT_BACK_TYPE: mrl_ip->config_id = config_id % MRL_CFG_ID_MOD; break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_mrl_ip_item","cur back_type is %d",back_type); break; } strncpy(mrl_ip->back_ip,(const char*)back_ip,MRL_STR_IP_LEN); mrl_ip->back_type = back_type; strncpy(mrl_ip->mrl_ip,(const char*)mrl_instance.mrl_cfg.mrl_ip, MRL_STR_IP_LEN); mrl_ip->is_valid = 1; strncpy(mrl_ip->effective_range, DEFAULT_EFFECTIVE_RANGE,MRL_STR_EFFEC_RANGE_LEN); mrl_get_cur_time(mrl_ip->op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_mrl_ip_item","create mrl_ip item:" "config_id:%d,back_ip:%s,back_type:%d,mrl_ip:%s,is_vaild:%d,effective_range:%s,op_time:%s", mrl_ip->config_id, mrl_ip->back_ip, mrl_ip->back_type,mrl_ip->mrl_ip, mrl_ip->is_valid, mrl_ip->effective_range, mrl_ip->op_time); } void mrl_build_dnat_nominee_item(struct mrl_nominee* dnat_nominee_item, struct mrl_dnat_policy* dnat_policy) { dnat_nominee_item->config_id = dnat_policy->config_id; dnat_nominee_item->addr_pool_id = 0; strncpy(dnat_nominee_item->ip_addr,dnat_policy->original_dest_ip,MRL_STR_IP_LEN); dnat_nominee_item->addr_type = dnat_policy->original_addr_type; dnat_nominee_item->is_valid = 1; strncpy(dnat_nominee_item->effective_range,dnat_policy->effective_range,MRL_STR_EFFEC_RANGE_LEN); mrl_get_cur_time(dnat_nominee_item->op_time); dnat_nominee_item->nominee_type=MRL_DNAT_NOMINEE_TYPE; dnat_nominee_item->nominee_count = 1; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_dnat_nominee","create dnat nominee item:" "[config_id:%d,addr_pool_id:%d,ip_addr:%s,addr_type:%d,effective_range:%s,op_time:%s],nominee_type:%d,nominee_count:%d", dnat_nominee_item->config_id,dnat_nominee_item->addr_pool_id,dnat_nominee_item->ip_addr,dnat_nominee_item->addr_type, dnat_nominee_item->effective_range,dnat_nominee_item->op_time,dnat_nominee_item->nominee_type,dnat_nominee_item->nominee_count); } void snat_nominee_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_start_cb","start to update IR_NOMINEE_IP, cur update type is %d", update_type); return; } void snat_nominee_update_cb(int table_id,const char *table_line,void *u_para) { int ret = 0; int is_outside = MRL_CLOSED_LOCATION; struct mrl_nominee snat_nominee; memset(&snat_nominee,0,sizeof(snat_nominee)); struct mrl_nominee *snat_nominee_item = NULL; sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%s\t%s", &(snat_nominee.config_id), &(snat_nominee.addr_pool_id), &(snat_nominee.addr_type), snat_nominee.ip_addr, &(snat_nominee.is_valid), snat_nominee.effective_range, snat_nominee.op_time); snat_nominee.nominee_type = MRL_SNAT_NOMINEE_TYPE; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","get IR_NOMINEE_IP item:" "[config_id:%d,addr_pool_id:%d,addr_type:%d,ip_addr:%s,is_valid:%d,effective_range:%s,op_time:%s],nominee_type:%d", snat_nominee.config_id, snat_nominee.addr_pool_id,snat_nominee.addr_type, snat_nominee.ip_addr, snat_nominee.is_valid,snat_nominee.effective_range,snat_nominee.op_time,snat_nominee.nominee_type); struct mrl_nominee_key nominee_key; memset(&nominee_key,0,sizeof(struct mrl_nominee_key)); strncpy(nominee_key.sip,(const char*)snat_nominee.ip_addr,MRL_STR_IP_LEN); if(mrl_instance.mrl_cfg.ip_location_enable) { is_outside = mrl_is_outside_ip(snat_nominee.ip_addr); switch(is_outside) { case MRL_INSIDE_LOCATION: case MRL_UNDEFINED_LOCATION: strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.outside_detect_ip,MRL_STR_IP_LEN); break; case MRL_OUTSIDE_LOCATION: strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.inside_detect_ip,MRL_STR_IP_LEN); break; default: assert(0); break; } } else { strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.outside_detect_ip,MRL_STR_IP_LEN); } nominee_key.sport=mrl_instance.mrl_cfg.local_port; nominee_key.dport=mrl_instance.mrl_cfg.detect_port; switch(snat_nominee.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_nominee,(const unsigned char*)&nominee_key,sizeof(struct mrl_nominee_key)); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.snat_nominee_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","ht_nominee succeed to del snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu].",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","the snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] is not exsit in ht_nominee.",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"snat_nominee_update_cb","ht_nominee fail to del snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu], ret is %d",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,ret); assert(0); } } break; case MRL_VALID: snat_nominee_item = (struct mrl_nominee *)calloc(1, sizeof(struct mrl_nominee)); global_stat.malloc_memory += sizeof(struct mrl_nominee); memcpy(snat_nominee_item,&snat_nominee,sizeof(struct mrl_nominee)); ret =mrl_htable_add(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key,sizeof(struct mrl_nominee_key),(const void* )snat_nominee_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.snat_nominee_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","ht_nominee succeed to insert the snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu]!",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","the snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] is duplicated in ht_nominee",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); free(snat_nominee_item); snat_nominee_item = NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"snat_nominee_update_cb","ht_nominee fail to insert the snat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu], ret is %d",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,ret); free(snat_nominee_item); snat_nominee_item = NULL; assert(0); } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_update_cb","cur item is_valid is %d",snat_nominee.is_valid); break; } } void snat_nominee_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_nominee_finish_cb","finish update IR_NOMINEE_IP"); return; } void snat_candidate_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_start_cb","start to update IR_CANDIDATE_IP, cur update type is %d", update_type); return; } void snat_candidate_update_cb(int table_id, const char *table_line, void *u_para) { int ret = 0; struct mrl_snat_candidate snat_candidate; memset(&snat_candidate,0,sizeof(snat_candidate)); struct mrl_snat_candidate* snat_candidate_item = NULL; sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s", &(snat_candidate.config_id), &(snat_candidate.addr_pool_id), &(snat_candidate.addr_type), snat_candidate.ip_addr, &(snat_candidate.location),&(snat_candidate.is_valid), snat_candidate.effective_range, snat_candidate.op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_update_cb","get IR_CANDIDATE_IP item:" "[config_id:%d,addr_pool_id:%d,addr_type:%d,ip_addr:%s,location:%d,is_vaild:%d,effective_range:%s,op_time:%s]", snat_candidate.config_id, snat_candidate.addr_pool_id,snat_candidate.addr_type,snat_candidate.ip_addr, snat_candidate.location,snat_candidate.is_valid,snat_candidate.effective_range, snat_candidate.op_time); switch(snat_candidate.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_snat_candidate,(const unsigned char*)snat_candidate.ip_addr,MRL_STR_IP_LEN); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.snat_candidate_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_update_cb","ht_snat_candidate succeed to del candidate key[ip_addr:%s]!",snat_candidate.ip_addr); Maat_del_back_info(snat_candidate.config_id,snat_candidate.ip_addr); } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_update_cb","the candidate ip[ip_addr:%s] is not exsit in ht_snat_candidate,can not del.",snat_candidate.ip_addr); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"snat_candidate_update_cb","ht_snat_candidate fail to del candidate key[ip_addr:%s]! ret is %d",snat_candidate.ip_addr,ret); assert(0); } } break; case MRL_VALID: snat_candidate_item= (struct mrl_snat_candidate *)calloc(1, sizeof(struct mrl_snat_candidate)); global_stat.malloc_memory += sizeof(struct mrl_snat_candidate); memcpy(snat_candidate_item,&snat_candidate,sizeof(struct mrl_snat_candidate)); ret =mrl_htable_add(mrl_instance.ht_snat_candidate,(const unsigned char* )snat_candidate_item->ip_addr,MRL_STR_IP_LEN,(const void*)snat_candidate_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.snat_candidate_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_update_cb","ht_snat_candidate succeed to add candidate key[ip_addr:%s]!",snat_candidate_item->ip_addr); } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_update_cb","the candidate key[ip_addr:%s] is duplicated in ht_snat_candidate.",snat_candidate_item->ip_addr); free(snat_candidate_item); snat_candidate_item = NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"snat_candidate_update_cb","ht_snat_candidate fail to insert the candidate key[ip_addr:%s], ret is %d",snat_candidate_item->ip_addr,ret); free(snat_candidate_item); snat_candidate_item = NULL; assert(0); } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"snat_candidate_update_cb","cur item is_valid is %d",snat_candidate.is_valid); break; } } void snat_candidate_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"snat_candidate_finish_cb","finish update IR_CANDIDATE_IP"); return; } void dnat_policy_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_start_cb","start to update IP_DNAT_POLICY, cur update type is %d", update_type); return; } void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para) { int ret = 0, is_outside = MRL_CLOSED_LOCATION; int operation = MRL_ADD_DNAT_NOMINEE; long nominee_count = 0; struct mrl_dnat_policy dnat_policy; memset(&dnat_policy,0,sizeof(dnat_policy)); struct mrl_dnat_policy *dnat_policy_item = NULL; struct mrl_nominee* dnat_nominee_item =NULL; sscanf(table_line,"%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%s\t%s", &(dnat_policy.config_id),&(dnat_policy.original_addr_type),dnat_policy.original_dest_ip, dnat_policy.original_dest_port, dnat_policy.original_protocol, dnat_policy.translated_user_type,dnat_policy.translated_user_id,dnat_policy.translated_dest_port, &(dnat_policy.do_log),&(dnat_policy.action),&(dnat_policy.service),&(dnat_policy.is_valid), dnat_policy.effective_range, dnat_policy.op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","get IP_DNAT_POLICY item:" "[config_id:%d,original_addr_type:%d,original_dest_ip:%s,original_dest_port:%s,original_protocol:%s,translated_user_type:%s," "translated_user_id:%s,translated_dest_port:%s,do_log:%d,action:%d,service:%d,is_valid:%d,effective_range:%s,op_time:%s]", dnat_policy.config_id,dnat_policy.original_addr_type,dnat_policy.original_dest_ip,dnat_policy.original_dest_port, dnat_policy.original_protocol,dnat_policy.translated_user_type,dnat_policy.translated_user_id, dnat_policy.translated_dest_port, dnat_policy.do_log,dnat_policy.action,dnat_policy.service,dnat_policy.is_valid,dnat_policy.effective_range, dnat_policy.op_time); struct mrl_dnat_policy_key dnat_policy_key; memset(&dnat_policy_key,0,sizeof(struct mrl_dnat_policy_key)); strncpy(dnat_policy_key.original_ip,(const char*)dnat_policy.original_dest_ip,MRL_STR_IP_LEN); dnat_policy_key.original_port = atoi(dnat_policy.original_dest_port); dnat_policy_key.original_protocol = atoi(dnat_policy.original_protocol); struct mrl_nominee_key nominee_key; memset(&nominee_key,0,sizeof(struct mrl_nominee_key)); strncpy(nominee_key.sip,dnat_policy.original_dest_ip,MRL_STR_IP_LEN); if(mrl_instance.mrl_cfg.ip_location_enable) { is_outside = mrl_is_outside_ip(dnat_policy.original_dest_ip); switch(is_outside) { case MRL_INSIDE_LOCATION: case MRL_UNDEFINED_LOCATION: strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.outside_detect_ip,MRL_STR_IP_LEN); break; case MRL_OUTSIDE_LOCATION: strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.inside_detect_ip,MRL_STR_IP_LEN); break; default: assert(0); break; } } else { strncpy(nominee_key.dip,(const char*)mrl_instance.mrl_cfg.outside_detect_ip,MRL_STR_IP_LEN); } nominee_key.sport=mrl_instance.mrl_cfg.local_port; nominee_key.dport=mrl_instance.mrl_cfg.detect_port; switch(dnat_policy.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_dnat_policy,(const unsigned char*)&dnat_policy_key,sizeof(struct mrl_dnat_policy_key)); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.dnat_policy_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","ht_dnat_policy succeed to delete the dnat key[original_ip:%s,original_port:%hu]!", dnat_policy_key.original_ip,dnat_policy_key.original_port); operation = MRL_DEL_DNAT_NOMINEE; if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char* )&nominee_key, sizeof(struct mrl_nominee_key),ht_dnat_nominee_search_cb,&operation,&nominee_count) != NULL) { if(nominee_count == 0) { ret = MESA_htable_del(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key, sizeof(struct mrl_nominee_key), NULL); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","ht_nominee fail to insert dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu]!ret is %d", nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,ret); } else { global_stat.dnat_nominee_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","ht_nominee succeed to del dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu].",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); Maat_del_back_info(dnat_policy.config_id,dnat_policy_key.original_ip); Maat_del_dnat_candidate(dnat_policy_key.original_ip,dnat_policy.config_id); } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","cur nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] nominee_count is %d.",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,nominee_count); } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","the dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] is not exist in ht_nominee.",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); } } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","the dnat_policy key[original_ip:%s,original_port:%hu] is not exsit in ht_dnat_policy.", dnat_policy_key.original_ip,dnat_policy_key.original_port); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","ht_dnat_policy del dnat key[original_ip:%s,original_port:%hu] error! ret is %d", dnat_policy_key.original_ip,dnat_policy_key.original_port,ret); assert(0); } } break; case MRL_VALID: dnat_policy_item= (struct mrl_dnat_policy *)calloc(1, sizeof(struct mrl_dnat_policy)); global_stat.malloc_memory += sizeof(struct mrl_dnat_policy); memcpy(dnat_policy_item,&dnat_policy,sizeof(struct mrl_dnat_policy)); ret =mrl_htable_add(mrl_instance.ht_dnat_policy,(const unsigned char* )&dnat_policy_key,sizeof(struct mrl_dnat_policy_key),(const void*)dnat_policy_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.dnat_policy_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","ht_dnat_policy success insert the dnat_policy key[original_ip:%s,original_port:%hu]!", dnat_policy_key.original_ip,dnat_policy_key.original_port); operation = MRL_ADD_DNAT_NOMINEE; if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char* )&nominee_key, sizeof(struct mrl_nominee_key),ht_dnat_nominee_search_cb,&operation,&nominee_count) == NULL) { dnat_nominee_item = (struct mrl_nominee* )calloc(1,sizeof(struct mrl_nominee)); global_stat.malloc_memory += sizeof(struct mrl_nominee); mrl_build_dnat_nominee_item(dnat_nominee_item,&dnat_policy); ret = MESA_htable_add(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key, sizeof(struct mrl_nominee_key), dnat_nominee_item); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","ht_nominee fail to insert dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu]!ret is %d", nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,ret); free(dnat_nominee_item); dnat_nominee_item = NULL; } else { global_stat.dnat_nominee_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","ht_nominee succeed to insert dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu].", nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","the dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu] is duplicated in ht_nominee,nominee_count is %ld", nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport,nominee_count); } } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","the dnat_policy key[original_ip:%s,original_port:%hu] is duplicated in ht_dnat_policy htable.", dnat_policy_key.original_ip,dnat_policy_key.original_port); free(dnat_policy_item); dnat_policy_item =NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","ht_dnat_policy fail to add dnat_policy key[original_ip:%s,original_port:%hu]! ret is %d", dnat_policy_key.original_ip,dnat_policy_key.original_port,ret); free(dnat_policy_item); dnat_policy_item =NULL; } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_policy_update_cb","cur item is_valid is %d",dnat_policy.is_valid); break; } } void dnat_policy_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_finish_cb","finish update IP_DNAT_POLICY"); return; } void dnat_candidate_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_start_cb","start to update IR_DNAT_CANDIDATE_IP, cur update type is %d", update_type); return; } void dnat_candidate_update_cb(int table_id, const char *table_line, void *u_para) { int ret = 0; struct mrl_dnat_candidate dnat_candidate; memset(&dnat_candidate,0,sizeof(dnat_candidate)); struct mrl_dnat_candidate* dnat_candidate_item = NULL; sscanf(table_line,"%d\t%s\t%d\t%d\t%d\t%s\t%s", &(dnat_candidate.config_id),dnat_candidate.ip_addr,&(dnat_candidate.addr_type), &(dnat_candidate.location),&(dnat_candidate.is_valid), dnat_candidate.effective_range, dnat_candidate.op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_update_cb","get IR_DNAT_CANDIDATE_IP item:" "[config_id:%d,ip_addr:%s,addr_type:%d,location:%d,is_vaild:%d,effective_range:%s,op_time:%s]", dnat_candidate.config_id, dnat_candidate.ip_addr,dnat_candidate.addr_type,dnat_candidate.location, dnat_candidate.is_valid,dnat_candidate.effective_range, dnat_candidate.op_time); switch(dnat_candidate.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_dnat_candidate,(const unsigned char*)dnat_candidate.ip_addr,MRL_STR_IP_LEN); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.dnat_candidate_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_update_cb","ht_dnat_candidate succeed to del candidate key[ip_addr:%s]!",dnat_candidate.ip_addr); } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_update_cb","the candidate ip[ip_addr:%s] is not exsit in ht_dnat_candidate,can not del.",dnat_candidate.ip_addr); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_candidate_update_cb","ht_dnat_candidate fail to del candidate key[ip_addr:%s]! ret is %d",dnat_candidate.ip_addr,ret); assert(0); } } break; case MRL_VALID: dnat_candidate_item = (struct mrl_dnat_candidate *)calloc(1, sizeof(struct mrl_dnat_candidate)); global_stat.malloc_memory += sizeof(struct mrl_dnat_candidate); memcpy(dnat_candidate_item,&dnat_candidate,sizeof(struct mrl_dnat_candidate)); ret =mrl_htable_add(mrl_instance.ht_dnat_candidate,(const unsigned char* )dnat_candidate_item->ip_addr,MRL_STR_IP_LEN,(const void*)dnat_candidate_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.dnat_candidate_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_update_cb","ht_dnat_candidate succeed to add candidate key[ip_addr:%s]!",dnat_candidate_item->ip_addr); } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_update_cb","the candidate key[ip_addr:%s] is duplicated in ht_dnat_candidate.",dnat_candidate_item->ip_addr); free(dnat_candidate_item); dnat_candidate_item = NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_candidate_update_cb","ht_dnat_candidate fail to insert the candidate key[ip_addr:%s], ret is %d",dnat_candidate_item->ip_addr,ret); free(dnat_candidate_item); dnat_candidate_item = NULL; assert(0); } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"dnat_candidate_update_cb","cur item is_valid is %d",dnat_candidate_item->is_valid); break; } } void dnat_candidate_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_candidate_finish_cb","finish update IR_CANDIDATE_IP"); return; } void vxlan_info_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_start_cb","start to update IR_VXLAN_INFO, cur update type is %d", update_type); return; } void vxlan_info_update_cb(int table_id, const char *table_line, void *u_para) { int ret = 0; struct mrl_vxlan_info vxlan_info; memset(&vxlan_info,0,sizeof(vxlan_info)); struct mrl_vxlan_info* vxlan_info_item =NULL; sscanf(table_line,"%d\t%s\t%d\t%lu\t%d\t%s\t%s", &(vxlan_info.config_id), vxlan_info.back_ip, &(vxlan_info.back_type), &(vxlan_info.link_identity), &(vxlan_info.is_valid), vxlan_info.effective_range, vxlan_info.op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_update_cb","get IR_VXLAN_INFO item:" "[config_id:%d,back_ip:%s,back_type:%d,link_identity:%lu,is_vaild:%d,effective_range:%s,op_time:%s]", vxlan_info.config_id, vxlan_info.back_ip, vxlan_info.back_type,vxlan_info.link_identity, vxlan_info.is_valid, vxlan_info.effective_range, vxlan_info.op_time); switch(vxlan_info.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_vxlan_info,(const unsigned char*)vxlan_info.back_ip,MRL_STR_IP_LEN); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.vxlan_info_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_update_cb","ht_vxlan_info succeed to del vxlan_info key[ip_addr:%s]!",vxlan_info.back_ip); } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_update_cb","the vxlan_info ip[ip_addr:%s] is not exsit in ht_vxlan_info,can not del.",vxlan_info.back_ip); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"vxlan_info_update_cb","ht_vxlan_info fail to del vxlan_info key[ip_addr:%s]! ret is %d",vxlan_info.back_ip,ret); assert(0); } } break; case MRL_VALID: vxlan_info_item= (struct mrl_vxlan_info* )calloc(1, sizeof(struct mrl_vxlan_info)); global_stat.malloc_memory += sizeof(struct mrl_vxlan_info); memcpy(vxlan_info_item,&vxlan_info,sizeof(struct mrl_vxlan_info)); ret =mrl_htable_add(mrl_instance.ht_vxlan_info,(const unsigned char* )vxlan_info_item->back_ip,MRL_STR_IP_LEN,(const void*)vxlan_info_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.vxlan_info_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_update_cb","ht_vxlan_info succeed to add vxlan_info key[ip_addr:%s]!",vxlan_info_item->back_ip); } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_update_cb","the vxlan_info key[ip_addr:%s] is duplicated in ht_vxlan_info.",vxlan_info_item->back_ip); free(vxlan_info_item); vxlan_info_item= NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"vxlan_info_update_cb","ht_vxlan_info fail to insert the vxlan_info key[ip_addr:%s], ret is %d",vxlan_info_item->back_ip,ret); free(vxlan_info_item); vxlan_info_item= NULL; assert(0); } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"vxlan_info_update_cb","cur item is_valid is %d",vxlan_info.is_valid); break; } } void vxlan_info_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"vxlan_info_finish_cb","finish update IR_VXLAN_INFO"); return; } void mrl_ip_info_start_cb(int update_type,void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_start_cb","start to update IR_MRL_IP_INFO, cur update type is %d", update_type); return; } void mrl_ip_info_update_cb(int table_id, const char *table_line, void *u_para) { int ret = 0; struct mrl_mrl_ip mrl_ip; memset(&mrl_ip,0,sizeof(mrl_ip)); struct mrl_mrl_ip* mrl_ip_item = NULL; sscanf(table_line,"%d\t%s\t%d\t%s\t%d\t%s\t%s", &(mrl_ip.config_id), mrl_ip.back_ip, &(mrl_ip.back_type),mrl_ip.mrl_ip, &(mrl_ip.is_valid), mrl_ip.effective_range, mrl_ip.op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_update_cb","get IR_MRL_IP_INFO item:" "[config_id:%d,back_ip:%s,back_type:%d,mrl_ip:%s,is_valid:%d,effective_range:%s,op_time:%s]", mrl_ip.config_id, mrl_ip.back_ip, mrl_ip.back_type, mrl_ip.mrl_ip, mrl_ip.is_valid,mrl_ip.effective_range,mrl_ip.op_time); switch(mrl_ip.is_valid) { case MRL_INVALID: ret =mrl_htable_delete(mrl_instance.ht_mrl_ip_info,(const unsigned char*)mrl_ip.back_ip,MRL_STR_IP_LEN); if(ret == MRL_HTABLE_DEL_SUCCESS) { global_stat.mrl_ip_num --; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_update_cb","ht_mrl_ip_info succeed to del mrl_ip_info key[ip_addr:%s]!",mrl_ip.back_ip); } else { if(ret == MRL_HTABLE_DEL_NULL) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_update_cb","the mrl_ip_info ip[ip_addr:%s] is not exsit in ht_mrl_ip_info,can not del.",mrl_ip.back_ip); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_ip_info_update_cb","ht_mrl_ip_info fail to del mrl_ip_info key[ip_addr:%s]! ret is %d",mrl_ip.back_ip,ret); assert(0); } } break; case MRL_VALID: mrl_ip_item =(struct mrl_mrl_ip* )calloc(1, sizeof(struct mrl_mrl_ip)); global_stat.malloc_memory += sizeof(struct mrl_mrl_ip); memcpy(mrl_ip_item,&mrl_ip,sizeof(struct mrl_mrl_ip)); ret =mrl_htable_add(mrl_instance.ht_mrl_ip_info,(const unsigned char* )mrl_ip_item->back_ip,MRL_STR_IP_LEN,(const void*)mrl_ip_item); if(ret == MRL_HTABLE_ADD_SUCCESS) { global_stat.mrl_ip_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_update_cb","ht_mrl_ip_info succeed to add mrl_ip_info key[ip_addr:%s]!",mrl_ip_item->back_ip); } else { if(ret == MRL_HTABLE_ADD_DUPLICATE) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_update_cb","the mrl_ip_info key[ip_addr:%s] is duplicated in ht_mrl_ip_info.",mrl_ip_item->back_ip); free(mrl_ip_item); mrl_ip_item = NULL; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_ip_info_update_cb","ht_mrl_ip_info fail to insert the mrl_ip_info key[ip_addr:%s], ret is %d",mrl_ip_item->back_ip,ret); free(mrl_ip_item); mrl_ip_item = NULL; assert(0); } } break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_ip_info_update_cb","cur item is_valid is %d",mrl_ip.is_valid); break; } } void mrl_ip_info_finish_cb(void* u_para) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_ip_info_finish_cb","finish update IR_MRL_IP_INFO"); return; } Maat_feather_t Maat_static_feather_init(const char* redis_ip, uint16_t redis_port, int redis_index) { Maat_feather_t feather; const char* dnat_policy_instance ="ir_dnat_policy"; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_Maat_feather_init","start init Maat static feather!"); // init Maat feather = Maat_feather(mrl_instance.mrl_cfg.Maat_max_threads, mrl_instance.mrl_cfg.Maat_table_path, mrl_instance.mrl_log_handle); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, dnat_policy_instance, strlen(dnat_policy_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_IP, redis_ip, strlen(redis_ip)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &(redis_port), sizeof(redis_port)); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_INDEX,&(redis_index), sizeof(redis_index)); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_FILE_PATH, mrl_instance.mrl_cfg.Maat_stat_path, strlen(mrl_instance.mrl_cfg.Maat_stat_path)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_ON, NULL, 0); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_PERF_ON, NULL, 0); int ret = Maat_initiate_feather(feather); if(ret< 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_init","Maat_initiate_feather func error!"); assert(0); } return feather; } Maat_feather_t Maat_dynamic_feather_init(const char* redis_ip, uint16_t redis_port, int redis_index) { Maat_feather_t feather; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_dynamic_feather_init","start init Maat dynamic feather!"); const char* nominee_instance ="ir_nominee_ip"; const char* snat_candidate_instance ="ir_candidate_ip"; const char* dnat_candidate_instance ="ir_dnat_candidate_ip"; const char* mrl_ip_instance ="ir_mrl_ip_info"; const char* vxlan_info_instance ="ir_vxlan_info"; // init Maat feather = Maat_feather(mrl_instance.mrl_cfg.Maat_max_threads, mrl_instance.mrl_cfg.Maat_table_path, mrl_instance.mrl_log_handle); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, nominee_instance, strlen(nominee_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, snat_candidate_instance, strlen(snat_candidate_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, dnat_candidate_instance, strlen(dnat_candidate_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, mrl_ip_instance, strlen(mrl_ip_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, vxlan_info_instance, strlen(vxlan_info_instance)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_IP, redis_ip, strlen(redis_ip)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &(redis_port), sizeof(redis_port)); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_INDEX,&(redis_index), sizeof(redis_index)); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_FILE_PATH, mrl_instance.mrl_cfg.Maat_stat_path, strlen(mrl_instance.mrl_cfg.Maat_stat_path)+1); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_ON, NULL, 0); wrapped_Maat_set_feather_opt(feather, MAAT_OPT_PERF_ON, NULL, 0); int ret = Maat_initiate_feather(feather); if(ret< 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_init","Maat_dynamic_initiate_feather func error!"); assert(0); } return feather; } bool mrl_construct_ir_vxlan_info(int cfg_id, uint64_t link_identity,const char* back_ip, int back_type) { int ret = 0; struct mrl_vxlan_info *vxlan_info = (struct mrl_vxlan_info *)calloc(1,sizeof(struct mrl_vxlan_info)); global_stat.malloc_memory += sizeof(struct mrl_vxlan_info); if(MESA_htable_search_cb(mrl_instance.ht_vxlan_info, (const unsigned char *)back_ip, MRL_STR_IP_LEN, NULL,NULL,NULL) == NULL) { mrl_create_vxlan_info(vxlan_info, cfg_id,link_identity,back_ip,back_type); ret = MESA_htable_add(mrl_instance.ht_vxlan_info, (const unsigned char *)back_ip, MRL_STR_IP_LEN, vxlan_info); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_construct_ir_vxlan_info","Maat fail to add the vxlan_info key[back_ip:%s] into ht_vxlan_info! ret is %d",back_ip,ret); assert(0); return false; } global_stat.vxlan_info_num++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_construct_ir_vxlan_info"," Maat succeed to insert the vxlan_info key[back_ip:%s] into ht_vxlan_info",back_ip); Maat_set_vxlan_info(mrl_instance.dynamic_feather,vxlan_info); return true; } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_construct_ir_vxlan_info","the vxlan_info key[back_ip:%s] is duplicate in ht_vxlan_info",back_ip); return false; } } void mrl_construct_ir_mrl_ip(int mrl_ip_config_id, const char* back_ip, int back_type) { int ret = 0; struct mrl_mrl_ip *mrl_ip = (struct mrl_mrl_ip *)calloc(1,sizeof(struct mrl_mrl_ip)); global_stat.malloc_memory += sizeof(struct mrl_mrl_ip); if(MESA_htable_search_cb(mrl_instance.ht_mrl_ip_info, (const unsigned char *)back_ip, MRL_STR_IP_LEN, NULL,NULL,NULL) == NULL) { mrl_create_mrl_ip(mrl_ip, mrl_ip_config_id,back_ip, back_type); ret = MESA_htable_add(mrl_instance.ht_mrl_ip_info, (const unsigned char *)back_ip, MRL_STR_IP_LEN, mrl_ip); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_construct_ir_mrl_ip","Maat fail to add the mrl_ip_info key[back_ip:%s] into ht_mrl_ip_info! ret is %d",back_ip,ret); assert(0); return; } global_stat.mrl_ip_num ++; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_construct_ir_mrl_ip"," Maat succeed to insert the mrl_ip_info key[back_ip:%s] into ht_mrl_ip_info",back_ip); Maat_set_mrl_ip(mrl_instance.dynamic_feather, mrl_ip); } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_construct_ir_mrl_ip","the mrl_ip_info key[back_ip:%s] is duplicate in ht_mrl_ip_info",back_ip); } return ; } void mrl_deal_snat_detect(struct mrl_nominee* snat_nominee, uint64_t link_identity) { int ret = 0; struct mrl_snat_candidate* snat_candidate = NULL; if(MESA_htable_search_cb(mrl_instance.ht_snat_candidate, (const unsigned char *)snat_nominee->ip_addr, MRL_STR_IP_LEN,NULL,NULL,NULL) == NULL) { snat_candidate = (struct mrl_snat_candidate* )calloc(1,sizeof(struct mrl_snat_candidate)); global_stat.malloc_memory += sizeof(struct mrl_snat_candidate); mrl_create_snat_candidate(snat_candidate,snat_nominee); ret = MESA_htable_add(mrl_instance.ht_snat_candidate, (const unsigned char *)snat_candidate->ip_addr, MRL_STR_IP_LEN, snat_candidate); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_deal_snat_detect","fail to add the snat_candidate key[ip_addr:%s] into ht_snat_candidate ! ret is %d",snat_candidate->ip_addr,ret); free(snat_candidate); snat_candidate = NULL; assert(0); return; } global_stat.snat_candidate_num ++; if(Maat_set_snat_candidate(mrl_instance.dynamic_feather,snat_candidate)) { if(mrl_construct_ir_vxlan_info(snat_candidate->config_id,link_identity,snat_candidate->ip_addr,MRL_SNAT_BACK_TYPE)) { mrl_construct_ir_mrl_ip(snat_candidate->config_id,snat_candidate->ip_addr,MRL_SNAT_BACK_TYPE); } } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_deal_snat_detect","cur candidate ip[ip_addr:%s] is duplicated int ht_snat_candidate",snat_nominee->ip_addr); } } void mrl_deal_dnat_detect(struct mrl_nominee* dnat_nominee, uint64_t link_identity) { int ret = 0; struct mrl_dnat_candidate* dnat_candidate = NULL; if(MESA_htable_search_cb(mrl_instance.ht_dnat_candidate, (const unsigned char *)dnat_nominee->ip_addr, MRL_STR_IP_LEN,NULL,NULL,NULL) == NULL) { dnat_candidate = (struct mrl_dnat_candidate* )calloc(1,sizeof(struct mrl_dnat_candidate)); global_stat.malloc_memory += sizeof(struct mrl_dnat_candidate); mrl_create_dnat_candidate(dnat_candidate,dnat_nominee); ret = MESA_htable_add(mrl_instance.ht_dnat_candidate, (const unsigned char *)dnat_candidate->ip_addr, MRL_STR_IP_LEN, dnat_candidate); if(ret < 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_deal_dnat_detect","fail to add the dnat_candidate key[ip_addr:%s] into ht_dnat_candidate! ret is %d",dnat_candidate->ip_addr,ret); free(dnat_candidate); dnat_candidate = NULL; assert(0); return; } global_stat.dnat_candidate_num ++; if(Maat_set_dnat_candidate(mrl_instance.dynamic_feather,dnat_candidate)) { if(mrl_construct_ir_vxlan_info(dnat_candidate->config_id,link_identity,dnat_candidate->ip_addr,MRL_DNAT_BACK_TYPE)) { mrl_construct_ir_mrl_ip(dnat_candidate->config_id,dnat_candidate->ip_addr,MRL_DNAT_BACK_TYPE); } } } else { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_deal_dnat_detect","cur dnat candidate ip[ip_addr:%s] is duplicated int ht_dnat_candidate",dnat_nominee->ip_addr); } } void mrl_parse_detect_response(const char* udp_pkt, char* payload) { struct iphdr *ip_hdr = (struct iphdr*)udp_pkt; int iphdr_len = 4*ip_hdr->ihl; strncpy(payload,udp_pkt+iphdr_len+MRL_UDP_HDR_LEN,MRL_STR_DETECT_RESPONSE_LEN); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_parse_detect_response","cur udp pkt payload content is %s",payload); } bool mrl_identify_detect_pkt(struct streaminfo *mystream, const char * udp_pkt, struct mrl_tuple *tuple) { long ret = 0; uint64_t link_identity = 0; int nominee_type = 0; char udp_payload[MRL_STR_DETECT_RESPONSE_LEN]; memset(udp_payload,0,MRL_STR_DETECT_RESPONSE_LEN); struct mrl_nominee nominee; memset(&nominee ,0,sizeof(struct mrl_nominee)); struct mrl_nominee_key nominee_key; memset(&nominee_key,0,sizeof(nominee_key)); strncpy(nominee_key.sip,(const char*)tuple->dip,MRL_STR_IP_LEN); strncpy(nominee_key.dip,(const char*)tuple->sip,MRL_STR_IP_LEN); nominee_key.sport= tuple->dport; nominee_key.dport= tuple->sport; MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_identify_detect_pkt","cur identify pkt info:[sip:%s,sport:%hu,dip:%s,dport:%hu,protocol:%hu]", tuple->sip,tuple->sport,tuple->dip,tuple->dport,tuple->protocol); if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char *)&nominee_key, sizeof(nominee_key),ht_nominee_search_cb,(void *)&nominee,&ret) != NULL) { mrl_parse_detect_response(udp_pkt,udp_payload); sscanf(udp_payload,"nominee_type:%d,link_identity:%lu",&nominee_type,&link_identity); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_identify_detect_pkt","cur detect pkt[sip:%s,sport:%hu,dip:%s,dport:%hu] moninee_type is %d,link_identity is %lu", tuple->sip,tuple->sport,tuple->dip,tuple->dport,nominee_type,link_identity); switch(nominee_type) { case MRL_SNAT_NOMINEE_TYPE: mrl_deal_snat_detect(&nominee,link_identity); break; case MRL_DNAT_NOMINEE_TYPE: mrl_deal_dnat_detect(&nominee,link_identity); break; default: MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_identify_detect_pkt","the type of nominee key [sip:%s,sport:%hu,dip:%s,dport:%hu] is error!",nominee_key.sip,nominee_key.sport,nominee_key.dip,nominee_key.dport); assert(0); break; } return true; } else { return false; } }