summaryrefslogtreecommitdiff
path: root/src/mrl_redis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mrl_redis.cpp')
-rw-r--r--src/mrl_redis.cpp194
1 files changed, 127 insertions, 67 deletions
diff --git a/src/mrl_redis.cpp b/src/mrl_redis.cpp
index e7a5274..41d3580 100644
--- a/src/mrl_redis.cpp
+++ b/src/mrl_redis.cpp
@@ -10,6 +10,39 @@ 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);
+ 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);
@@ -204,6 +237,7 @@ bool Maat_del_line(Maat_feather_t feather, int rule_id, int expire_after,const c
}
}
+/*del the vxlan_info_table and mrl_ip_info table*/
void Maat_del_back_info(const char *back_ip)
{
int ret = 0;
@@ -243,6 +277,20 @@ void Maat_del_back_info(const char *back_ip)
}
}
+void Maat_del_dnat_candidate(const char *candidate_ip,int rule_id)
+{
+ 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;
@@ -282,10 +330,11 @@ void mrl_create_dnat_nominee(struct mrl_nominee* dnat_nominee, struct mrl_dnat_p
strncpy(dnat_nominee->effective_range,dnat_policy->effective_range,MRL_STR_EFFEC_RANGE_LEN);
mrl_get_cur_time(dnat_nominee->op_time);
dnat_nominee->nominee_type=MRL_DNAT_NOMINEE_TYPE;
+ dnat_nominee->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",
- dnat_nominee->config_id,dnat_nominee->addr_pool_id,dnat_nominee->ip_addr,
- dnat_nominee->addr_type,dnat_nominee->effective_range,dnat_nominee->op_time,dnat_nominee->nominee_type);
+ "[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->config_id,dnat_nominee->addr_pool_id,dnat_nominee->ip_addr,dnat_nominee->addr_type,
+ dnat_nominee->effective_range,dnat_nominee->op_time,dnat_nominee->nominee_type,dnat_nominee->nominee_count);
}
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)
@@ -371,7 +420,7 @@ void snat_nominee_update_cb(int table_id,const char *table_line,void *u_para)
nominee_key.dport=mrl_instance.mrl_cfg.dest_port;
switch(snat_nominee->is_valid)
{
- case 0:
+ 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)
{
@@ -391,7 +440,7 @@ void snat_nominee_update_cb(int table_id,const char *table_line,void *u_para)
}
}
break;
- case 1:
+ case MRL_VALID:
ret =mrl_htable_add(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key,sizeof(struct mrl_nominee_key),(const void* )snat_nominee);
if(ret == MRL_HTABLE_ADD_SUCCESS)
{
@@ -445,13 +494,12 @@ void snat_candidate_update_cb(int table_id, const char *table_line, void *u_para
snat_candidate->location,snat_candidate->is_valid,snat_candidate->effective_range, snat_candidate->op_time);
switch(snat_candidate->is_valid)
{
- case 0:
+ 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->ip_addr);
}
else
@@ -467,7 +515,7 @@ void snat_candidate_update_cb(int table_id, const char *table_line, void *u_para
}
}
break;
- case 1:
+ case MRL_VALID:
ret =mrl_htable_add(mrl_instance.ht_snat_candidate,(const unsigned char* )snat_candidate->ip_addr,MRL_STR_IP_LEN,(const void*)snat_candidate);
if(ret == MRL_HTABLE_ADD_SUCCESS)
{
@@ -510,6 +558,9 @@ void dnat_policy_start_cb(int update_type,void* u_para)
void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para)
{
int ret = 0;
+ int operation = MRL_ADD_DNAT_NOMINEE;
+ long nominee_count = 0;
+ struct mrl_nominee* dnat_nominee =NULL;
struct mrl_dnat_policy *dnat_policy = (struct mrl_dnat_policy *)calloc(1, sizeof(struct mrl_dnat_policy));
global_stat.malloc_memory += sizeof(struct mrl_dnat_policy);
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",
@@ -527,10 +578,7 @@ void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para)
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);
-
- struct mrl_nominee* dnat_nominee = (struct mrl_nominee* )calloc(1,sizeof(struct mrl_nominee));
- global_stat.malloc_memory += sizeof(struct mrl_nominee);
-
+ 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);
@@ -540,39 +588,49 @@ void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para)
switch(dnat_policy->is_valid)
{
- case 0:
- 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]!",
+ 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);
-
- 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.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_key.original_ip);
- }
- 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 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
- {
- MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"dnat_policy_update_cb","ht_nominee fail 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);
- assert(0);
+ 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_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 key[original_ip:%s,original_port:%hu] is not exsit in ht_dnat_policy.",
+ 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
@@ -583,35 +641,38 @@ void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para)
}
}
break;
- case 1:
+ case MRL_VALID:
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);
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);
- mrl_create_dnat_nominee(dnat_nominee,dnat_policy);
- ret =mrl_htable_add(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key,sizeof(struct mrl_nominee_key),(const void* )dnat_nominee);
- if(ret ==MRL_HTABLE_ADD_SUCCESS)
- {
- 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 add dnat nominee key[sip:%s,sport:%hu,dip:%s,dport:%hu].",
+
+ 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 = (struct mrl_nominee* )calloc(1,sizeof(struct mrl_nominee));
+ global_stat.malloc_memory += sizeof(struct mrl_nominee);
+ mrl_create_dnat_nominee(dnat_nominee,dnat_policy);
+ ret = MESA_htable_add(mrl_instance.ht_nominee,(const unsigned char* )&nominee_key, sizeof(struct mrl_nominee_key), dnat_nominee);
+ 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 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
- {
- if(ret ==MRL_HTABLE_ADD_DUPLICATE)
- {
-
- 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_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","ht_nominee fail 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);
- }
- }
+ }
+ }
+ 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
{
@@ -661,7 +722,7 @@ void dnat_candidate_update_cb(int table_id, const char *table_line, void *u_para
dnat_candidate->is_valid,dnat_candidate->effective_range, dnat_candidate->op_time);
switch(dnat_candidate->is_valid)
{
- case 0:
+ 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)
{
@@ -681,7 +742,7 @@ void dnat_candidate_update_cb(int table_id, const char *table_line, void *u_para
}
}
break;
- case 1:
+ case MRL_VALID:
ret =mrl_htable_add(mrl_instance.ht_dnat_candidate,(const unsigned char* )dnat_candidate->ip_addr,MRL_STR_IP_LEN,(const void*)dnat_candidate);
if(ret == MRL_HTABLE_ADD_SUCCESS)
{
@@ -713,7 +774,6 @@ 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);
@@ -735,7 +795,7 @@ void vxlan_info_update_cb(int table_id, const char *table_line, void *u_para)
vxlan_info->is_valid, vxlan_info->effective_range, vxlan_info->op_time);
switch(vxlan_info->is_valid)
{
- case 0:
+ 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)
{
@@ -755,7 +815,7 @@ void vxlan_info_update_cb(int table_id, const char *table_line, void *u_para)
}
}
break;
- case 1:
+ case MRL_VALID:
ret =mrl_htable_add(mrl_instance.ht_vxlan_info,(const unsigned char* )vxlan_info->back_ip,MRL_STR_IP_LEN,(const void*)vxlan_info);
if(ret == MRL_HTABLE_ADD_SUCCESS)
{
@@ -811,7 +871,7 @@ void mrl_ip_info_update_cb(int table_id, const char *table_line, void *u_para)
mrl_ip->is_valid,mrl_ip->effective_range,mrl_ip->op_time);
switch(mrl_ip->is_valid)
{
- case 0:
+ 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)
{
@@ -831,7 +891,7 @@ void mrl_ip_info_update_cb(int table_id, const char *table_line, void *u_para)
}
}
break;
- case 1:
+ case MRL_VALID:
ret =mrl_htable_add(mrl_instance.ht_mrl_ip_info,(const unsigned char* )mrl_ip->back_ip,MRL_STR_IP_LEN,(const void*)mrl_ip);
if(ret == MRL_HTABLE_ADD_SUCCESS)
{