From ac94ad0124de7a529854ba7e3914ac26b8255ffe Mon Sep 17 00:00:00 2001 From: lijie Date: Wed, 5 Dec 2018 11:29:36 +0800 Subject: 修改读取配置文件的格式,可以支持同一台串联设备有多个Linkid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/conf/mrl.conf | 6 +- include/mrl_main.h | 15 +- include/mrl_redis.h | 30 +++- include/mrl_utils.h | 2 + src/mrl_main.c | 488 ++++++++++++++++++++++++++++++++++++++++++---------- src/mrl_packet.c | 51 +++--- src/mrl_redis.c | 217 ++++++++++++----------- 7 files changed, 575 insertions(+), 234 deletions(-) diff --git a/bin/conf/mrl.conf b/bin/conf/mrl.conf index 92c58f0..071e4ce 100644 --- a/bin/conf/mrl.conf +++ b/bin/conf/mrl.conf @@ -13,15 +13,17 @@ mrl_ip=192.168.11.242 [MAAT_INFO] Maat_table_path=./mrl_conf/table_info.conf Maat_max_threads=1 -Maat_redis_ip=192.168.10.180 -Maat_redis_port=26379 +Maat_redis_ip=192.168.11.243 +Maat_redis_port=6800 Maat_stat_path=./log/Maat_stat.log +Maat_redis_index=5 [HTABLE_INFO] ht_slots=10000 ht_max_element_num=40000 ht_mutex_num=5 [VXLAN_INFO] vxlan_gdev_num=1 +vxlan_link_id_num=1 vxlan_local_mac=e4:95:6e:20:0d:0a vxlan_gdev_mac=00:1e:73:6c:fa:43 vxlan_local_ip=192.168.1.10 diff --git a/include/mrl_main.h b/include/mrl_main.h index e74a59e..67530b1 100644 --- a/include/mrl_main.h +++ b/include/mrl_main.h @@ -37,6 +37,7 @@ struct mrl_global_cfg uint16_t Maat_redis_port; char Maat_stat_path[MRL_MAX_PATH]; unsigned int Maat_max_threads; + int redis_index; //htable info unsigned int ht_slots; @@ -51,12 +52,14 @@ struct mrl_global_cfg char vxlan_outer_local_ip[MRL_STR_IP_LEN]; char **vxlan_outer_gdev_port; char xvlan_outer_local_port[MRL_STR_PORT_LEN]; - char **vxlan_encap_type; - char **vxlan_vpn_id; - char **vxlan_link_id; - char **vxlan_link_dir; - char **vxlan_inner_smac; - char **vxlan_inner_dmac; + unsigned int vxlan_link_id_num;//豸· + int **vxlan_vpn_id; + int **vxlan_encap_type; + int **vxlan_link_dir; + int **vxlan_link_id; + + char ***vxlan_inner_smac; + char ***vxlan_inner_dmac; }; struct mrl_global_instance diff --git a/include/mrl_redis.h b/include/mrl_redis.h index 655173d..1b19cd5 100644 --- a/include/mrl_redis.h +++ b/include/mrl_redis.h @@ -5,7 +5,8 @@ #define IR_NOMINEE_IP_TABLE_NAME "IR_NOMINEE_IP" #define IR_CANDIDATE_IP_TABLE_NAME "IR_CANDIDATE_IP" -//#define REDIS_CANDIATE_KEY_NAME "IR_CANDIDATE_ID" +#define IR_DNAT_POLICY_TABLE_NAME "IR_DNAT_POLICY" + struct mrl_ht_nominee_key{ uint32_t sip; uint32_t dip; @@ -15,10 +16,11 @@ uint16_t dport; struct mrl_nominee_item{ int config_id; - int group_id; + int addr_pool_id; int addr_type; char ip_addr[MRL_STR_IP_LEN]; - int is_vaild; + int is_valid; + char effective_range[MRL_STR_EFFEC_RANGE_LEN]; char op_time[MRL_DATE_LEN]; }; @@ -38,23 +40,35 @@ struct mrl_vxlan_info{ }; struct mrl_candidate_item{ int config_id; - int group_id; + int addr_pool_id; int addr_type; char ip_addr[MRL_STR_IP_LEN];//ͻIP int location; char mrl_ip[MRL_STR_IP_LEN]; struct mrl_vxlan_info vxlan_info; - int is_vaild; + int is_valid; + char effective_range[MRL_STR_EFFEC_RANGE_LEN]; char op_time[MRL_DATE_LEN]; }; - +/* +struct mrl_dnat_policy_item{ + int config_id; + char original_dest_ip[MRL_STR_IP_LEN]; + char original_dest_port[MRL_STR_PORT_LEN]; + char original_protocol[MRL_STR_PROT_LEN]; + char translated_dest_ip[MRL_STR_PROT_LEN]; + char translated_dest_port[MRL_STR_PROT_LEN]; + int do_log; + int action; + int service; + int is_valid; +}; +*/ MESA_htable_handle mrl_htable_init(void * fn_data_free_cb); //void ht_candidate_free_cb(void * data); void ht_nominee_free_cb(void * data); void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candidate_item); -void Maat_set_nominee_cmd_line(Maat_feather_t feather, struct mrl_nominee_item *nominee_item); - Maat_feather_t mrl_Maat_feather_init(); void nominee_update_cb(int table_id,const char* table_line,void* u_para); bool mrl_identify_nominee(struct streaminfo *mystream); diff --git a/include/mrl_utils.h b/include/mrl_utils.h index ca148a6..d65f543 100644 --- a/include/mrl_utils.h +++ b/include/mrl_utils.h @@ -9,6 +9,8 @@ #define MRL_STR_LINK_ID_LEN 5 #define MRL_STR_LINK_DIR_LEN 2 #define MRL_STR_VPN_ID_LEN 5 +#define MRL_STR_PROT_LEN 4 +#define MRL_STR_EFFEC_RANGE_LEN 20 #define MRL_DATE_LEN 50 diff --git a/src/mrl_main.c b/src/mrl_main.c index 0bd6ae6..f09e1ae 100644 --- a/src/mrl_main.c +++ b/src/mrl_main.c @@ -20,10 +20,24 @@ void mrl_cfg_init(const char *profile) char *temp_vpn_id_str; char *temp_link_id_str; char *temp_link_dir_str; + char *temp_inner_mac_str; + + char **_link_id_str; + char **_encap_type_str; + char **_vpn_id_str; + char **_link_dir_str; + char **_inner_mac_str; + + char **encap_type_str; + char **vpn_id_str; + char **link_id_str; + char **link_dir_str; + char **gdev_inner_mac_str; unsigned int split_num = 0; int temp_port = 0; unsigned int i=0; + unsigned int j = 0; /********** load log info **********/ MESA_load_profile_int_def(profile, "LOG_INFO", "log_level", &(mrl_instance.mrl_cfg.mrl_log_level),RLOG_LV_DEBUG); @@ -62,6 +76,7 @@ void mrl_cfg_init(const char *profile) assert(temp_port > 0 && temp_port <= 65535); mrl_instance.mrl_cfg.Maat_redis_port = temp_port; MESA_load_profile_string_def(profile, "MAAT_INFO", "Maat_stat_path", mrl_instance.mrl_cfg.Maat_stat_path,MRL_MAX_PATH, "./log/Maat_stat.log"); + MESA_load_profile_int_def(profile, "MAAT_INFO", "Maat_redis_index", &(mrl_instance.mrl_cfg.redis_index), 1); /********** load htable info *********/ @@ -81,151 +96,406 @@ void mrl_cfg_init(const char *profile) temp_port_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_PORT_LEN, sizeof(char)); global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_PORT_LEN; - - temp_encap_type_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_ENCAP_TYPE_LEN,sizeof(char)); - global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_ENCAP_TYPE_LEN; - - temp_vpn_id_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_VPN_ID_LEN,sizeof(char)); - global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_VPN_ID_LEN; - - temp_link_id_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_LINK_ID_LEN,sizeof(char)); - global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_LINK_ID_LEN; - - temp_link_dir_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_LINK_DIR_LEN, sizeof(char)); - global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_LINK_DIR_LEN; MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_gdev_mac",temp_mac_str, mrl_instance.mrl_cfg.vxlan_gdev_num*MRL_STR_MAC_LEN, "00:00:00:00:00:00"); - mrl_instance.mrl_cfg.vxlan_outer_gdev_mac = (char **)malloc(sizeof(char *)*mrl_instance.mrl_cfg.vxlan_gdev_num); + mrl_instance.mrl_cfg.vxlan_outer_gdev_mac = (char **)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num, sizeof(char *)); global_stat.malloc_memory += mrl_instance.mrl_cfg.vxlan_gdev_num * sizeof(char *); for(i=0;iaddr.tuple4_v4->daddr); inet_ntop(AF_INET,&(mystream->addr.tuple4_v4->saddr),temp_sip,MRL_STR_IP_LEN); inet_ntop(AF_INET,&(mystream->addr.tuple4_v4->daddr),temp_dip,MRL_STR_IP_LEN); - /* - if(memcmp(temp_sip,"61.135.169.121",strlen(temp_sip)) == 0) - { - printf("cur stream sip is baidu\n"); - return true; - } - else - { - if(memcmp(temp_dip,"61.135.169.121",strlen(temp_dip)) == 0) - { - printf("cur stream dip is baidu\n"); - return true; - } - else - { - return false; - } - }*/ switch(mystream->type) { case STREAM_TYPE_TCP: @@ -402,13 +383,30 @@ size_t mrl_build_udp_payload(char *payload) memcpy(payload,content,payload_len); return payload_len; } + +void mrl_construct_vxlan_info(struct mrl_vxlan_info *vxlan_info, int gdev_index, int link_id_index) +{ + + memcpy(vxlan_info->vxlan_outer_local_port, mrl_instance.mrl_cfg.xvlan_outer_local_port,strlen(mrl_instance.mrl_cfg.xvlan_outer_local_port)); + memcpy(vxlan_info->vxlan_outer_gdev_port , mrl_instance.mrl_cfg.vxlan_outer_gdev_port[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[gdev_index])); + memcpy(vxlan_info->vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip)); + memcpy(vxlan_info->vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[gdev_index])); + memcpy(vxlan_info->vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_local_mac,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_mac)); + memcpy(vxlan_info->vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[gdev_index])); + vxlan_info->vxlan_link_id = mrl_instance.mrl_cfg.vxlan_link_id[gdev_index][link_id_index]; + vxlan_info->vxlan_encap_type = mrl_instance.mrl_cfg.vxlan_encap_type[gdev_index][link_id_index]; + vxlan_info->vxlan_vpn_id= mrl_instance.mrl_cfg.vxlan_vpn_id[gdev_index][link_id_index]; + vxlan_info->vxlan_link_dir = mrl_instance.mrl_cfg.vxlan_link_dir[gdev_index][link_id_index]; + memcpy(vxlan_info->vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smac[gdev_index][link_id_index],strlen(mrl_instance.mrl_cfg.vxlan_inner_smac[gdev_index][link_id_index])); + memcpy(vxlan_info->vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmac[gdev_index][link_id_index], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmac[gdev_index][link_id_index])); +} void mrl_detect_action(uint32_t src_ip) { char temp_ip[MRL_STR_IP_LEN]; memset(temp_ip,0,MRL_STR_IP_LEN); inet_ntop(AF_INET, &src_ip,temp_ip, MRL_STR_IP_LEN); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_detect_action","detect ip is %s",temp_ip); - unsigned int i = 0; + unsigned int i = 0, j =0; int thread_seq = 0; int temp_len = 0; size_t udp_payload_len = 0; @@ -425,11 +423,14 @@ void mrl_detect_action(uint32_t src_ip) ip_len = mrl_build_ip_hdr(ip_pkt,src_ip,dest_ip,udp_len); for(i = 0; i< mrl_instance.mrl_cfg.vxlan_gdev_num;i++) { - memset(&vxlan_info,0,sizeof(vxlan_info)); - mrl_get_vxlan_info(&vxlan_info,i); - mrl_send_to_gdev(thread_seq,&vxlan_info,ip_pkt,ip_len); - global_stat.send_detect_pkts ++; - global_stat.send_gdev_total_pkts ++; + for(j = 0; j < mrl_instance.mrl_cfg.vxlan_link_id_num; j ++) + { + memset(&vxlan_info,0,sizeof(vxlan_info)); + mrl_construct_vxlan_info(&vxlan_info,i,j); + mrl_send_to_gdev(thread_seq,&vxlan_info,ip_pkt,ip_len); + global_stat.send_detect_pkts ++; + global_stat.send_gdev_total_pkts ++; + } } } diff --git a/src/mrl_redis.c b/src/mrl_redis.c index 966c94a..7de9db1 100644 --- a/src/mrl_redis.c +++ b/src/mrl_redis.c @@ -112,77 +112,25 @@ int Maat_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_ } return ret; } - - -Maat_feather_t mrl_Maat_feather_init() -{ - MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_Maat_feather_init","start init Maat feather!"); - Maat_feather_t feather; - const char *nominee_instance = "mrl_nominee"; - const char *candidate_instance = "mrl_candidate"; - // 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, candidate_instance, strlen(candidate_instance)+1); - wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_IP, mrl_instance.mrl_cfg.Maat_redis_ip, strlen(mrl_instance.mrl_cfg.Maat_redis_ip)+1); - wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &(mrl_instance.mrl_cfg.Maat_redis_port), sizeof(mrl_instance.mrl_cfg.Maat_redis_port)); - 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); - } - Maat_plugin_table(feather,IR_NOMINEE_IP_TABLE_NAME,NULL,nominee_update_cb,NULL,NULL); - return feather; -} - -int mrl_get_candidate_location(const char *ip_addr) -{ - const char *mycountry="China"; - int location = 0; - location = mrl_search_ip_country(mrl_instance.mrl_mmdb, ip_addr, mycountry); - if(location < 0) - { - MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_get_candidate_location","cur ip addr %s not exist in mmdb",ip_addr); - return 0; - } - return location; -} -void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct mrl_nominee_item *nominee_item) -{ - candidate_item->config_id = nominee_item->config_id; - candidate_item->group_id = nominee_item->group_id; - candidate_item->addr_type = MRL_IPV4_TYPE ; - memcpy(candidate_item->ip_addr,nominee_item->ip_addr,strlen(nominee_item->ip_addr)); - //to do how to get ip location - candidate_item->location = mrl_get_candidate_location(candidate_item->ip_addr); - memcpy(candidate_item->mrl_ip, mrl_instance.mrl_cfg.mrl_ip,strlen(mrl_instance.mrl_cfg.mrl_ip)); - candidate_item->is_vaild = 1; - get_cur_time(candidate_item->op_time); -} - -void nominee_update_cb(int table_id,const char* table_line,void* u_para) +void nominee_update_cb(int table_id,const char *table_line,void *u_para) { int ret = 0; struct mrl_nominee_item *nominee_item = (struct mrl_nominee_item *)calloc(1, sizeof(struct mrl_nominee_item)); global_stat.malloc_memory += sizeof(struct mrl_nominee_item); - sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%s", - &(nominee_item->config_id), &(nominee_item->group_id), &(nominee_item->addr_type), - nominee_item->ip_addr, &(nominee_item->is_vaild), nominee_item->op_time); + sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%s\t%s", + &(nominee_item->config_id), &(nominee_item->addr_pool_id), &(nominee_item->addr_type), + nominee_item->ip_addr, &(nominee_item->is_valid), nominee_item->effective_range, nominee_item->op_time); MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"nominee_update_cb","get nominee item:" - "config_id:%d,group_id:%d,addr_type:%d,ip_addr:%s,is_vaild:%d,op_time:%s", - nominee_item->config_id, nominee_item->group_id,nominee_item->addr_type, - nominee_item->ip_addr, nominee_item->is_vaild,nominee_item->op_time); + "config_id:%d,group_id:%d,addr_type:%d,ip_addr:%s,is_valid:%d,effective_range:%s,op_time:%s", + nominee_item->config_id, nominee_item->addr_pool_id,nominee_item->addr_type, + nominee_item->ip_addr, nominee_item->is_valid,nominee_item->effective_range,nominee_item->op_time); struct mrl_ht_nominee_key nominee_key; memset(&nominee_key,0,sizeof(struct mrl_ht_nominee_key)); inet_pton(AF_INET,nominee_item->ip_addr,&(nominee_key.sip)); inet_pton(AF_INET,mrl_instance.mrl_cfg.dest_ip,&(nominee_key.dip)); nominee_key.sport=htons(mrl_instance.mrl_cfg.local_port); nominee_key.dport=htons(mrl_instance.mrl_cfg.dest_port); - switch(nominee_item->is_vaild) + switch(nominee_item->is_valid) { case 0: if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char *)&nominee_key, sizeof(nominee_key),NULL,NULL,NULL) != NULL) @@ -231,6 +179,68 @@ void nominee_update_cb(int table_id,const char* table_line,void* u_para) } +void dnat_policy_update_cb(int table_id, const char *table_line, void *u_para) +{ + +} + +Maat_feather_t mrl_Maat_feather_init() +{ + MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_Maat_feather_init","start init Maat feather!"); + Maat_feather_t feather; + const char *nominee_instance = "mrl_nominee"; + const char *candidate_instance = "mrl_candidate"; + const char *dnat_policy_instance ="mrl_dnat_policy"; + // 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, candidate_instance, strlen(candidate_instance)+1); + 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, mrl_instance.mrl_cfg.Maat_redis_ip, strlen(mrl_instance.mrl_cfg.Maat_redis_ip)+1); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &(mrl_instance.mrl_cfg.Maat_redis_port), sizeof(mrl_instance.mrl_cfg.Maat_redis_port)); + 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); + printf("redis index is %d\n",mrl_instance.mrl_cfg.redis_index); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_INDEX,&(mrl_instance.mrl_cfg.redis_index), sizeof(mrl_instance.mrl_cfg.redis_index)); + 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); + } + Maat_plugin_table(feather,IR_NOMINEE_IP_TABLE_NAME,NULL,nominee_update_cb,NULL,NULL); + //Maat_plugin_table(feather,IR_DNAT_POLICY_TABLE_NAME,NULL,dnat_policy_update_cb,NULL,NULL); + return feather; +} + +int mrl_get_candidate_location(const char *ip_addr) +{ + const char *mycountry="China"; + int location = 0; + location = mrl_search_ip_country(mrl_instance.mrl_mmdb, ip_addr, mycountry); + if(location < 0) + { + MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_get_candidate_location","cur ip addr %s not exist in mmdb",ip_addr); + return 0; + } + return location; +} +void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct mrl_nominee_item *nominee_item) +{ + candidate_item->config_id = nominee_item->config_id; + candidate_item->addr_pool_id= nominee_item->addr_pool_id; + candidate_item->addr_type = MRL_IPV4_TYPE ; + memcpy(candidate_item->ip_addr,nominee_item->ip_addr,strlen(nominee_item->ip_addr)); + candidate_item->location = mrl_get_candidate_location(candidate_item->ip_addr); + memcpy(candidate_item->mrl_ip, mrl_instance.mrl_cfg.mrl_ip,strlen(mrl_instance.mrl_cfg.mrl_ip)); + candidate_item->is_valid = 1; + memcpy(candidate_item->effective_range, nominee_item->effective_range, strlen(nominee_item->effective_range)); + get_cur_time(candidate_item->op_time); +} + + + long ht_search_cb(void *data, const uchar *key, uint size, void *user_arg) { struct mrl_nominee_item *nominee_item = (struct mrl_nominee_item *)data; @@ -243,21 +253,45 @@ long ht_search_cb(void *data, const uchar *key, uint size, void *user_arg) return 1; } +int mrl_get_link_id_index(int gdev_index, int link_id) +{ + int position = -1; + unsigned int i = 0; + for(;i < mrl_instance.mrl_cfg.vxlan_link_id_num;i++) + { + if(mrl_instance.mrl_cfg.vxlan_link_id[gdev_index][i] == link_id) + { + position = i; + break; + } + } + return position; +} -void mrl_get_vxlan_info(struct mrl_vxlan_info *vxlan, unsigned int index) +void mrl_get_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_info *vxlan_info, unsigned int gdev_index) { - memcpy(vxlan->vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smac[index],strlen(mrl_instance.mrl_cfg.vxlan_inner_smac[index])); - memcpy(vxlan->vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmac[index], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmac[index])); - vxlan->vxlan_encap_type = atoi(mrl_instance.mrl_cfg.vxlan_encap_type[index]); - vxlan->vxlan_vpn_id= atoi(mrl_instance.mrl_cfg.vxlan_vpn_id[index]); - vxlan->vxlan_link_id = atoi(mrl_instance.mrl_cfg.vxlan_link_id[index]); - vxlan->vxlan_link_dir = atoi(mrl_instance.mrl_cfg.vxlan_link_dir[index]); - memcpy(vxlan->vxlan_outer_local_port, mrl_instance.mrl_cfg.xvlan_outer_local_port,strlen(mrl_instance.mrl_cfg.xvlan_outer_local_port)); - memcpy(vxlan->vxlan_outer_gdev_port , mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index])); - memcpy(vxlan->vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip)); - memcpy(vxlan->vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index])); - memcpy(vxlan->vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_local_mac,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_mac)); - memcpy(vxlan->vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index])); + int link_id = 0; + memcpy(vxlan_info->vxlan_outer_local_port, mrl_instance.mrl_cfg.xvlan_outer_local_port,strlen(mrl_instance.mrl_cfg.xvlan_outer_local_port)); + memcpy(vxlan_info->vxlan_outer_gdev_port , mrl_instance.mrl_cfg.vxlan_outer_gdev_port[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[gdev_index])); + memcpy(vxlan_info->vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip)); + memcpy(vxlan_info->vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[gdev_index])); + memcpy(vxlan_info->vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_local_mac,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_mac)); + memcpy(vxlan_info->vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[gdev_index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[gdev_index])); + get_rawpkt_opt_from_streaminfo(mystream, RAW_PKT_GET_VXLAN_ID, &link_id); + vxlan_info->vxlan_link_id = ntohl(link_id); + printf("cur link id is %d\n",vxlan_info->vxlan_link_id); + int position = mrl_get_link_id_index(gdev_index, vxlan_info->vxlan_link_id); + if(position <0) + { + MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_get_vxlan_info","mrl_get_link_id_index error,link id is %d,gdev index is %d,position is %d",vxlan_info->vxlan_link_id,gdev_index,position); + assert(0); + } + + vxlan_info->vxlan_encap_type = mrl_instance.mrl_cfg.vxlan_encap_type[gdev_index][position]; + vxlan_info->vxlan_vpn_id= mrl_instance.mrl_cfg.vxlan_vpn_id[gdev_index][position]; + vxlan_info->vxlan_link_dir = mrl_instance.mrl_cfg.vxlan_link_dir[gdev_index][position]; + memcpy(vxlan_info->vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smac[gdev_index][position],strlen(mrl_instance.mrl_cfg.vxlan_inner_smac[gdev_index][position])); + memcpy(vxlan_info->vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmac[gdev_index][position], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmac[gdev_index][position])); } @@ -272,8 +306,8 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid line_rule.label_id=0; line_rule.rule_id=candidate_item->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%s\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s", - candidate_item->config_id, candidate_item->group_id,candidate_item->addr_type, + snprintf(table_line,sizeof(table_line),"%d\t%d\t%d\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s", + candidate_item->config_id, candidate_item->addr_pool_id,candidate_item->addr_type, candidate_item->ip_addr,candidate_item->location, candidate_item->mrl_ip, candidate_item->vxlan_info.vxlan_link_id,candidate_item->vxlan_info.vxlan_encap_type, candidate_item->vxlan_info.vxlan_link_dir,candidate_item->vxlan_info.vxlan_vpn_id, @@ -281,7 +315,7 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid candidate_item->vxlan_info.vxlan_outer_local_ip,candidate_item->vxlan_info.vxlan_outer_gdev_ip, candidate_item->vxlan_info.vxlan_outer_local_mac,candidate_item->vxlan_info.vxlan_outer_gdev_mac, candidate_item->vxlan_info.vxlan_inner_smac,candidate_item->vxlan_info.vxlan_inner_dmac, - candidate_item->is_vaild, candidate_item->op_time); + candidate_item->is_valid, candidate_item->effective_range, candidate_item->op_time); line_rule.table_line=table_line; line_rule.expire_after=0; p_line = &line_rule; @@ -293,8 +327,8 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"Maat_set_cmd_line","maat set candidate item:" "config_id:%d,group_id:%d,addr_type:%d,ip_addr:%s,location:%d,mrl_ip:%s,link_id:%d,encap_type:%d," "link_dir:%d,vpn_id:%d,local_port:%s,gdev_port:%s, local_ip:%s,gdev_ip:%s,local_mac:%s, gdev_mac:%s," - "inner_smac:%s, inner_dmac:%s,is_vaild:%d,op_time:%s", - candidate_item->config_id, candidate_item->group_id,candidate_item->addr_type, candidate_item->ip_addr, + "inner_smac:%s, inner_dmac:%s,is_valid:%d,effective_range:%s,op_time:%s", + candidate_item->config_id, candidate_item->addr_pool_id,candidate_item->addr_type, candidate_item->ip_addr, candidate_item->location, candidate_item->mrl_ip,candidate_item->vxlan_info.vxlan_link_id, candidate_item->vxlan_info.vxlan_encap_type, candidate_item->vxlan_info.vxlan_link_dir, candidate_item->vxlan_info.vxlan_vpn_id, @@ -302,7 +336,7 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid candidate_item->vxlan_info.vxlan_outer_local_ip,candidate_item->vxlan_info.vxlan_outer_gdev_ip, candidate_item->vxlan_info.vxlan_outer_local_mac,candidate_item->vxlan_info.vxlan_outer_gdev_mac, candidate_item->vxlan_info.vxlan_inner_smac, candidate_item->vxlan_info.vxlan_inner_dmac, - candidate_item->is_vaild,candidate_item->op_time); + candidate_item->is_valid,candidate_item->effective_range,candidate_item->op_time); return; } @@ -346,7 +380,7 @@ bool mrl_identify_nominee(struct streaminfo *mystream) get_rawpkt_opt_from_streaminfo(mystream, RAW_PKT_GET_GDEV_IP, &(gdev_ip)); index = get_gdev_ip_index(gdev_ip); assert(index < mrl_instance.mrl_cfg.vxlan_gdev_num);//ھ˵ݰGDEV̽GDEVУ - mrl_get_vxlan_info(&(candidate_item.vxlan_info),index); + mrl_get_vxlan_info(mystream, &(candidate_item.vxlan_info),index); Maat_set_cmd_line(mrl_instance.mrl_feather,&candidate_item); return true; } @@ -356,26 +390,3 @@ bool mrl_identify_nominee(struct streaminfo *mystream) } } -void Maat_set_nominee_cmd_line(Maat_feather_t feather, struct mrl_nominee_item *nominee_item) -{ - printf("start to insert %s to nominee table\n",nominee_item->ip_addr); - const struct Maat_line_t *p_line; - 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=nominee_item->config_id; - line_rule.table_name=IR_NOMINEE_IP_TABLE_NAME; - snprintf(table_line,sizeof(table_line),"%d\t%d\t%d\t%s\t%d\t%s", - nominee_item->config_id, nominee_item->group_id,nominee_item->addr_type, - nominee_item->ip_addr,nominee_item->is_vaild, nominee_item->op_time); - line_rule.table_line=table_line; - line_rule.expire_after=0; - p_line = &line_rule; - ret=Maat_cmd_set_lines(feather, &p_line, 1, MAAT_OP_ADD); - assert(ret>0); - return; -} - -- cgit v1.2.3